Respect Windows output device selection
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.

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
-
Add
implementfeature towindowscrate:[target.'cfg(target_os = "windows")'.dependencies] windows = { ..., features = [..., "implement"] } -
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"); } } -
Register the
IMMNotificationClientWrapperinsrc\host\wasapi\device.rs:ENUMERATOR.0.RegisterEndpointNotificationCallback(IMM_NOTIFICATION_CLIENT_WRAPPER);
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.