Skip to content

Conversation

@mmstick
Copy link
Member

@mmstick mmstick commented Oct 20, 2025

Closes #1325
Closes #1577
Closes pop-os/cosmic-epoch#655
Closes pop-os/cosmic-epoch#787
Closes pop-os/cosmic-epoch#946
Closes pop-os/cosmic-epoch#1001
Closes pop-os/cosmic-epoch#568
Closes pop-os/cosmic-epoch#1368

  • Device profiles have been moved into a new Device Profiles sub-page for selecting profiles per device
    • Set with wpctl set-profile {{device-id}} {profile-index}} instead of pactl
  • Setting the default sink (output) and source (input) now operates independently
    • Set with wpctl set-default {{node-id}}
  • All of our devices now have stable node object and device IDs from pipewire-rs
    - Enables using wpctl for setting card profiles, default sinks/sources, volume, and mute
    - Significant performance and stability improvements
    - Wireplumber state no longer gets corrupted
  • Fixed early return on debounced volume events dropping pipewire and pulse events
  • Update pipewire-rs to version 0.9
  • Most of our dependency on libpulse has been eliminated
    • It is only used for getting and setting volume, volume balance, and watching default sink/source changes

@mmstick mmstick requested review from a team October 20, 2025 14:18
Copy link
Member

@jacobgkau jacobgkau left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First, there's an overflow/sizing issue with the drop-down box on the Device Profiles page. By default, I had no profile selected (not even "Off"), which seems impossible. In that state, most of the drop-down items flowed out of the end of the window:

Image

It seems like longer labels being selected allowed the drop-down to display more of its contents:

Image Image

Separate issue, but after I selected "Off" as my profile, the device disappeared from the list, making it impossible to turn on again. The point of the "Off" option is to still show the device in the list while it's disabled, so that shouldn't happen.

Image

@mmstick
Copy link
Member Author

mmstick commented Oct 20, 2025

What's the output of pw-dump on this system? This is what I see on a system with a Realtek card, Radeon HDMI audio, and a USB-C sound card.

Screenshot_2025-10-20_19-25-58 Screenshot_2025-10-20_19-27-00

@mmstick
Copy link
Member Author

mmstick commented Oct 21, 2025

Fixed the devices on the device profiles page disappearing when setting their profile to off. Which also fixes the device briefly disappearing when the device's nodes are replaced.

wash2
wash2 previously approved these changes Oct 21, 2025
@jackpot51 jackpot51 requested a review from jacobgkau October 21, 2025 16:31
Copy link
Member

@jacobgkau jacobgkau left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the same machine as yesterday, I still had one of the devices not have any profile visibly selected at first, which shouldn't be possible:

Screenshot_2025-10-21_11-21-24

Here is pw-dump from that system: pw-dump-oryp8.txt

If I set the device to "Off", it initially shows itself as "Off", but if I reboot, I end up in the same state as shown above (it boots up set to nothing instead of showing as set to "Off".)

@jacobgkau
Copy link
Member

jacobgkau commented Oct 21, 2025

I'm still also seeing menu items getting cut off at the edge of the window. Is that a libcosmic bug? Dropdown menus in other COSMIC apps seem to be able to run out the side of the window.

@mmstick
Copy link
Member Author

mmstick commented Oct 21, 2025

It's a different dropdown widget. I will switch to it

wash2
wash2 previously approved these changes Oct 21, 2025
@mmstick
Copy link
Member Author

mmstick commented Oct 21, 2025

The index of the selected profile on that Built-in Audio device should be fixed now

@mmstick mmstick requested a review from jacobgkau October 21, 2025 18:08
@jacobgkau
Copy link
Member

jacobgkau commented Oct 21, 2025

On 8688b54 and oryp8, the profile of Built-in Audio keeps defaulting to Digital Surround 5.1 (IEC958/AC3) Output. I think this corresponds to the S/PDIF output, but attempting to change the volume does nothing. Going directly to Digital Stereo (IEC958) Output doesn't work, but if I choose Off, then I can go to Digital Stereo (IEC958) Output to get sound out of the S/PDIF port (the Digital Surround option then gives distorted audio if I select that again).

If I just boot (defaulting to Digital Surround 5.1 (IEC958/AC3) Output) and change directly to one of the Analog Stereo options, that also doesn't work (changing the volume doesn't work & there's no sound). Again, I have to select Off first, then go back to Analog Stereo for it to work.

I know some of this might be audio card weirdness that's outside the scope of COSMIC Settings, but does any of this sound like a COSMIC Settings thing? The two distinct problems are the default/last selected profile not being saved between sessions, and not being able to switch from the default to one of the others successfully without first selecting Off (or possibly just sound not working at all until it's turned Off).

@jacobgkau
Copy link
Member

jacobgkau commented Oct 21, 2025

From @WatchMkr in Mattermost (posting here so it doesn't get lost)-- the design also calls for the device description to be prepended to the profile name when selecting an input/output device (e.g. Speakers - Built-in Audio). The string to be prepended appears to be labeled "description" in pw-dump.

@mmstick
Copy link
Member Author

mmstick commented Oct 22, 2025

Seems I'll need to add the different routes (ports) to the output/input dropdown lists. Pavucontrol puts those on a separate port dropdown.

@jacobgkau
Copy link
Member

Not sure if you were ready for me to look at this again yet, but just to corroborate, on f787c83, I'm seeing the Output device as Analog Stereo - Built-in Audio, when it should say Speakers - Built-in Audio. As you noted, it should be the description of the route, not the profile.

The other problems I mentioned before are still occurring.

@mmstick mmstick force-pushed the sound branch 2 times, most recently from cdbd2a9 to 089d65e Compare October 27, 2025 14:11
Copy link
Member

@jacobgkau jacobgkau left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

35e3127 still has reliability issues on oryp8.

If I set Built-in Audio's profile to Analog Stereo Duplex and then reboot, it defaults to Digital Surround 5.1 (IEC958/AC3) Output again.

If I change the profile to Analog Stereo Duplex, then both Output device and Input device show their only option as Built-in Audio, with no route name/description prepended. Changing the speaker volume with hotkeys doesn't work in this state.

If I change the profile to Analog Stereo Output, then Output device changes to Speakers - Built-in Audio, and the speaker hotkeys work. Alternatively, if I open up an app and start playing audio, then the Output device does not change, but the speaker hotkeys do start working.

@mmstick
Copy link
Member Author

mmstick commented Oct 28, 2025

What's the output of pw-dump when set to Analog Stereo Duplex? Particularly the Pipewire:Interface:Node associated with it. Changing the profile changes the active route, and a PipeWire:Interface:Node is created from that.

Based on the logic that I have, the most likely problem is that the node failed to parse. The node ID is required to set a default sink/source, and the route won't be added to the device name if a node isn't associated with it.

.info({
let state = Rc::downgrade(&state);
move |info| {
if let Some(node) = Node::from_node(info) {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is where the node is parsed. This could be wrapped with dbg!(Node::from_node(info)) to check if all nodes are getting parsed.

Copy link
Member

@jacobgkau jacobgkau left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here is pw-dump after booting on 4a14492, defaulting to S/PDIF: oryp8-4a14492-default-spdif.txt
Here is pw-dump after changing the profile to Analog Stereo Duplex: oryp8-4a14492-duplex.txt

On 4a14492, the speaker hotkeys work immediately after changing the profile to Analog Stereo Duplex, but the Output device is only labeled Built-in Audio, while the Input device is labeled Speakers - Built-in Audio.

@mmstick
Copy link
Member Author

mmstick commented Oct 28, 2025

I think I see the issue

@mmstick
Copy link
Member Author

mmstick commented Oct 29, 2025

Hoping this fixes the issue you're seeing.

@mmstick mmstick requested review from jacobgkau and wash2 November 18, 2025 20:18
Copy link
Member

@jacobgkau jacobgkau left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems like Output amplification is defaulting to off now (e.g. if I remove the WirePlumber & PulseAudio config). It was previously defaulted to on. @WatchMkr confirmed we want it to default to on.

@jacobgkau jacobgkau dismissed their stale review November 19, 2025 00:07

Incorrect info/testing procedure

wash2
wash2 previously approved these changes Nov 19, 2025
@jacobgkau
Copy link
Member

I'm not sure the current solution to devices being plugged/unplugged is working right. I've had a couple of times where when I unplug HDMI, not only does the profile remain selected for the HDMI sound card (which is fine), but the Output device stays on the now-unplugged HDMI port (which is less desired). We probably want the Output device to change to something that's connected.

I also had one case on f24d602 where the HDMI device's profile was set to Off after unplugging and remained Off after plugging it in again, like it was before. But not every time.

@jacobgkau
Copy link
Member

jacobgkau commented Nov 19, 2025

Carl suggested we just automatically set a device to the first profile in the list when it used to have no profiles available (besides Off and Pro Audio) and a new profile becomes available. It seems like that would solve the usability issue, and ensure the output's at least available to select in the applet after plugging a device in. And would be simpler than trying to remember a history of profiles that were selected before things changed.

I am still seeing it often go to Off on unplug (and stay there on re-plug) on f24d602.

Copy link
Member

@jacobgkau jacobgkau left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regression with the most recent set of commits: on 34cdc6b, the output device doesn't rename automatically from Speakers to Headphones when I plug headphones in.

@jacobgkau
Copy link
Member

The HDMI plug behavior does seem to be behaving slightly better on 34cdc6b, but there are still some issues. For example, after about five plug/unplugs, I saw the profile remain on what it had been automatically set to on plug-in (Digital Surround 7.1 (HDMI) Output), instead of being changed to Off like it had the first few times I unplugged. pavucontrol shows the profile's (unplugged) (unavailable), so the hardware knows it was unplugged.

@jacobgkau
Copy link
Member

jacobgkau commented Nov 19, 2025

It also seems that the profile being auto-selected when it was set to Off and I plug in HDMI is non-deterministic. It's been Digital Surround 7.1 most times, but I just had it go to Digital Surround 5.1 on one plug-in.

Digital Surround 7.1 (HDMI) is index 6. Digital Surround 5.1 (HDMI) is index 5. Digital Stereo (HDMI) is index 1, and is probably what I'd expect to be auto-selected (I'd think we'd either want that for the widest compatibility, or 7.1 to get the most channels possible). There are also a variety of (HDMI 2), (HDMI 3), etc. profiles shown in pw-cli, but cosmic-settings is correctly only showing the (HDMI) options when using the one HDMI port right now.

@mmstick
Copy link
Member Author

mmstick commented Nov 20, 2025

There may not be much we can do about what profile gets selected since we're competing with the pipewire daemon itself.

@jacobgkau
Copy link
Member

jacobgkau commented Nov 20, 2025

When testing HDMI plug/unplug on b4ca6d0, the first time I unplugged, the profile went back to Off (as expected with the behavior we're trying for now). The second and third times, it remained on the unplugged profile (which isn't the end of the world, but means the unavailable HDMI output is presented as an output device option and could remain selected). The fourth time, it was set to Off again.

@mmstick Just to clarify, is that also something the PipeWire daemon (and/or anything other than COSMIC Settings) is responsible for?

I did also just see one case when I plugged in where the profile flickered a whole bunch between the three (stereo, 5.1, and 7.1); it took a couple of seconds for it to settle down and pick the 5.1 to stay on. This spammed the OSD and volume adjustment sound while it was happening.

@mmstick
Copy link
Member Author

mmstick commented Nov 20, 2025

The daemon is responsible for switching profiles automatically, and that should be influenced based on plugged status and profile priority. But in all my testing it seems to be non-deterministic at times. Perhaps influenced by race conditions as device nodes are recreated.

We are attempting to work around the behaviors in cosmic-settings while the page is open, but that does have some limitations. In particular, there's no way to tell if a profile change was intentionally made by the user, or automatically by the daemon. Using the pipewire daemon's socket, we get messages from the daemon about active profile and route changes, but it doesn't indicate whether that was intentional by the user or an automatic selection by the daemon.

Currently, we're watching for changes after manually changing device profiles in the interface because the daemon tends to auto-select a random node for a different device during the time it takes for pipewire to recreate device nodes for the newly-selected profile. So for a brief moment a different device will get the default before cosmic-settings can re-select one of the newly-created nodes.

Now we have a conditional check for devices that are externally assigned to the Off profile while the page is open. The first profile with an available status will get selected when found. Though it's possible that pipewire may make that choice for us instead of switching to Off. So a patch to pipewire would be more appropriate for tweaking automatic profile behaviors.

I did also just see one case when I plugged in where the profile flickered a whole bunch between the three (stereo, 5.1, and 7.1); it took a couple of seconds for it to settle down and pick the 5.1 to stay on. This spammed the OSD and volume adjustment sound while it was happening.

Checking. Sounds like a clash with one of our workarounds.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

4 participants