summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@perex.cz>2022-11-14 14:34:46 +0100
committerJaroslav Kysela <perex@perex.cz>2022-11-14 14:39:26 +0100
commit425e4d1fbea4965ea0fb7529b1ee6cbb47eb7227 (patch)
tree5a9f819a92bb8dd974f51b890fa8ffedb7424428
parent78b20e3caa7bba930095e05f3f8cbe665204fcfd (diff)
downloadalsa-lib-425e4d1fbea4965ea0fb7529b1ee6cbb47eb7227.tar.gz
pcm: fix the fast_ops pcm argument for fast_ops
The fast_ops callback invocation must always pass the fast_op_arg as the pcm argument. Plugins expect that. Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r--src/pcm/pcm.c4
-rw-r--r--src/pcm/pcm_direct.c2
-rw-r--r--src/pcm/pcm_hw.c2
-rw-r--r--src/pcm/pcm_multi.c5
4 files changed, 7 insertions, 6 deletions
diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c
index 927aa055..2b966d44 100644
--- a/src/pcm/pcm.c
+++ b/src/pcm/pcm.c
@@ -1705,7 +1705,7 @@ int snd_pcm_link(snd_pcm_t *pcm1, snd_pcm_t *pcm2)
assert(pcm1);
assert(pcm2);
if (pcm1->fast_ops->link)
- err = pcm1->fast_ops->link(pcm1, pcm2);
+ err = pcm1->fast_ops->link(pcm1->fast_op_arg, pcm2);
else
err = -ENOSYS;
return err;
@@ -1722,7 +1722,7 @@ int snd_pcm_unlink(snd_pcm_t *pcm)
assert(pcm);
if (pcm->fast_ops->unlink)
- err = pcm->fast_ops->unlink(pcm);
+ err = pcm->fast_ops->unlink(pcm->fast_op_arg);
else
err = -ENOSYS;
return err;
diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c
index 4803b81b..3cc5305f 100644
--- a/src/pcm/pcm_direct.c
+++ b/src/pcm/pcm_direct.c
@@ -688,7 +688,7 @@ int snd_pcm_direct_check_xrun(snd_pcm_direct_t *direct, snd_pcm_t *pcm)
* so don't increment but just update to actual counter
*/
direct->recoveries = direct->shmptr->s.recoveries;
- pcm->fast_ops->drop(pcm);
+ pcm->fast_ops->drop(pcm->fast_op_arg);
/* trigger_tstamp update is missing in drop callbacks */
gettimestamp(&direct->trigger_tstamp, pcm->tstamp_type);
/* no timer clear:
diff --git a/src/pcm/pcm_hw.c b/src/pcm/pcm_hw.c
index 5dfe32ee..0588ce5e 100644
--- a/src/pcm/pcm_hw.c
+++ b/src/pcm/pcm_hw.c
@@ -838,7 +838,7 @@ static int snd_pcm_hw_link(snd_pcm_t *pcm1, snd_pcm_t *pcm2)
{
if (pcm2->type != SND_PCM_TYPE_HW) {
if (pcm2->fast_ops->link_slaves)
- return pcm2->fast_ops->link_slaves(pcm2, pcm1);
+ return pcm2->fast_ops->link_slaves(pcm2->fast_op_arg, pcm1);
return -ENOSYS;
}
return hw_link(pcm1, pcm2);
diff --git a/src/pcm/pcm_multi.c b/src/pcm/pcm_multi.c
index bec6d06f..3e7ce82c 100644
--- a/src/pcm/pcm_multi.c
+++ b/src/pcm/pcm_multi.c
@@ -759,8 +759,9 @@ static int snd_pcm_multi_link_slaves(snd_pcm_t *pcm, snd_pcm_t *master)
static int snd_pcm_multi_link(snd_pcm_t *pcm1, snd_pcm_t *pcm2)
{
snd_pcm_multi_t *multi = pcm1->private_data;
- if (multi->slaves[0].pcm->fast_ops->link)
- return multi->slaves[0].pcm->fast_ops->link(multi->slaves[0].pcm, pcm2);
+ snd_pcm_t *main_pcm = multi->slaves[0].pcm;
+ if (main_pcm->fast_ops->link)
+ return main_pcm->fast_ops->link(main_pcm->fast_op_arg, pcm2);
return -ENOSYS;
}