Udostępnij za pośrednictwem


Moduł renderowania audio przesyłania strumieniowego

Program renderujący audio przesyłania strumieniowego (SAR) to ujście multimediów, które renderuje dźwięk. Każde wystąpienie sar renderuje pojedynczy strumień audio. Aby renderować wiele strumieni, użyj wielu wystąpień sar.

Aby utworzyć sar, wywołaj jedną z następujących funkcji:

Druga funkcja, która zwraca obiekt aktywacji, jest wymagana w przypadku odtwarzania chronionej zawartości, ponieważ obiekt aktywacji musi być serializowany do chronionego procesu. Aby wyczyścić zawartość, możesz użyć jednej z tych funkcji.

Sar może odbierać nieskompresowany dźwięk w formacie zmiennoprzecinkowym PCM lub IEEE. Jeśli szybkość odtwarzania jest szybsza lub niższa niż 1×, sar automatycznie dostosowuje wysokość.

Konfigurowanie modułu renderowania audio

Sar obsługuje kilka atrybutów konfiguracji. Mechanizm ustawiania tych atrybutów zależy od funkcji wywoływanej w celu utworzenia sar. Jeśli używasz funkcji MFCreateAudioRenderer, wykonaj następujące czynności:

  1. Utwórz nowy magazyn atrybutów, wywołując MFCreateAttributes.
  2. Dodaj atrybuty do magazynu atrybutów.
  3. Przekaż magazyn atrybutów do funkcji MFCreateAudioRenderer w parametrze pAudioAttributes.

Jeśli używasz funkcji MFCreateAudioRendererActivate, funkcja zwraca wskaźnik do interfejsu IMFAttributes w parametrze ppActivate. Użyj tego wskaźnika, aby dodać atrybuty.

Aby uzyskać listę atrybutów konfiguracji, zobacz Atrybuty modułu renderowania audio.

Wybieranie urządzenia punktu końcowego audio

Urządzenie punktu końcowego audio to urządzenie sprzętowe, które renderuje lub przechwytuje dźwięk. Przykłady obejmują głośniki, słuchawki, mikrofony i odtwarzacze CD. Sar zawsze używa urządzenia do renderowania dźwięku. Istnieją dwa sposoby wybierania urządzenia.

Pierwszym podejściem jest wyliczenie urządzeń renderowania audio w systemie przy użyciu interfejsu IMMDeviceEnumerator. Ten interfejs jest udokumentowany w dokumentacji podstawowego interfejsu API audio.

  1. Utwórz obiekt modułu wyliczającego urządzenia.
  2. Użyj modułu wyliczającego urządzenia, aby wyliczyć urządzenia renderowania audio. Każde urządzenie jest reprezentowane przez wskaźnik do interfejsu IMMDevice.
  3. Wybierz urządzenie na podstawie właściwości urządzenia lub wyboru użytkownika.
  4. Wywołaj IMMDevice::GetId, aby uzyskać identyfikator urządzenia.
  5. Ustaw identyfikator urządzenia jako wartość atrybutu MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID.

Zamiast wyliczać urządzenia, można określić urządzenie audio za pomocą roli . Rola audio identyfikuje ogólną kategorię użycia. Na przykład rola konsoli jest definiowana dla gier i powiadomień systemowych, podczas gdy rola multimedialna jest definiowana dla muzyki i filmów. Każda rola ma przypisane jedno urządzenie do renderowania audio, a użytkownik może zmienić te przypisania. Jeśli określisz rolę urządzenia, sar używa dowolnego urządzenia audio przypisanego do tej roli. Aby określić rolę urządzenia, ustaw atrybut MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE.

Dwa atrybuty wymienione w tej sekcji wzajemnie się wykluczają. Jeśli nie ustawisz żadnej z nich, sar używa urządzenia audio przypisanego do roli eConsole.

Poniższy kod wylicza urządzenia renderowania audio i przypisuje pierwsze urządzenie na liście do sar. W tym przykładzie użyto funkcji MFCreateAudioRenderer w celu utworzenia 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);

Aby utworzyć obiekt aktywacji dla sar, zmień kod wyświetlany po wywołaniu IMMDevice::GetId na następujące:

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);

Wybieranie sesji audio

Sesja audio to grupa powiązanych strumieni audio, którymi aplikacja może zarządzać zbiorczo. Aplikacja może kontrolować poziom woluminu i stan wyciszenia każdej sesji. Sesje są identyfikowane przez identyfikator GUID. Aby określić sesję dźwiękową sar, użyj atrybutu MF_AUDIO_RENDERER_ATTRIBUTE_SESSION_ID. Jeśli ten atrybut nie zostanie ustawiony, sar dołącza do sesji domyślnej dla tego procesu, zidentyfikowane przez GUID_NULL.

Domyślnie sesja audio jest specyficzna dla procesu, co oznacza, że zawiera tylko strumienie z procesu wywołującego. Aby dołączyć do sesji między procesami, ustaw atrybut MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS z wartością MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_CROSSPROCESS.

Po utworzeniu sar użyjesz interfejsu IMFAudioPolicy, aby dołączyć sesję do grupy sesji, z których wszystkie są kontrolowane przez tę samą kontrolkę głośności w panelu sterowania. Możesz również użyć tego interfejsu, aby ustawić nazwę wyświetlaną i ikonę wyświetlaną w kontrolce głośności.

Kontrolowanie poziomów głośności

Aby kontrolować poziom głośności głównej wszystkich strumieni w sesji audio SAR, użyj interfejsu IMFSimpleAudioVolume. Aby kontrolować wolumin pojedynczego strumienia lub sterować ilością poszczególnych kanałów w strumieniu, użyj interfejsu IMFAudioStreamVolume. Oba interfejsy są uzyskiwane przez wywołanie IMFGetService::GetService. Możesz wywołać GetService bezpośrednio na serwerze SAR lub wywołać go w sesji multimediów. Poziomy woluminu są wyrażane jako wartości tłumienia. Dla każdego kanału poziom tłumienia jest produktem woluminu głównego i woluminu kanału.

odtwarzania audio/wideo