2010-08-21 113 views
1

我需要能夠將來自我的應用程序的聲音輸出指向所有系統的音頻輸出 - 特別是筆記本電腦的內置揚聲器和耳機。我在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

回答

0

如果您確定您想要的設備在Windows聲音控制面板中啓用,則它們將全部顯示爲DEVICE_STATE_ACTIVE。如果你想發送同一個音頻文件在同一時間在多個設備上播放,你應該可以用Core Audio API來完成。但是如果你想控制其他應用程序來強制它們播放所有這些輸出,你將不得不重寫它們的代碼; P你可以製作一個低級驅動程序,它可以攔截所有聲音,然後將其重定向到你所有的設備想。像http://ac3filter.net/(雖然ac3Filter只適用於應用程序使用DirectShow,我認爲)

+2

ac3filter不會「截取所有聲音」,它只是輸出一個多聲道音頻流。如果你有一個多聲道聲卡,你會在你的揚聲器中聽到「某些東西」。 – yms 2011-06-14 13:08:28

相關問題