summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@perex.cz>2022-11-09 09:31:34 +0100
committerJaroslav Kysela <perex@perex.cz>2022-11-09 09:35:05 +0100
commit39060852d810461dc8cd1464cfb2ffe84da42d56 (patch)
tree9bff3ef137573a3b3173b56322cf3ffbb284bb67
parentaa4f56c3c952269c36464cc0da9db5a1381648fa (diff)
downloadalsa-lib-39060852d810461dc8cd1464cfb2ffe84da42d56.tar.gz
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 <perex@perex.cz>
-rw-r--r--src/pcm/pcm_local.h2
-rw-r--r--src/pcm/pcm_plugin.c10
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;