Enhetsroller för DirectShow-program
Not
MMDevice API stöder enhetsroller. Användargränssnittet i Windows Vista implementerar dock inte stöd för den här funktionen. Användargränssnittsstöd för enhetsroller kan implementeras i en framtida version av Windows. Mer information finns i Enhetsroller i Windows Vista.
DirectShow-API:et tillhandahåller inte något sätt för ett program att välja ljudslutpunktsenhet som har tilldelats en viss enhetsroll. I Windows Vista kan dock kärnljud-API:er användas tillsammans med ett DirectShow-program för att aktivera enhetsval baserat på enhetsroll. Med hjälp av kärnljud-API:er kan programmet:
- Identifiera den ljudslutpunktsenhet som användaren har tilldelat till en viss enhetsroll.
- Skapa ett DirectShow-ljudrenderingsfilter med ett IBaseFilter- gränssnitt som kapslar in ljudslutpunktsenheten.
- Skapa ett DirectShow-diagram som innehåller filtret.
Mer information om DirectShow och IBaseFilterfinns i Windows SDK-dokumentationen.
I följande kodexempel visas hur du skapar ett DirectShow-ljudrenderingsfilter som kapslar in den återgivningsslutpunktsenhet som har tilldelats en viss enhetsroll:
//-----------------------------------------------------------
// 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;
}
I föregående kodexempel accepterar funktionen CreateAudioRenderer en enhetsroll (eConsole, eMultimedia eller eCommunications) som en indataparameter. Den andra parametern är en pekare genom vilken funktionen skriver adressen till en IBaseFilter gränssnittsinstans. Dessutom visar exemplet hur du använder metoden IMMDevice::Activate för att tilldela ljudströmmen i IBaseFilter-instansen till en korsprocessljudsession med ett programspecifikt sessions-GUID (anges av guidAudioSessionId konstant). Den tredje parametern i Aktivera anrop pekar på en struktur som innehåller sessionens GUID och korsprocessflaggan. Om användaren kör flera instanser av programmet använder ljudströmmarna från alla instanser samma sessions-GUID och tillhör därmed samma session.
Alternativt kan anroparen ange NULL- som den tredje parametern i anropet Aktivera för att tilldela strömmen till standardsessionen som den processspecifika sessionen med sessions-GUID-värdet GUID_NULL. Mer information finns i IMMDevice::Activate.
Relaterade ämnen