plug: Move fast_ops copy after slave configuration.
PATCH 1/1 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(-)
src/pcm/pcm_plug.c +0 -2
@@ -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;
Signature · 1 line
1.7.3.4
2011/12/12 Reilly Grant <[email protected]>:
Quoted 5 lines
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_opspointer 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/HDA-Intel.conf
# 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
Quoted 61 lines · Raymond Yau
2011/12/12 Reilly Grant <[email protected]>:
Quoted 5 lines
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_opspointer 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/HDA-Intel.conf
# 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 [email protected] http://mailman.alsa-project.org/mailman/listinfo/alsa-devel