我需要能够将我的应用程序的声音输出定向到系统音频输出的所有 - 特别是内置扬声器和笔记本电脑的耳机。我在Windows Vista / 7和最新版本的.NET Framework上使用C#,并且不需要支持较旧的(即Windows XP)操作系统。
我能够成功使用Core Audio API来更改活动扬声器的音量,并且能够枚举并专门操作各个音频设备,但无法实际更改设备的状态以启用它们。
private MMDeviceEnumerator devEnum = new MMDeviceEnumerator();
private MMDeviceCollection audioDevices = null;
public Form1()
{
InitializeComponent();
this.defaultDevice = this.devEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia);
AudioEndpointVolumeNotificationDelegate(AudioEndpointVolume_OnVolumeNotification);
this.audioDevices = this.devEnum.EnumerateAudioEndPoints(EDataFlow.eRender, EDeviceState.DEVICE_STATEMASK_ALL);
for (int i = 1; i < this.audioDevices.Count; i++)
{
// Doesn't work - throws exception because property is read-only:
// this.audioDevices[i].State = EDeviceState.DEVICE_STATE_ACTIVE
}
}
基本上,我正在寻找的是一种启用音频设备的方法,而不仅仅是调整音量。有人知道这样做的方法吗?我一直在查看IMMDevice Interface的MSDN文档,但我发现它很难,因为它不是作为托管代码提供的,而我使用的.NET包装器并没有完全实现它。我也愿意采取完全不同的方法,只要我仍然可以使用C#。谢谢!
答案 0 :(得分:0)
如果确保在Windows声音控制面板中启用了您想要声音的设备,则它们都将显示为DEVICE_STATE_ACTIVE。如果您想要同时发送相同的音频文件以在多个设备上播放,您应该可以使用Core Audio API执行此操作。但是如果你想控制其他应用程序强制它们播放所有那些输出,你就必须重写它们的代码; P你可以创建一个低级别的驱动程序来拦截所有声音,然后将它重定向到所有设备你想。像http://ac3filter.net/之类的东西(虽然ac3Filter仅在应用程序使用我认为的DirectShow时才有效)