Udostępnij za pośrednictwem


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.

współdziałanie ze starszymi interfejsami API audio