将音频输出发送到所有扬声器设备

时间:2010-08-21 01:26:55

标签: c# .net windows-7 audio core-audio

我需要能够将我的应用程序的声音输出定向到系统音频输出的所有 - 特别是内置扬声器和笔记本电脑的耳机。我在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#。谢谢!

1 个答案:

答案 0 :(得分:0)

如果确保在Windows声音控制面板中启用了您想要声音的设备,则它们都将显示为DEVICE_STATE_ACTIVE。如果您想要同时发送相同的音频文件以在多个设备上播放,您应该可以使用Core Audio API执行此操作。但是如果你想控制其他应用程序强制它们播放所有那些输出,你就必须重写它们的代码; P你可以创建一个低级别的驱动程序来拦截所有声音,然后将它重定向到所有设备你想。像http://ac3filter.net/之类的东西(虽然ac3Filter仅在应用程序使用我认为的DirectShow时才有效)