实作自定义音讯端点列举器
從 Windows Server 2008 R2 開始,您可以將自定義遠端音訊端點列舉值實作為遠端桌面通訊協定提供者的一部分。 遠端桌面通訊協定提供者可以使用自定義音訊端點列舉值來擷取具有一組特定功能的音訊端點集合。
實作自訂遠端音訊端點列舉器
- 您的自定義端點列舉值解決方案應該實作四種主要物件類型:裝置列舉值物件、裝置集合物件、裝置對象和屬性存放區物件。
物件類型 | 描述 |
---|---|
裝置列舉器物件 |
裝置列舉值物件會提供端點列舉值功能。 它會公開傳回預設端點和指定端點集合的方法。 例如,根據指定的準則,列舉值可以傳回通訊端點、播放端點或擷取端點。 裝置列舉值對象必須實作 IMMDeviceEnumerator 介面。 |
裝置集合物件 |
裝置集合物件代表音訊裝置的集合。 它必須實作 IMMDeviceCollection 介面。 |
裝置物件 |
裝置物件代表特定的音訊裝置。 它可讓您存取音訊裝置的屬性存放區,並公開裝置上可用的音訊播放和擷取介面。 裝置對象必須實作 IMMDevice 和 IMMEndpoint 介面。 |
屬性存放區物件 |
屬性存放區物件會公開與音訊裝置相關聯的屬性。 系統會使用這些屬性的一些屬性,但應用程式也可以使用音訊端點來儲存任意屬性。 所有音訊裝置都有下列三個屬性: 屬性存放區對象必須實作 IPropertyStore 介面。 |
- 自訂端點列舉器必須在能被音訊系統和其他應用程式載入的 DLL 中實作。 DLL 必須經過簽署,安全進程才能載入它。 DLL 必須實作並匯出 GetTSAudioEndpointEnumeratorForSession 函式,其可作為自定義端點列舉值的進入點。
遠端桌面服務服務會呼叫 QueryProperty 方法,並將 QueryType 參數設定為 WTS_QUERY_AUDIOENUM_DLL,以擷取列舉值對象的名稱。
自定義列舉值物件使用類似 COM 的介面和類似 COM 的參考計數機制,但它們不是真正的 COM 物件。 自訂端點枚舉器必須能夠與使用不支援 COM 的應用程式之舊式音訊介面一起工作。 因此,自定義端點列舉值不得依賴 COM 的生命週期管理機制。 音訊端點枚舉器的使用者,例如 MMDevAPI.dll,會在使用者應用程式需要時載入自定義端點枚舉器 DLL,並且在枚舉器保留裝置枚舉器物件、裝置集合物件、裝置物件或屬性存放區物件的參考時,它們不會卸除枚舉器。 不過,這些取用者無法追蹤與自定義端點列舉器所擁有的其他類型物件相關的參考。 因此,我們建議您的自訂端點列舉器不要建立任何可能比這四種類型物件活得更久的物件。
實作自定義音訊端點
若要實作自定義音訊裝置列舉值,您必須實作自定義音訊端點。 自定義音訊裝置連結的方式是使用下列兩個語句:
IMMDevice::Activate(IAudioOutputEndpointRT)
IMMDevice::Activate(IAudioInputEndpointRT)
我們不期望您在自訂音訊裝置列舉器中實作 IMMDevice::Activate 介面的完整清單。 相反地,您應該實作 IAudioOutputEndpointRT,IAudioInputEndpointRT。 您可以選擇性地實作一些其他專案,例如 IAudioEndpointVolume。 對於您未實作的任何介面,您應該傳回 E_NOINTERFACE(您必須使用此特定的失敗碼)。 Windows 接著會回到介面的庫存實作(例如,IAudioClient2)。
如需如何實作及註冊音訊端點的其他參考檔,請參閱 IAudioInputEndpointRT。 如需顯示 WASAPI 運作方式的圖表,請參閱 User-Mode 音訊元件。 請注意,所有使用者模式音訊都是從 Windows Server 2008 開始的新功能。