mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-03 09:01:50 -05:00
alsa-sink/source: set volume to hw immediately if ucm_port changing
Recently we found an issue of output volume on speaker and headphone, they should have their own volume but in practice they share one output volume. This issue happens on the laptops which use the ucm2 sof-hda-dsp, originally the speaker has output volume A while the headphone has the output volume B, suppose the speaker is the active port at the moment and the output volume is A, users plug a headphone to the jack and the headphone becomes the active port, in this process, ucm_set_port() calls _disdev/_enadev which triggers the io_mixer_callback(), in the meanwhile, the module_device_restore will restore the headphone's volume to B, it will call set_volume_cb() to set the volume to B, but this value is not written to hw immediately, during the time of waiting for the B to be written to the hw, the io_mixer_callback() calls get_volume_cb(), it reads hw volume and gets the volume A, then it overrides the output volume to A, this results in the headphone gets the volume A instead of B. If a machine doesn't use the ucm, this issue will not happen since the set_port_cb() will not trigger the io_mixer_callback(). If the ports don't belong to the same sink/source, this issue also doesn't happen. BugLink: http://bugs.launchpad.net/bugs/1930188 Signed-off-by: Hui Wang <hui.wang@canonical.com> Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/577>
This commit is contained in:
parent
ce962563eb
commit
36fcfeb211
6 changed files with 28 additions and 2 deletions
|
|
@ -106,6 +106,7 @@ struct pa_source {
|
|||
bool save_port:1;
|
||||
bool save_volume:1;
|
||||
bool save_muted:1;
|
||||
bool port_changing:1;
|
||||
|
||||
/* Saved volume state while we're in passthrough mode */
|
||||
pa_cvolume saved_volume;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue