DirectShow 應用程式的裝置角色
注意
MMDevice API 支援裝置角色。 不過,Windows Vista 中的使用者介面不會實作此功能的支援。 未來版本的 Windows 可能會實作裝置角色的使用者介面支援。 如需詳細資訊,請參閱 Windows Vista 中的裝置角色。
DirectShow API 不提供應用程式選取指派給特定裝置角色的音訊端點裝置的方法。 不過,在 Windows Vista 中,核心音訊 API 可以與 DirectShow 應用程式搭配使用,以根據裝置角色啟用裝置選取。 透過核心音訊 API 的協助,應用程式可以:
- 識別使用者指派給特定裝置角色的音訊端點裝置。
- 使用封裝音頻端點裝置的IBaseFilter 介面,建立 DirectShow 音訊轉譯篩選器。
- 建置包含篩選條件的 DirectShow 圖形。
如需 DirectShow 和 IBaseFilter 的詳細資訊,請參閱 Windows SDK 檔。
下列程式代碼範例示範如何建立 DirectShow 音訊轉譯篩選器,以封裝指派給特定裝置角色的轉譯端點裝置:
//-----------------------------------------------------------
// Create a DirectShow audio rendering filter that
// encapsulates the audio endpoint device that is currently
// assigned to the specified device role.
//-----------------------------------------------------------
#define EXIT_ON_ERROR(hres) \
if (FAILED(hres)) { goto Exit; }
#define SAFE_RELEASE(punk) \
if ((punk) != NULL) \
{ (punk)->Release(); (punk) = NULL; }
// This application's audio session GUID
const GUID guidAudioSessionId = {
0xb13ff52e, 0xa5cf, 0x4fca,
{0x9f, 0xc3, 0x42, 0x26, 0x5b, 0x0b, 0x14, 0xfb}
};
HRESULT CreateAudioRenderer(ERole role, IBaseFilter** ppAudioRenderer)
{
HRESULT hr = S_OK;
IMMDeviceEnumerator *pEnumerator = NULL;
IMMDevice *pDevice = NULL;
if (ppAudioRenderer == NULL)
{
return E_POINTER;
}
// Activate the IBaseFilter interface on the
// audio renderer with the specified role.
hr = CoCreateInstance(CLSID_MMDeviceEnumerator,
NULL, CLSCTX_INPROC_SERVER,
__uuidof(IMMDeviceEnumerator),
(void**)&pEnumerator);
EXIT_ON_ERROR(hr)
hr = pEnumerator->GetDefaultAudioEndpoint(eRender, role,
&pDevice);
EXIT_ON_ERROR(hr)
DIRECTX_AUDIO_ACTIVATION_PARAMS daap;
daap.cbDirectXAudioActivationParams = sizeof(daap);
daap.guidAudioSession = guidAudioSessionId;
daap.dwAudioStreamFlags = AUDCLNT_STREAMFLAGS_CROSSPROCESS;
PROPVARIANT var;
PropVariantInit(&var);
var.vt = VT_BLOB;
var.blob.cbSize = sizeof(daap);
var.blob.pBlobData = (BYTE*)&daap;
hr = pDevice->Activate(__uuidof(IBaseFilter),
CLSCTX_ALL, &var,
(void**)ppAudioRenderer);
EXIT_ON_ERROR(hr)
Exit:
SAFE_RELEASE(pEnumerator);
SAFE_RELEASE(pDevice);
return hr;
}
在上述程式代碼範例中,CreateAudioRenderer 函式接受裝置角色(eConsole、eMultimedia 或 eCommunications)作為輸入參數。 第二個參數是指針,函式會透過該指標寫入IBaseFilter 介面實例的位址。 此外,此範例示範如何使用 IMMDevice::Activate 方法,將 IBaseFilter 實例中的音訊數據流指派給具有應用程式特定會話 GUID 的跨進程音訊會話(由 guidAudioSessionId 常數指定)。 Activate 呼叫中的第三個參數會指向包含會話 GUID 和跨進程旗標的結構。 如果使用者執行應用程式的多個實例,則來自所有實例的音訊串流會使用相同的會話 GUID,因此屬於相同的會話。
或者,呼叫端可以將 NULL 指定為 Activate 呼叫中的第三個參數,將數據流指派給預設會話,做為具有會話 GUID 值的進程特定會話GUID_NULL。 如需詳細資訊,請參閱 IMMDevice::Activate。
相關主題