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 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
-
Add implement feature to windows crate:
[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 IMMNotificationClientWrapper in src\host\wasapi\device.rs:
ENUMERATOR.0.RegisterEndpointNotificationCallback(IMM_NOTIFICATION_CLIENT_WRAPPER);
Current behavior
I am using
rodioto 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 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
Add
implementfeature towindowscrate:Implement IMMNotificationClient:
Register the
IMMNotificationClientWrapperinsrc\host\wasapi\device.rs: