cpal icon indicating copy to clipboard operation
cpal copied to clipboard

Respect Windows output device selection

Open JasonWei512 opened this issue 3 years ago • 1 comments

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 https://github.com/RustAudio/rodio/issues/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);
    

JasonWei512 avatar Jan 12 '23 11:01 JasonWei512

I've PR'd #1027, an updated version of #754. I initially attempted an implementation of the solution suggested here (listening for device change notifications and updating output accordingly), but it would have required a significant refactor of the WASAPI stream implementation to support rebuilding the stream around a new device. My preliminary work for that can be seen here.

philpax avatar Oct 01 '25 20:10 philpax