Audio APP (sink-input) bind to the sink with only unplugged hdmi-audio ports on it
Recently we found a weird issue on many laptops with the ubuntu 18.04, it uses the pulseaudio-11.1 (I guess the latest version also has this problem). The issue is like this:
- boot the system up without plugging a hdmi monitor
- run an audio app to play sound (e.g. $speaker-test)
- the sound outputs from analog-speaker
- plug a monitor with audio capability (through DP or HDMI port)
- the sound still outputs from analog-speaker
- open sound-setting (gnome-control-center --> choose sound), you will see two output devies: speaker and HDMI audio
- choose HDMI audio, the sound will switch to HDIM audio from speaker (pa will remember speaker-test prefer to use hdmi-audio sink)
- unplug the monitor, the default-sink is switching to analog-speaker, but the sound of speaker-test still route to hdmi-audio sink
- run other sound apps, they all route sound to default sink (analog-speaker), but speaker-test always routes to hdmi-audio sink, as a result, speaker-test can't output sound anymore unless we replug a monitor with audio capability then the speaker-test output from hdmi-audio again.
- if we want the speaker-test to route to analog-speaker, two ways: run pacmd move-sink-input or plug a monitor, after two audio devices (hdmi audio and speaker) show up in the sound-setting, select analog-speaker manually.
This issue only happens on the laptops with 2 audio cards, analog devices on one card, hdmi audio on the other card. This kind of laptops are very common, like I+A (Intel graphic + Amd Graphic), I+N(Intel + Nvidia), and A AMD.
This issue will not happen on the laptops with only Intel graphic card, since both analog and hdmi audio belong to one sound card. When hdmi monitor is unplugged, the hdmi sink will be removed from PA, then all sink-inputs will route to the only left sink: analog-sink.
This issue will not happen on BT or USB audio. Unlike hdmi audio, BT and USB audio cards will be removed totally from PA when they are unpluged/unconnected, so they don't have this issue as well.
The root cause of this issue is although the hdmi monitor is unplugged, the hdmi-sink still exists, and sink-input is selected by user to bind to this sink, so the pa doesn't care about if this sink has valid port or not, it bind the sink-input to this sink unconditionally.
Maybe we could improve it like this: if the user selected sink only has available_no ports, the pa will switch all sink-inputs of this sink to other sinks (like default_sink) temporarily, once the selected sink has availble ports, all sink-inputs switch back to this sink.