Roles de dispositivo para aplicaciones directShow

Nota

La API MMDevice admite roles de dispositivo. Sin embargo, la interfaz de usuario de Windows Vista no implementa la compatibilidad con esta característica. Es posible que la compatibilidad con la interfaz de usuario para los roles de dispositivo se implemente en una versión futura de Windows. Para obtener más información, consulte Roles de dispositivo en Windows Vista.

 

La API directShow no proporciona un medio para que una aplicación seleccione el dispositivo de punto de conexión de audio asignado a un rol de dispositivo determinado. Sin embargo, en Windows Vista, las API de audio principales se pueden usar junto con una aplicación DirectShow para habilitar la selección de dispositivos en función del rol de dispositivo. Con la ayuda de las API de audio principales, la aplicación puede:

  • Identifique el dispositivo de punto de conexión de audio que el usuario ha asignado a un rol de dispositivo determinado.
  • Cree un filtro de representación de audio directShow con una interfaz IBaseFilter que encapsula el dispositivo de punto de conexión de audio.
  • Cree un gráfico directShow que incorpore el filtro.

Para obtener más información sobre DirectShow e IBaseFilter, consulte la documentación de Windows SDK.

En el ejemplo de código siguiente se muestra cómo crear un filtro de representación de audio directShow que encapsula el dispositivo de punto de conexión de representación asignado a un rol de dispositivo determinado:

//-----------------------------------------------------------
// 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;
}

En el ejemplo de código anterior, la función CreateAudioRenderer acepta un rol de dispositivo (eConsole, eMultimedia o eCommunications) como parámetro de entrada. El segundo parámetro es un puntero a través del cual la función escribe la dirección de una instancia de interfaz IBaseFilter . Además, en el ejemplo se muestra cómo usar el método IMMDevice::Activate para asignar la secuencia de audio en la instancia de IBaseFilter a una sesión de audio entre procesos con un GUID de sesión específico de la aplicación (especificado por la constante guidAudioSessionId ). El tercer parámetro de la llamada Activate apunta a una estructura que contiene el GUID de sesión y la marca entre procesos. Si el usuario ejecuta varias instancias de la aplicación, las secuencias de audio de todas las instancias usan el mismo GUID de sesión y, por tanto, pertenecen a la misma sesión.

Como alternativa, el autor de la llamada puede especificar NULL como tercer parámetro de la llamada Activate para asignar la secuencia a la sesión predeterminada como la sesión específica del proceso con el valor guid de sesión GUID_NULL. Para obtener más información, vea IMMDevice::Activate.

Interoperabilidad con las API de audio heredadas