Role urządzeń dla aplikacji DirectShow
Nuta
Interfejs API mmdevice obsługuje role urządzeń. Jednak interfejs użytkownika w systemie Windows Vista nie implementuje obsługi tej funkcji. Obsługa interfejsu użytkownika dla ról urządzeń może zostać zaimplementowana w przyszłej wersji systemu Windows. Aby uzyskać więcej informacji, zobacz Role urządzeń w systemie Windows Vista.
Interfejs API DirectShow nie zapewnia aplikacji możliwości wybrania urządzenia punktu końcowego audio przypisanego do określonej roli urządzenia . Jednak w systemie Windows Vista podstawowe interfejsy API audio mogą być używane w połączeniu z aplikacją DirectShow w celu włączenia wyboru urządzenia na podstawie roli urządzenia. Za pomocą podstawowych interfejsów API audio aplikacja może wykonywać następujące czynności:
- Zidentyfikuj urządzenie punktu końcowego audio przypisane przez użytkownika do określonej roli urządzenia.
- Utwórz filtr renderowania audio DirectShow za pomocą interfejsu IBaseFilter, który hermetyzuje urządzenie punktu końcowego audio.
- Skompiluj wykres DirectShow, który zawiera filtr.
Aby uzyskać więcej informacji na tematDirectShow iIBaseFilter, zobacz dokumentację zestawu Windows SDK.
W poniższym przykładzie kodu pokazano, jak utworzyć filtr renderowania audio DirectShow, który hermetyzuje urządzenie punktu końcowego renderowania przypisane do określonej roli urządzenia:
//-----------------------------------------------------------
// 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;
}
W poprzednim przykładzie kodu funkcja CreateAudioRenderer akceptuje rolę urządzenia (eConsole, eMultimedia lub eCommunications) jako parametr wejściowy. Drugi parametr jest wskaźnikiem, za pomocą którego funkcja zapisuje adres wystąpienia interfejsu IBaseFilter. Ponadto w przykładzie pokazano, jak używać metody IMMDevice::Activate w celu przypisania strumienia audio w wystąpieniu IBaseFilter do sesji audio między procesami z identyfikatorem GUID sesji specyficznej dla aplikacji (określonym przez identyfikator GUID guidAudioSessionId stałej). Trzeci parametr w Activate wskazuje strukturę zawierającą identyfikator GUID sesji i flagę między procesami. Jeśli użytkownik uruchamia wiele wystąpień aplikacji, strumienie audio ze wszystkich wystąpień używają tego samego identyfikatora GUID sesji, a tym samym należą do tej samej sesji.
Alternatywnie obiekt wywołujący może określić null jako trzeci parametr w wywołaniu Activate w celu przypisania strumienia do sesji domyślnej jako sesji specyficznej dla procesu z wartością identyfikatora GUID sesji GUID_NULL. Aby uzyskać więcej informacji, zobacz IMMDevice::Activate.
Tematy pokrewne