[alsa-devel] [PATCH] plug: Move fast_ops copy after slave configuration.
The plug plugin copies the fast_ops structure and fast_op_arg from its slave PCM on initialization and after inserting a new plugin. This works unless the slave PCM is also an instance of the plug plugin because plug can change its fast_ops structure during _snd_pcm_hw_params.
Instead of copying fast_ops in snd_pcm_plug_insert_plugins wait until the end of snd_pcm_plug_hw_params when the slave has been fully initialized.
This fixes a crash when two instances of plug are instantiated back to back and the format conversion plugin inserted by the second is skipped by the first because the fast_ops pointer is not properly updated. This is the case for applications requesting plug:default on Intel HDA chips. --- src/pcm/pcm_plug.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/pcm/pcm_plug.c b/src/pcm/pcm_plug.c index e9d2923..72456d5 100644 --- a/src/pcm/pcm_plug.c +++ b/src/pcm/pcm_plug.c @@ -659,8 +659,6 @@ static int snd_pcm_plug_insert_plugins(snd_pcm_t *pcm, } if (err) { plug->gen.slave = new; - pcm->fast_ops = new->fast_ops; - pcm->fast_op_arg = new->fast_op_arg; } k++; } @@ -1049,6 +1047,9 @@ static int snd_pcm_plug_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params) } snd_pcm_unlink_hw_ptr(pcm, plug->req_slave); snd_pcm_unlink_appl_ptr(pcm, plug->req_slave); + + pcm->fast_ops = slave->fast_ops; + pcm->fast_op_arg = slave->fast_op_arg; snd_pcm_link_hw_ptr(pcm, slave); snd_pcm_link_appl_ptr(pcm, slave); return 0;
2011/12/12 Reilly Grant reillyeon@qotw.net:
This fixes a crash when two instances of plug are instantiated back to back and the format conversion plugin inserted by the second is skipped by the first because the fast_ops pointer is not properly updated. This is the case for applications requesting plug:default on Intel HDA chips.
The card 's "default" device of snd-hda-intel should be "plug:dmix"
you don't need to use "plug:default"
http://git.alsa-project.org/?p=alsa-lib.git;a=blob_plain;f=src/conf/cards/HD...
# default with dmix+softvol & dsnoop HDA-Intel.pcm.default { @args [ CARD ] @args.CARD { type string } type asym playback.pcm { type plug slave.pcm { type softvol slave.pcm { @func concat strings [ "dmix:" $CARD ] } control { name "PCM Playback Volume" card $CARD } } } capture.pcm { type plug slave.pcm { type softvol slave.pcm { @func concat strings [ "dsnoop:" $CARD ] } control { name "Digital Capture Volume" card $CARD } min_dB -30.0 max_dB 30.0 resolution 121 } # to avoid possible phase inversions with digital mics route_policy copy } hint.device 0 }
Some applications do it anyways. I assume because not all drivers include plug in their default device. Whether or not they are wrong the library shouldn't crash because of it, especially since they could be passing this configuration through from user input.
~ Reilly
On 12/11/2011 04:18 PM, Raymond Yau wrote:
2011/12/12 Reilly Grant reillyeon@qotw.net:
This fixes a crash when two instances of plug are instantiated back to back and the format conversion plugin inserted by the second is skipped by the first because the fast_ops pointer is not properly updated. This is the case for applications requesting plug:default on Intel HDA chips.
The card 's "default" device of snd-hda-intel should be "plug:dmix"
you don't need to use "plug:default"
http://git.alsa-project.org/?p=alsa-lib.git;a=blob_plain;f=src/conf/cards/HD...
# default with dmix+softvol & dsnoop HDA-Intel.pcm.default { @args [ CARD ] @args.CARD { type string } type asym playback.pcm { type plug slave.pcm { type softvol slave.pcm { @func concat strings [ "dmix:" $CARD ] } control { name "PCM Playback Volume" card $CARD } } } capture.pcm { type plug slave.pcm { type softvol slave.pcm { @func concat strings [ "dsnoop:" $CARD ] } control { name "Digital Capture Volume" card $CARD } min_dB -30.0 max_dB 30.0 resolution 121 } # to avoid possible phase inversions with digital mics route_policy copy } hint.device 0 } _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
participants (2)
-
Raymond Yau
-
Reilly Grant