Skip to content

Respect Windows output device selection #740

@JasonWei512

Description

@JasonWei512

Current behavior

I am using rodio to play audio on Windows 11. When I change the output device on Windows, the audio continues to play on the old device.

cpal

There is a similar issue for macOS. But that is fixed in RustAudio/rodio#327.

The behavior I expected

On Windows, if user creates a device with Device::default_output_device() and plays audio through it, when user changes Windows's output device, the audio should play on the new device.

Document:

https://learn.microsoft.com/en-us/windows/win32/coreaudio/relevant-device-notifications-for-stream-routing

https://learn.microsoft.com/en-us/windows/win32/coreaudio/device-events

  1. Add implement feature to windows crate:

    [target.'cfg(target_os = "windows")'.dependencies]
    windows = { ..., features = [..., "implement"] }
  2. Implement IMMNotificationClient:

    #[implement(windows::Win32::Media::Audio::IMMNotificationClient)]
    struct IMMNotificationClientWrapper {}
    
    impl windows::Win32::Media::Audio::IMMNotificationClient_Impl for IMMNotificationClientWrapper {
        ...
    
        fn OnDefaultDeviceChanged(&self, flow: EDataFlow, role: ERole, pwstrdefaultdeviceid: &PCWSTR, ) -> Result<(), windows::core::Error> {
            todo!("Handle default device changed event");
        }
    }
  3. Register the IMMNotificationClientWrapper in src\host\wasapi\device.rs:

    ENUMERATOR.0.RegisterEndpointNotificationCallback(IMM_NOTIFICATION_CLIENT_WRAPPER);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions