Ljudåtergivning för direktuppspelning
SAR (Streaming Audio Renderer) är en mediemottagare som återger ljud. Varje instans av SAR återger en enda ljudström. Om du vill återge flera strömmar använder du flera instanser av SAR.
Om du vill skapa SAR anropar du någon av följande funktioner:
- MFCreateAudioRenderer. Returnerar en pekare till SAR.
- MFCreateAudioRendererActivate. Returnerar en pekare till ett aktiveringsobjekt som kan användas för att skapa SAR.
Den andra funktionen, som returnerar ett aktiveringsobjekt, krävs om du spelar upp skyddat innehåll eftersom aktiveringsobjektet måste serialiseras till den skyddade processen. För rensat innehåll kan du använda någon av funktionerna.
SAR kan ta emot okomprimerat ljud i antingen PCM- eller IEEE-flyttalformat. Om uppspelningshastigheten är snabbare eller långsammare än 1× justerar SAR automatiskt tonhöjden.
Konfigurera ljudåtergivningen
SAR stöder flera konfigurationsattribut. Mekanismen för att ange dessa attribut beror på vilken funktion du anropar för att skapa SAR. Om du använder funktionen MFCreateAudioRenderer gör du följande:
- Skapa ett nytt attributarkiv genom att anropa MFCreateAttributes.
- Lägg till attributen i attributarkivet.
- Skicka attributarkivet till funktionen MFCreateAudioRenderer i parametern pAudioAttributes.
Om du använder funktionen MFCreateAudioRendererActivate returnerar funktionen en pekare till IMFAttributes-gränssnittet i parametern ppActivate. Använd den här pekaren för att lägga till attributen.
En lista över konfigurationsattribut finns i Audio Renderer Attributes.
Välja ljudslutpunktsenhet
En ljudslutpunktsenhet är en maskinvaruenhet som antingen renderar eller avbildar ljud. Exempel är högtalare, hörlurar, mikrofoner och CD-spelare. SAR använder alltid en ljudåtergivningsenhet. Det finns två sätt att välja enheten.
Den första metoden är att räkna upp ljudrenderingsenheterna i systemet med hjälp av IMMDeviceEnumerator--gränssnittet. Det här gränssnittet finns dokumenterat i dokumentationen för api:et för kärnljud.
- Skapa enhetens uppräkningsobjekt.
- Använd enhetsuppräknaren för att räkna upp ljudåtergivningsenheter. Varje enhet representeras av en pekare till IMMDevice-gränssnittet.
- Välj en enhet baserat på enhetsegenskaperna eller användarens val.
- Anropa IMMDevice::GetId för att hämta enhetsidentifieraren.
- Ange enhetsidentifieraren som värdet för attributet MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID.
I stället för att räkna upp enheter kan du ange ljudenheten efter dess roll. En ljudroll identifierar en allmän användningskategori. Till exempel definieras -konsolen roll för spel och systemmeddelanden, medan den multimedierollen definieras för musik och filmer. Varje roll har en tilldelad ljudåtergivningsenhet och användaren kan ändra dessa tilldelningar. Om du anger en enhetsroll använder SAR den ljudenhet som har tilldelats den rollen. Ange enhetsrollen genom att ange attributet MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE.
De två attribut som anges i det här avsnittet är ömsesidigt uteslutande. Om du inte anger någon av dem använder SAR ljudenheten som är tilldelad till eConsole- roll.
Följande kod räknar upp ljudåtergivningsenheterna och tilldelar den första enheten i listan till SAR. I det här exemplet används funktionen MFCreateAudioRenderer för att skapa 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);
Om du vill skapa aktiveringsobjektet för SAR ändrar du koden som visas efter anropet till IMMDevice::GetId till följande:
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älja ljudsession
En ljudsession är en grupp relaterade ljudströmmar som ett program kan hantera tillsammans. Programmet kan styra volymnivån och stänga av ljudet för varje session. Sessioner identifieras av GUID. Om du vill ange ljudsessionen för SAR använder du attributet MF_AUDIO_RENDERER_ATTRIBUTE_SESSION_ID. Om du inte anger det här attributet ansluter SAR till standardsessionen för den processen, som identifieras av GUID_NULL.
Som standard är en ljudsession processspecifik, vilket innebär att den endast innehåller strömmar från samtalsprocessen. Om du vill ansluta till en session mellan processer anger du attributet MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS med värdet MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_CROSSPROCESS.
När du har skapat SAR använder du gränssnittet IMFAudioPolicy för att ansluta sessionen till en grupp sessioner, som alla styrs av samma volymkontroll i kontrollpanelen. Du kan också använda det här gränssnittet för att ange visningsnamnet och ikonen som visas i volymkontrollen.
Kontrollera volymnivåer
Om du vill styra huvudvolymnivån för alla strömmar i SAR:s ljudsession använder du IMFSimpleAudioVolume-gränssnittet. Använd IMFAudioStreamVolume-gränssnittet för att styra volymen för enskilda kanaler i en ström. Båda gränssnitten hämtas genom att anropa IMFGetService::GetService. Du kan anropa GetService direkt på SAR eller anropa den i mediasessionen. Volymnivåer uttrycks som dämpningsvärden. För varje kanal är dämpningsnivån produkten av huvudvolymen och kanalvolymen.
Relaterade ämnen