How can I programatically change the default audio device on a vista / win 7 system? Using C# or a Win API call?
The WinMM API should provide the functionality that you request.
You would use the DRVM_MAPPER_PREFERRED_SET message, which is sent with waveOutMessage() function.
Documentation: http://msdn.microsoft.com/en-us/library/aa909789.aspx
However, if you are trying to send the waveform sound out yourself, you should look at the WinMM.Net library.
DRVM_MAPPER_PREFERRED_SET
doesn't work even on XP, it returns MMSYSERR_INVALPARAM
. And documentation that you linked to clearly states it's for Windows Mobile. –
Diophantus I found the AudioSwitcher
constructor to be extra slow in my case.
I suggest using the "CoreAudio" API for managing audio devices.
Here is a current wrapper library available on NuGet. https://github.com/morphx666/CoreAudio/tree/master
Set device:
public static void SetDefaultDevice(string id) {
MMDeviceEnumerator deviceEnum = new MMDeviceEnumerator(Guid.NewGuid());
MMDevice device = deviceEnum.GetDevice(id);
deviceEnum.SetDefaultAudioEndpoint(device);
}
Get devices
public static MMDeviceCollection GetAudioDevices() {
MMDeviceEnumerator deviceEnum = new MMDeviceEnumerator(Guid.NewGuid());
return deviceEnum.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active);
}
This can now (actually for quite some time already) be done very easily using the AudioSwitcher.AudioApi.CoreAudio NuGet package.
Simply create a new CoreAudioController
:
var controller = new AudioSwitcher.AudioApi.CoreAudio.CoreAudioController();
Get hold of the desired device using its GUID:
var device = controller.GetDevice(Guid.Parse(...));
And lastly set it as the default playback device:
controller.DefaultPlaybackDevice = device;
© 2022 - 2024 — McMap. All rights reserved.