Streamovací zvukový renderer
Streamovaná audio renderer (SAR) je jímka médií, která vykresluje zvuk. Každá instance SAR vykreslí jeden zvukový stream. Pokud chcete vykreslit více datových proudů, použijte několik instancí SAR.
Pokud chcete vytvořit SAR, zavolejte některou z následujících funkcí:
- MFCreateAudioRenderer. Vrátí ukazatel na SAR.
- MFCreateAudioRendererActivate. Vrátí ukazatel na aktivační objekt, který lze použít k vytvoření SAR.
Druhá funkce, která vrací aktivační objekt, je vyžadována, pokud přehráváte chráněný obsah, protože aktivační objekt musí být serializován do chráněného procesu. Pokud chcete vymazat obsah, můžete použít některou z těchto funkcí.
SAR může přijímat nekomprimovaný zvuk ve formátu PCM nebo IEEE s plovoucí desetinou čárkou. Pokud je rychlost přehrávání rychlejší nebo pomalejší než 1×, sar automaticky upraví výšku.
Konfigurace zvukového rendereru
Sar podporuje několik atributů konfigurace. Mechanismus nastavení těchto atributů závisí na tom, jakou funkci zavoláte k vytvoření SAR. Pokud použijete funkci MFCreateAudioRenderer, postupujte takto:
- Vytvořte nové úložiště atributů voláním MFCreateAttributes.
- Přidejte atributy do úložiště atributů.
- Předejte úložiště atributů do funkce MFCreateAudioRenderer v parametru pAudioAttributes.
Pokud použijete funkci MFCreateAudioRendererActivate, vrátí funkce ukazatel na rozhraní MMFAttributes v parametru ppActivate. Tento ukazatel použijte k přidání atributů.
Seznam konfiguračních atributů naleznete v tématu Atributy rendereru zvuku.
Výběr zařízení zvukového koncového bodu
zvukového koncového bodu je hardwarové zařízení, které buď vykresluje nebo zachytává zvuk. Mezi příklady patří reproduktory, sluchátka, mikrofony a přehrávače CD. Sar vždy používá zařízení pro vykreslování zvuku. Zařízení můžete vybrat dvěma způsoby.
Prvním přístupem je vytvoření výčtu zařízení pro vykreslování zvuku v systému pomocí rozhraní IMMDeviceEnumerator. Toto rozhraní je popsané v základní dokumentaci k rozhraní API pro zvuk.
- Vytvořte objekt enumerátoru zařízení.
- Pomocí enumerátoru zařízení můžete vytvořit výčet zařízení pro vykreslování zvuku. Každé zařízení je reprezentováno ukazatelem na rozhraní IMMDevice.
- Vyberte zařízení na základě vlastností zařízení nebo výběru uživatele.
- Zavolejte IMMDevice::GetId získat identifikátor zařízení.
- Nastavte identifikátor zařízení jako hodnotu atributu MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID.
Místo výčtu zařízení můžete zvukové zařízení zadat podle jeho role. Zvuková role identifikuje obecnou kategorii použití. Například role konzoly je definována pro hry a systémová oznámení, zatímco multimediální role je definována pro hudbu a filmy. Každá role má přiřazené jedno zařízení pro vykreslování zvuku a uživatel může tato přiřazení změnit. Pokud zadáte roli zařízení, sar použije pro tuto roli jakékoli zvukové zařízení. Pokud chcete zadat roli zařízení, nastavte atribut MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE.
Dva atributy uvedené v této části se vzájemně vylučují. Pokud některou z nich nenastavíte, použije sar zvukové zařízení, které je přiřazené roli eConsole.
Následující kód vypíše vykreslovací zařízení zvuku a přiřadí první zařízení v seznamu sar. V tomto příkladu se k vytvoření SAR používá funkce MFCreateAudioRenderer.
#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);
Chcete-li vytvořit aktivační objekt pro SAR, změňte kód, který se zobrazí po volání IMMDevice::GetId následující:
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);
Výběr zvukové relace
Zvuková relace je skupina souvisejících zvukových streamů, které může aplikace spravovat souhrnně. Aplikace může řídit úroveň svazku a ztlumit stav každé relace. Relace jsou identifikovány identifikátorem GUID. Pokud chcete zadat zvukovou relaci pro SAR, použijte atribut MF_AUDIO_RENDERER_ATTRIBUTE_SESSION_ID. Pokud tento atribut nenastavíte, sar připojí výchozí relaci pro tento proces identifikovanou GUID_NULL.
Ve výchozím nastavení je zvuková relace specifická pro proces, což znamená, že obsahuje pouze datové proudy z volajícího procesu. Pokud se chcete připojit k relaci křížového procesu, nastavte atribut MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS hodnotou MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_CROSSPROCESS.
Po vytvoření SAR použijete rozhraní MMFAudioPolicy k připojení relace ke skupině relací, z nichž všechny jsou řízeny stejným ovládacím panelem hlasitosti v ovládacím panelu. Pomocí tohoto rozhraní můžete také nastavit zobrazovaný název a ikonu, která se zobrazí v ovládacím prvku hlasitosti.
Řízení úrovní svazků
Pokud chcete řídit úroveň hlavního hlasitosti všech datových proudů ve zvukové relaci SAR, použijte rozhraní MMFSimpleAudioVolume. Chcete-li řídit objem jednotlivých datových proudů nebo řídit objem jednotlivých kanálů v rámci datového proudu, použijte MMFAudioStreamVolume rozhraní. Obě rozhraní jsou získána voláním MMFGetService::GetService. Můžete volat GetService přímo na SAR nebo ho volat v relaci médií. Úrovně svazku jsou vyjádřeny jako hodnoty ztlumení. Pro každý kanál je úroveň ztlumení produktem hlavního svazku a svazku kanálu.
Související témata