Perender Audio Streaming

Perender audio streaming (SAR) adalah sink media yang merender audio. Setiap instans SAR merender satu aliran audio. Untuk merender beberapa aliran, gunakan beberapa instans SAR.

Untuk membuat SAR, panggil salah satu fungsi berikut:

Fungsi kedua, yang mengembalikan objek aktivasi, diperlukan jika Anda memutar konten yang dilindungi, karena objek aktivasi harus diserialisasikan ke proses yang dilindungi. Untuk konten yang jelas, Anda dapat menggunakan salah satu fungsi.

SAR dapat menerima audio yang tidak dikompresi dalam format TITIK mengambang PCM atau IEEE. Jika laju pemutaran lebih cepat atau lebih lambat dari 1×, SAR secara otomatis menyesuaikan nada.

Mengonfigurasi Perender Audio

SAR mendukung beberapa atribut konfigurasi. Mekanisme untuk mengatur atribut ini tergantung pada fungsi mana yang Anda panggil untuk membuat SAR. Jika Anda menggunakan fungsi MFCreateAudioRenderer , lakukan hal berikut:

  1. Buat penyimpanan atribut baru dengan memanggil MFCreateAttributes.
  2. Tambahkan atribut ke penyimpanan atribut.
  3. Teruskan penyimpanan atribut ke fungsi MFCreateAudioRenderer di parameter pAudioAttributes .

Jika Anda menggunakan fungsi MFCreateAudioRendererActivate , fungsi mengembalikan penunjuk ke antarmuka IMFAttributes di parameter ppActivate . Gunakan penunjuk ini untuk menambahkan atribut.

Untuk daftar atribut konfigurasi, lihat Atribut Perender Audio.

Memilih Perangkat Titik Akhir Audio

Perangkat titik akhir audio adalah perangkat keras yang merender atau mengambil audio. Contohnya termasuk speaker, headphone, mikrofon, dan pemutar CD. SAR selalu menggunakan perangkat penyajian audio. Ada dua cara untuk memilih perangkat.

Pendekatan pertama adalah menghitung perangkat penyajian audio pada sistem, menggunakan antarmuka IMMDeviceEnumerator . Antarmuka ini didokumenkan dalam dokumentasi API audio inti.

  1. Buat objek enumerator perangkat.
  2. Gunakan enumerator perangkat untuk menghitung perangkat penyajian audio. Setiap perangkat diwakili oleh penunjuk ke antarmuka IMMDevice .
  3. Pilih perangkat, berdasarkan properti perangkat atau pilihan pengguna.
  4. Hubungi IMMDevice::GetId untuk mendapatkan pengidentifikasi perangkat.
  5. Atur pengidentifikasi perangkat sebagai nilai atribut MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID .

Daripada menghitung perangkat, Anda dapat menentukan perangkat audio berdasarkan perannya. Peran audio mengidentifikasi kategori penggunaan umum. Misalnya, peran konsol didefinisikan untuk game dan pemberitahuan sistem, sementara peran multimedia didefinisikan untuk musik dan film. Setiap peran memiliki satu perangkat penyajian audio yang ditetapkan untuknya, dan pengguna dapat mengubah penugasan ini. Jika Anda menentukan peran perangkat, SAR menggunakan perangkat audio apa pun yang telah ditetapkan untuk peran tersebut. Untuk menentukan peran perangkat, atur atribut MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE .

Dua atribut yang tercantum di bagian ini saling eksklusif. Jika Anda tidak mengatur salah satunya, SAR menggunakan perangkat audio yang ditetapkan ke peran eConsole .

Kode berikut menghitung perangkat penyajian audio dan menetapkan perangkat pertama dalam daftar ke SAR. Contoh ini menggunakan fungsi MFCreateAudioRenderer untuk membuat SAR.

#include <mmdeviceapi.h>

HRESULT hr = S_OK;

IMMDeviceEnumerator *pEnum = NULL;      // Audio device enumerator.
IMMDeviceCollection *pDevices = NULL;   // Audio device collection.
IMMDevice *pDevice = NULL;              // An audio device.
IMFAttributes *pAttributes = NULL;      // Attribute store.
IMFMediaSink *pSink = NULL;             // Streaming audio renderer (SAR)

LPWSTR wstrID = NULL;                   // Device ID.

// Create the device enumerator.
hr = CoCreateInstance(
    __uuidof(MMDeviceEnumerator), 
    NULL,
    CLSCTX_ALL, 
    __uuidof(IMMDeviceEnumerator), 
    (void**)&pEnum
    );

// Enumerate the rendering devices.
if (SUCCEEDED(hr))
{
    hr = pEnum->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pDevices);
}

// Get ID of the first device in the list.
if (SUCCEEDED(hr))
{
    hr = pDevices->Item(0, &pDevice);
}

if (SUCCEEDED(hr))
{
    hr = pDevice->GetId(&wstrID);
}

// Create an attribute store and set the device ID attribute.
if (SUCCEEDED(hr))
{
    hr = MFCreateAttributes(&pAttributes, 2);
}

if (SUCCEEDED(hr))
{
    hr = pAttributes->SetString(
        MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID, 
        wstrID
        );
}

// Create the audio renderer.
if (SUCCEEDED(hr))
{
    hr = MFCreateAudioRenderer(pAttributes, &pSink);    
}

SAFE_RELEASE(pEnum);
SAFE_RELEASE(pDevices);
SAFE_RELEASE(pDevice); 
SAFE_RELEASE(pAttributes);
CoTaskMemFree(wstrID);

Untuk membuat objek aktivasi untuk SAR, ubah kode yang muncul setelah panggilan ke IMMDevice::GetId ke yang berikut:

IMFActivate *pActivate = NULL;          // Activation object.

if (SUCCEEDED(hr))
{
    hr = MFCreateAudioRendererActivate(&pActivate);    
}

if (SUCCEEDED(hr))
{
    hr = pActivate->SetString(
        MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID, 
        wstrID
        );
}

SAFE_RELEASE(pActivate);

Memilih Sesi Audio

Sesi audio adalah sekelompok aliran audio terkait yang dapat dikelola aplikasi secara kolektif. Aplikasi dapat mengontrol tingkat volume dan mematikan suara setiap sesi. Sesi diidentifikasi oleh GUID. Untuk menentukan sesi audio untuk SAR, gunakan atribut MF_AUDIO_RENDERER_ATTRIBUTE_SESSION_ID . Jika Anda tidak mengatur atribut ini, SAR bergabung dengan sesi default untuk proses tersebut, yang diidentifikasi oleh GUID_NULL.

Secara default, sesi audio bersifat khusus proses, yang berarti hanya berisi aliran dari proses panggilan. Untuk bergabung dengan sesi lintas proses, atur atribut MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS dengan nilai MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_CROSSPROCESS.

Setelah membuat SAR, Anda menggunakan antarmuka IMFAudioPolicy untuk bergabung dengan sesi ke sekelompok sesi, yang semuanya dikontrol oleh kontrol volume yang sama di panel kontrol. Anda juga dapat menggunakan antarmuka ini untuk mengatur nama tampilan dan ikon yang muncul di kontrol volume.

Mengontrol Tingkat Volume

Untuk mengontrol tingkat volume master semua aliran dalam sesi audio SAR, gunakan antarmuka IMFSimpleAudioVolume . Untuk mengontrol volume aliran individual, atau untuk mengontrol volume saluran individual dalam aliran, gunakan antarmuka IMFAudioStreamVolume . Kedua antarmuka diperoleh dengan memanggil IMFGetService::GetService. Anda dapat memanggil GetService langsung di SAR, atau memanggilnya di Sesi Media. Tingkat volume dinyatakan sebagai nilai redaman. Untuk setiap saluran, tingkat redaman adalah produk dari volume master dan volume saluran.

Pemutaran Audio/Video