Skip to content

[BUG] Regression: Failed to map card[0], port analog-output-speaker to a stream #132

@jmickelin

Description

@jmickelin

Describe the bug

This seems to be a regression introduced by 5fb737c.

I can no longer switch output ports when the ports reside in different profiles. The error I get is as follows (I have added some extra debugging lines to showcase what happens):

[...]
DEBUG    .activate_port(0, analog-output-speaker)
INFO     # Card[0], port `analog-output-speaker` selected
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-speaker, stream.ports = ['hdmi-output-0']
DEBUG      * stream: None
DEBUG    * Switching card[0] to profile `output:analog-stereo+input:analog-stereo` with priority 39333
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-speaker, stream.ports = ['hdmi-output-0']
DEBUG      * stream: None
ERROR    Failed to map card[0], port `analog-output-speaker` to a stream
[...]

To Reproduce
Steps to reproduce the behavior:

  1. Switch between outputs in the systray icon's menu
  2. See error

Expected behavior
Output should be switched correctly.

Desktop (please complete the following information):

  • OS: Fedora 37
  • Desktop environment: i3
  • Sound Switcher Indicator version: 2.3.9
  • Installation source: Source code

Indicator log:

Here is the log. I have included some extra debug lines for context, as follows:

--- indicator-sound-switcher-master/lib/indicator_sound_switcher/indicator.py	2022-06-28 11:41:13.000000000 +0200
+++ /usr/local/lib/python3.11/site-packages/indicator_sound_switcher/indicator.py	2024-03-25 01:41:09.536517195 +0100
@@ -567,6 +567,7 @@
                 selected_profile.name.encode(),
                 self._pacb_context_success,
                 None))
+        self.update_all_pa_items()
         return True
 
     # ------------------------------------------------------------------------------------------------------------------
@@ -885,11 +886,13 @@
 
             # Try to find a matching stream
             stream = card.find_stream_port(port, self.sources, self.sinks)[0]
+            logging.debug('  * stream: %s', stream)
 
             # Switch profile if necessary
             if self.card_switch_profile(port, stream is not None):
                 # Profile is changed: retry searching for the stream
                 stream = card.find_stream_port(port, self.sources, self.sinks)[0]
+                logging.debug('  * stream: %s', stream)
 
             # If no stream found, that's an error
             if stream is None:
--- indicator-sound-switcher-master/lib/indicator_sound_switcher/card.py	2022-06-28 11:41:13.000000000 +0200
+++ /usr/local/lib/python3.11/site-packages/indicator_sound_switcher/card.py	2024-03-25 01:36:01.114521010 +0100
@@ -1,3 +1,4 @@
+import logging
 from gi.repository import GObject
 from . import lib_pulseaudio
 
@@ -57,6 +58,8 @@
         # Try to find a sink/source for this card (by matching card index)
         streams = sinks if card_port.is_output else sources
         for stream in streams.values():
+            logging.debug('.find_stream_port(...)')
+            logging.debug('  * card_port = %s, stream.ports = %s', card_port.name, list(stream.ports.keys()))
             if stream.card_index == self.index:
                 # Found a potential stream. Now try to find a corresponding stream's port (with the matching port name).
                 if card_port.name in stream.ports:

This produces the following:

$ indicator-sound-switcher -vv
INFO     Starting indicator application
INFO     Loaded configuration file /home/jmickelin/.config/indicator-sound-switcher.json
DEBUG    KeyboardManager.bind_keys()
DEBUG      - Bound keyboard shortcut `<Super>apostrophe` to `[('alsa_card.pci-0000_00_1f.3', 'analog-output-speaker'), ('alsa_card.pci-0000_00_1f.3', 'hdmi-output-0')]`
DEBUG    .menu_append_item(): appending item `Inputs`
DEBUG    .menu_append_item(): appending separator
DEBUG    .menu_append_item(): appending item `Outputs`
DEBUG    .menu_append_item(): appending separator
DEBUG    .menu_append_item(): appending item `_Refresh`
DEBUG    .menu_append_item(): appending item `_Preferences…`
DEBUG    .menu_append_item(): appending item `_About`
DEBUG    .menu_append_item(): appending item `_Quit`
DEBUG    Trying to connect to PulseAudio daemon, attempt #1
INFO     Context connected
DEBUG      + Card[0] added: `alsa_card.pci-0000_00_1f.3`, driver: `module-alsa-card.c`
DEBUG        + Card profile added: `input:analog-stereo` (`Analog Stereo Input`), 0 sinks, 1 sources, priority: 32833
DEBUG        + Card profile added: `output:analog-stereo` (`Analog Stereo Output`), 1 sinks, 0 sources, priority: 39268
DEBUG        + Card profile added: `output:analog-stereo+input:analog-stereo` (`Analog Stereo Duplex`), 1 sinks, 1 sources, priority: 39333
DEBUG        + Card profile added: `output:hdmi-stereo` (`Digital Stereo (HDMI) Output`), 1 sinks, 0 sources, priority: 38668
DEBUG        + Card profile added: `output:hdmi-stereo+input:analog-stereo` (`Digital Stereo (HDMI) Output + Analog Stereo Input`), 1 sinks, 1 sources, priority: 38733 -- Active
DEBUG        + Card profile added: `output:hdmi-surround` (`Digital Surround 5.1 (HDMI) Output`), 1 sinks, 0 sources, priority: 33568
DEBUG        + Card profile added: `output:hdmi-surround+input:analog-stereo` (`Digital Surround 5.1 (HDMI) Output + Analog Stereo Input`), 1 sinks, 1 sources, priority: 33633
DEBUG        + Card profile added: `output:hdmi-surround71` (`Digital Surround 7.1 (HDMI) Output`), 1 sinks, 0 sources, priority: 33568
DEBUG        + Card profile added: `output:hdmi-surround71+input:analog-stereo` (`Digital Surround 7.1 (HDMI) Output + Analog Stereo Input`), 1 sinks, 1 sources, priority: 33633
DEBUG        + Card profile added: `output:hdmi-stereo-extra1` (`Digital Stereo (HDMI 2) Output`), 1 sinks, 0 sources, priority: 5700
DEBUG        + Card profile added: `output:hdmi-stereo-extra1+input:analog-stereo` (`Digital Stereo (HDMI 2) Output + Analog Stereo Input`), 1 sinks, 1 sources, priority: 5765
DEBUG        + Card profile added: `output:hdmi-surround-extra1` (`Digital Surround 5.1 (HDMI 2) Output`), 1 sinks, 0 sources, priority: 600
DEBUG        + Card profile added: `output:hdmi-surround-extra1+input:analog-stereo` (`Digital Surround 5.1 (HDMI 2) Output + Analog Stereo Input`), 1 sinks, 1 sources, priority: 665
DEBUG        + Card profile added: `output:hdmi-surround71-extra1` (`Digital Surround 7.1 (HDMI 2) Output`), 1 sinks, 0 sources, priority: 600
DEBUG        + Card profile added: `output:hdmi-surround71-extra1+input:analog-stereo` (`Digital Surround 7.1 (HDMI 2) Output + Analog Stereo Input`), 1 sinks, 1 sources, priority: 665
DEBUG        + Card profile added: `output:hdmi-stereo-extra2` (`Digital Stereo (HDMI 3) Output`), 1 sinks, 0 sources, priority: 5700
DEBUG        + Card profile added: `output:hdmi-stereo-extra2+input:analog-stereo` (`Digital Stereo (HDMI 3) Output + Analog Stereo Input`), 1 sinks, 1 sources, priority: 5765
DEBUG        + Card profile added: `output:hdmi-surround-extra2` (`Digital Surround 5.1 (HDMI 3) Output`), 1 sinks, 0 sources, priority: 600
DEBUG        + Card profile added: `output:hdmi-surround-extra2+input:analog-stereo` (`Digital Surround 5.1 (HDMI 3) Output + Analog Stereo Input`), 1 sinks, 1 sources, priority: 665
DEBUG        + Card profile added: `output:hdmi-surround71-extra2` (`Digital Surround 7.1 (HDMI 3) Output`), 1 sinks, 0 sources, priority: 600
DEBUG        + Card profile added: `output:hdmi-surround71-extra2+input:analog-stereo` (`Digital Surround 7.1 (HDMI 3) Output + Analog Stereo Input`), 1 sinks, 1 sources, priority: 665
DEBUG        + Card profile added: `off` (`Off`), 0 sinks, 0 sources, priority: 0
DEBUG        + Card port added: `analog-input-internal-mic` (`Internal Microphone`); priority: 8900; direction: 2; available: Yes
DEBUG          . Supported profile: `input:analog-stereo`
DEBUG          . Supported profile: `output:analog-stereo+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-stereo+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround71+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-stereo-extra1+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround-extra1+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround71-extra1+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-stereo-extra2+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround-extra2+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround71-extra2+input:analog-stereo`
DEBUG        + Card port added: `analog-input-headphone-mic` (`Microphone`); priority: 8700; direction: 2; available: No
DEBUG          . Supported profile: `input:analog-stereo`
DEBUG          . Supported profile: `output:analog-stereo+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-stereo+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround71+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-stereo-extra1+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround-extra1+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround71-extra1+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-stereo-extra2+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround-extra2+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround71-extra2+input:analog-stereo`
DEBUG        + Card port added: `analog-input-headset-mic` (`Headset Microphone`); priority: 8800; direction: 2; available: No
DEBUG          . Supported profile: `input:analog-stereo`
DEBUG          . Supported profile: `output:analog-stereo+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-stereo+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround71+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-stereo-extra1+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround-extra1+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround71-extra1+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-stereo-extra2+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround-extra2+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround71-extra2+input:analog-stereo`
DEBUG        + Card port added: `analog-output-speaker` (`Speakers`); priority: 10000; direction: 1; available: Yes
DEBUG          . Supported profile: `output:analog-stereo`
DEBUG          . Supported profile: `output:analog-stereo+input:analog-stereo`
DEBUG        + Card port added: `analog-output-headphones` (`Headphones`); priority: 9900; direction: 1; available: No
DEBUG          . Supported profile: `output:analog-stereo`
DEBUG          . Supported profile: `output:analog-stereo+input:analog-stereo`
DEBUG        + Card port added: `hdmi-output-0` (`HDMI / DisplayPort`); priority: 5900; direction: 1; available: Yes
DEBUG          . Supported profile: `output:hdmi-stereo`
DEBUG          . Supported profile: `output:hdmi-stereo+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround`
DEBUG          . Supported profile: `output:hdmi-surround+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround71`
DEBUG          . Supported profile: `output:hdmi-surround71+input:analog-stereo`
DEBUG        + Card port added: `hdmi-output-1` (`HDMI / DisplayPort 2`); priority: 5800; direction: 1; available: No
DEBUG          . Supported profile: `output:hdmi-stereo-extra1`
DEBUG          . Supported profile: `output:hdmi-stereo-extra1+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround-extra1`
DEBUG          . Supported profile: `output:hdmi-surround-extra1+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround71-extra1`
DEBUG          . Supported profile: `output:hdmi-surround71-extra1+input:analog-stereo`
DEBUG        + Card port added: `hdmi-output-2` (`HDMI / DisplayPort 3`); priority: 5700; direction: 1; available: No
DEBUG          . Supported profile: `output:hdmi-stereo-extra2`
DEBUG          . Supported profile: `output:hdmi-stereo-extra2+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround-extra2`
DEBUG          . Supported profile: `output:hdmi-surround-extra2+input:analog-stereo`
DEBUG          . Supported profile: `output:hdmi-surround71-extra2`
DEBUG          . Supported profile: `output:hdmi-surround71-extra2+input:analog-stereo`
DEBUG    .menu_insert_ordered_item(): inserting item `    Built-in Audio ‣ Internal Microphone` at index 1
DEBUG    .menu_insert_ordered_item(): inserting item `    Built-in Audio ‣ Microphone` at index 2 (hidden)
DEBUG    .menu_insert_ordered_item(): inserting item `    Built-in Audio ‣ Headset Microphone` at index 1 (hidden)
DEBUG    .menu_insert_ordered_item(): inserting item `    Built-in Audio ‣ Speakers` at index 6
DEBUG    .menu_insert_ordered_item(): inserting item `    Built-in Audio ‣ Headphones` at index 6 (hidden)
DEBUG    .menu_insert_ordered_item(): inserting item `    Built-in Audio ‣ HDMI` at index 6
DEBUG    .menu_insert_ordered_item(): inserting item `    Built-in Audio ‣ HDMI / DisplayPort 2` at index 7 (hidden)
DEBUG    .menu_insert_ordered_item(): inserting item `    Built-in Audio ‣ HDMI / DisplayPort 3` at index 8 (hidden)
DEBUG      + Source[1] added: `alsa_input.pci-0000_00_1f.3.analog-stereo`, card 0
DEBUG        + Source port added: `analog-input-internal-mic` (`Internal Microphone`); priority: 8900; available: Yes
DEBUG        + Source port added: `analog-input-headphone-mic` (`Microphone`); priority: 8700; available: No
DEBUG        + Source port added: `analog-input-headset-mic` (`Headset Microphone`); priority: 8800; available: No
DEBUG        * Activated source port `analog-input-internal-mic`
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-internal-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headphone-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headset-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG      + Source output[1] added: `record`
DEBUG      + Source output[2] added: `record`
DEBUG      + Source output[4] added: `record`
DEBUG      + Source output[5] added: `record`
DEBUG      + Source output[6] added: `record`
DEBUG      + Source output[7] added: `record`
DEBUG      + Source output[8] added: `record`
DEBUG      + Sink[330] added: `alsa_output.pci-0000_00_1f.3.hdmi-stereo`, card 0
DEBUG        + Sink port added: `hdmi-output-0` (`HDMI / DisplayPort`); priority: 5900; available: Yes
DEBUG        * Activated sink port `hdmi-output-0`
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-internal-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headphone-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headset-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-speaker, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-headphones, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-0, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-1, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-2, stream.ports = ['hdmi-output-0']
DEBUG      + Sink input[1] added: `playback` -> sink 330
DEBUG      + Sink input[2] added: `playback` -> sink 330
DEBUG      + Sink input[4] added: `playback` -> sink 330
DEBUG      + Sink input[5] added: `playback` -> sink 330
DEBUG      + Sink input[6] added: `playback` -> sink 330
DEBUG      + Sink input[7] added: `playback` -> sink 330
DEBUG      + Sink input[8] added: `playback` -> sink 330
DEBUG    * Activated sink: `alsa_output.pci-0000_00_1f.3.hdmi-stereo`
DEBUG    * Activated source: `alsa_input.pci-0000_00_1f.3.analog-stereo`
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-internal-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headphone-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headset-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-speaker, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-headphones, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-0, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-1, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-2, stream.ports = ['hdmi-output-0']

(indicator-sound-switcher:2573642): Gdk-CRITICAL **: 01:39:16.749: gdk_window_thaw_toplevel_updates: assertion 'window->update_and_descendants_freeze_count > 0' failed
DEBUG    .activate_port(0, analog-output-speaker)
INFO     # Card[0], port `analog-output-speaker` selected
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-speaker, stream.ports = ['hdmi-output-0']
DEBUG      * stream: None
DEBUG    * Switching card[0] to profile `output:analog-stereo+input:analog-stereo` with priority 39333
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-speaker, stream.ports = ['hdmi-output-0']
DEBUG      * stream: None
ERROR    Failed to map card[0], port `analog-output-speaker` to a stream
DEBUG    .do_context_subscribe(facility: 7, kind: 16, index: 4294967295)
DEBUG    * Activated sink: `alsa_output.pci-0000_00_1f.3.analog-stereo`
DEBUG    * Activated source: `alsa_input.pci-0000_00_1f.3.analog-stereo`
DEBUG    .do_context_subscribe(facility: 1, kind: 32, index: 331)
DEBUG    .do_context_subscribe(facility: 0, kind: 32, index: 330)
DEBUG      - Sink[330] removed: `alsa_output.pci-0000_00_1f.3.hdmi-stereo`
DEBUG    .do_context_subscribe(facility: 0, kind: 16, index: 332)
DEBUG      + Sink[332] added: `alsa_output.pci-0000_00_1f.3.analog-stereo`, card 0
DEBUG        + Sink port added: `analog-output-speaker` (`Speakers`); priority: 10000; available: Yes
DEBUG        + Sink port added: `analog-output-headphones` (`Headphones`); priority: 9900; available: No
DEBUG        * Activated sink port `analog-output-speaker`
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-internal-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headphone-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headset-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-speaker, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-headphones, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-0, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-1, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-2, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG    .do_context_subscribe(facility: 1, kind: 16, index: 333)
DEBUG    .do_context_subscribe(facility: 1, kind: 0, index: 333)
DEBUG    .do_context_subscribe(facility: 0, kind: 0, index: 332)
DEBUG      * Sink[332] updated: `alsa_output.pci-0000_00_1f.3.analog-stereo`, card 0
DEBUG        * Activated sink port `analog-output-speaker`
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-internal-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headphone-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headset-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-speaker, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-headphones, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-0, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-1, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-2, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG    .do_context_subscribe(facility: 2, kind: 16, index: 1)
DEBUG    .do_context_subscribe(facility: 2, kind: 16, index: 2)
DEBUG    .do_context_subscribe(facility: 2, kind: 16, index: 4)
DEBUG    .do_context_subscribe(facility: 2, kind: 16, index: 5)
DEBUG    .do_context_subscribe(facility: 2, kind: 16, index: 6)
DEBUG    .do_context_subscribe(facility: 2, kind: 16, index: 7)
DEBUG    .do_context_subscribe(facility: 2, kind: 16, index: 8)
DEBUG    .do_context_subscribe(facility: 9, kind: 16, index: 0)
DEBUG      * Card[0] updated
DEBUG        * Activated profile: `output:analog-stereo+input:analog-stereo` (`Analog Stereo Duplex`)
DEBUG    .do_context_subscribe(facility: 1, kind: 32, index: 332)
DEBUG    .do_context_subscribe(facility: 0, kind: 32, index: 331)
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-internal-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headphone-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headset-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-speaker, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-headphones, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-0, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-1, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-2, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG    .activate_port(0, hdmi-output-0)
INFO     # Card[0], port `hdmi-output-0` selected
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-0, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG      * stream: None
DEBUG    * Switching card[0] to profile `output:hdmi-stereo+input:analog-stereo` with priority 38733
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-0, stream.ports = ['analog-output-speaker', 'analog-output-headphones']
DEBUG      * stream: None
ERROR    Failed to map card[0], port `hdmi-output-0` to a stream
DEBUG    .do_context_subscribe(facility: 7, kind: 16, index: 4294967295)
DEBUG    * Activated sink: `alsa_output.pci-0000_00_1f.3.hdmi-stereo`
DEBUG    * Activated source: `alsa_input.pci-0000_00_1f.3.analog-stereo`
DEBUG    .do_context_subscribe(facility: 1, kind: 32, index: 333)
DEBUG    .do_context_subscribe(facility: 0, kind: 32, index: 332)
DEBUG      - Sink[332] removed: `alsa_output.pci-0000_00_1f.3.analog-stereo`
DEBUG    .do_context_subscribe(facility: 0, kind: 16, index: 334)
DEBUG      + Sink[334] added: `alsa_output.pci-0000_00_1f.3.hdmi-stereo`, card 0
DEBUG        + Sink port added: `hdmi-output-0` (`HDMI / DisplayPort`); priority: 5900; available: Yes
DEBUG        * Activated sink port `hdmi-output-0`
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-internal-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headphone-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headset-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-speaker, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-headphones, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-0, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-1, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-2, stream.ports = ['hdmi-output-0']
DEBUG    .do_context_subscribe(facility: 1, kind: 16, index: 335)
DEBUG    .do_context_subscribe(facility: 1, kind: 0, index: 335)
DEBUG    .do_context_subscribe(facility: 0, kind: 0, index: 334)
DEBUG      * Sink[334] updated: `alsa_output.pci-0000_00_1f.3.hdmi-stereo`, card 0
DEBUG        * Activated sink port `hdmi-output-0`
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-internal-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headphone-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headset-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-speaker, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-headphones, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-0, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-1, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-2, stream.ports = ['hdmi-output-0']
DEBUG    .do_context_subscribe(facility: 2, kind: 16, index: 1)
DEBUG    .do_context_subscribe(facility: 2, kind: 16, index: 2)
DEBUG    .do_context_subscribe(facility: 2, kind: 16, index: 4)
DEBUG    .do_context_subscribe(facility: 2, kind: 16, index: 5)
DEBUG    .do_context_subscribe(facility: 2, kind: 16, index: 6)
DEBUG    .do_context_subscribe(facility: 2, kind: 16, index: 7)
DEBUG    .do_context_subscribe(facility: 2, kind: 16, index: 8)
DEBUG    .do_context_subscribe(facility: 9, kind: 16, index: 0)
DEBUG      * Card[0] updated
DEBUG        * Activated profile: `output:hdmi-stereo+input:analog-stereo` (`Digital Stereo (HDMI) Output + Analog Stereo Input`)
DEBUG    .do_context_subscribe(facility: 1, kind: 32, index: 334)
DEBUG    .do_context_subscribe(facility: 0, kind: 32, index: 333)
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-internal-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headphone-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-input-headset-mic, stream.ports = ['analog-input-internal-mic', 'analog-input-headphone-mic', 'analog-input-headset-mic']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-speaker, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = analog-output-headphones, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-0, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-1, stream.ports = ['hdmi-output-0']
DEBUG    .find_stream_port(...)
DEBUG      * card_port = hdmi-output-2, stream.ports = ['hdmi-output-0']

Analysis
The problem seems to be that my computer's sound card only lists the ports in question when the corresponding profiles are active. That is, hdmi-output-0 is only active when a profile like output:hdmi-stereo+input:analog-stereo is active, and conversely analog-output-speaker and analog-output-headphones are only available when output:analog-stereo+input:analog-stereo is active.

This already seems to be what was addressed by 5fb737c, with these lines:

            # Try to find a matching stream
            stream = card.find_stream_port(port, self.sources, self.sinks)[0]

            # Switch profile if necessary
            if self.card_switch_profile(port, stream is not None):
                # Profile is changed: retry searching for the stream
                stream = card.find_stream_port(port, self.sources, self.sinks)[0]

However, as shown by the logging I added to card.find_stream_port, the contents of self.sinks is never updated after switching profile! This stale information of course causes the second lookup to fail, just like the first one did.

It seems prudent to force a refresh of the Pulseaudio data from within card_switch_profile. I have confirmed that adding the following in that function resolves the issue:

--- indicator-sound-switcher-master/lib/indicator_sound_switcher/indicator.py	2022-06-28 11:41:13.000000000 +0200
+++ /usr/local/lib/python3.11/site-packages/indicator_sound_switcher/indicator.py	2024-03-25 02:03:06.654038395 +0100
@@ -567,6 +567,8 @@
                 selected_profile.name.encode(),
                 self._pacb_context_success,
                 None))
+        self.update_all_pa_items()
+
         return True
 
     # ------------------------------------------------------------------------------------------------------------------

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions