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

问题描述:

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

+2

即使您可以启用不同的设备,如蓝牙耳机和内置扬声器,你不可能通过扬声器播放声音时耳机插入 - 这通常是纯电气 - 机械插入耳机插孔将音频路由到插入的设备,而不是扬声器。就计算机而言,它全是一台设备。 – Jay 2010-08-21 02:13:59

+0

不知道你用来渲染音频的API,很难知道如何回答这个问题。 – 2010-08-22 15:56:17

如果您确定您想要的设备在Windows声音控制面板中启用,则它们将全部显示为DEVICE_STATE_ACTIVE。如果你想发送同一个音频文件在同一时间在多个设备上播放,你应该可以用Core Audio API来完成。但是如果你想控制其他应用程序来强制它们播放所有这些输出,你将不得不重写它们的代码; P你可以制作一个低级驱动程序,它可以拦截所有声音,然后将其重定向到你所有的设备想。像http://ac3filter.net/(虽然ac3Filter只适用于应用程序使用DirectShow,我认为)

+2

ac3filter不会“截取所有声音”,它只是输出一个多声道音频流。如果你有一个多声道声卡,你会在你的扬声器中听到“某些东西”。 – yms 2011-06-14 13:08:28