Bagikan melalui


Peran Perangkat untuk Aplikasi DirectShow

Catatan

MMDevice API mendukung peran perangkat. Namun, antarmuka pengguna di Windows Vista tidak menerapkan dukungan untuk fitur ini. Dukungan antarmuka pengguna untuk peran perangkat mungkin diimplementasikan dalam versi Windows yang akan datang. Untuk informasi selengkapnya, lihat Peran Perangkat di Windows Vista.

 

DirectShow API tidak menyediakan sarana bagi aplikasi untuk memilih perangkat titik akhir audio yang ditetapkan ke peran perangkat tertentu. Namun, di Windows Vista, API audio inti dapat digunakan bersama dengan aplikasi DirectShow untuk mengaktifkan pemilihan perangkat berdasarkan peran perangkat. Dengan bantuan API audio inti, aplikasi dapat:

  • Identifikasi perangkat titik akhir audio yang telah ditetapkan pengguna ke peran perangkat tertentu.
  • Buat filter penyajian audio DirectShow dengan antarmuka IBaseFilter yang merangkum perangkat titik akhir audio.
  • Buat grafik DirectShow yang menggabungkan filter.

Untuk informasi selengkapnya tentang DirectShow dan IBaseFilter, lihat dokumentasi Windows SDK.

Contoh kode berikut menunjukkan cara membuat filter penyajian audio DirectShow yang merangkum perangkat titik akhir penyajian yang ditetapkan ke peran perangkat tertentu:

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

Dalam contoh kode sebelumnya, fungsi CreateAudioRenderer menerima peran perangkat (eConsole, eMultimedia, atau eCommunications) sebagai parameter input. Parameter kedua adalah penunjuk di mana fungsi menulis alamat instans antarmuka IBaseFilter. Selain itu, contoh menunjukkan cara menggunakan metode IMMDevice::Activate untuk menetapkan aliran audio di instans IBaseFilter ke sesi audio lintas proses dengan GUID sesi khusus aplikasi (ditentukan oleh konstanta guidAudioSessionId ). Parameter ketiga dalam mengaktifkan panggilan menunjuk ke struktur yang berisi GUID sesi dan bendera lintas proses. Jika pengguna menjalankan beberapa instans aplikasi, maka aliran audio dari semua instans menggunakan GUID sesi yang sama dan dengan demikian termasuk dalam sesi yang sama.

Atau, pemanggil dapat menentukan NULL sebagai parameter ketiga dalam panggilan Aktifkan untuk menetapkan aliran ke sesi default sebagai sesi khusus proses dengan nilai GUID sesi GUID_NULL. Untuk informasi selengkapnya, lihat IMMDevice::Activate.

Interoperabilitas dengan API Audio Warisan