From 39060852d810461dc8cd1464cfb2ffe84da42d56 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 9 Nov 2022 09:31:34 +0100 Subject: pcm: rate - correct the previous fix for snd_pcm_rate_may_wait_for_avail_min() The previous fix in aa4f56c3 was not correct. The root of the cause is implementation in snd_pcm_may_wait_for_avail_min() inline function where the improper pcm argument is passed to the fast_ops function. Fixes: aa4f56c3 ("pcm: rate - fix the crash in snd_pcm_rate_may_wait_for_avail_min()") Fixes: d9dbb57b ("pcm: rate - rewrite the may_wait_for_avail_min callback for the rate plugin") Signed-off-by: Jaroslav Kysela --- src/pcm/pcm_local.h | 2 +- src/pcm/pcm_plugin.c | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/pcm/pcm_local.h b/src/pcm/pcm_local.h index 8d25971f..ae0c44bf 100644 --- a/src/pcm/pcm_local.h +++ b/src/pcm/pcm_local.h @@ -1144,7 +1144,7 @@ static inline int snd_pcm_may_wait_for_avail_min(snd_pcm_t *pcm, snd_pcm_uframes if (avail >= pcm->avail_min) return 0; if (pcm->fast_ops->may_wait_for_avail_min) - return pcm->fast_ops->may_wait_for_avail_min(pcm, avail); + return pcm->fast_ops->may_wait_for_avail_min(pcm->fast_op_arg, avail); return 1; } diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c index ec64604c..b3af1fb7 100644 --- a/src/pcm/pcm_plugin.c +++ b/src/pcm/pcm_plugin.c @@ -597,8 +597,12 @@ int snd_pcm_plugin_may_wait_for_avail_min_conv( * a) the slave can provide contineous hw_ptr between periods * b) avail_min does not match one slave_period */ - snd_pcm_plugin_t *plugin = pcm->private_data; - snd_pcm_t *slave = plugin->gen.slave; + snd_pcm_generic_t *generic = pcm->private_data; + /* + * do not use snd_pcm_plugin_t pointer here + * this code is used from the generic plugins, too + */ + snd_pcm_t *slave = generic->slave; snd_pcm_uframes_t needed_slave_avail_min; snd_pcm_sframes_t available; @@ -622,7 +626,7 @@ int snd_pcm_plugin_may_wait_for_avail_min_conv( * This code is also used by extplug, but extplug does not allow to alter the sampling rate. */ if (conv) - needed_slave_avail_min = conv(pcm->fast_op_arg, needed_slave_avail_min); + needed_slave_avail_min = conv(pcm, needed_slave_avail_min); if (slave->avail_min != needed_slave_avail_min) { snd_pcm_sw_params_t *swparams; -- cgit v1.2.1