스트리밍 오디오 렌더러

SAR(스트리밍 오디오 렌더러)은 오디오를 렌더링하는 미디어 싱크입니다. SAR의 각 instance 단일 오디오 스트림을 렌더링합니다. 여러 스트림을 렌더링하려면 SAR의 여러 인스턴스를 사용합니다.

SAR을 만들려면 다음 함수 중 하나를 호출합니다.

활성화 개체를 보호하는 프로세스로 직렬화해야 하므로 보호된 콘텐츠를 재생하는 경우 활성화 개체를 반환하는 두 번째 함수가 필요합니다. 명확한 콘텐츠의 경우 두 함수 중 하나를 사용할 수 있습니다.

SAR은 PCM 또는 IEEE 부동 소수점 형식으로 압축되지 않은 오디오를 받을 수 있습니다. 재생 속도가 1×보다 빠르거나 느리면 SAR이 자동으로 피치를 조정합니다.

오디오 렌더러 구성

SAR은 여러 구성 특성을 지원합니다. 이러한 특성을 설정하는 메커니즘은 SAR을 만들기 위해 호출하는 함수에 따라 달라집니다. MFCreateAudioRenderer 함수를 사용하는 경우 다음을 수행합니다.

  1. MFCreateAttributes를 호출하여 새 특성 저장소를 만듭니다.
  2. 특성 저장소에 특성을 추가합니다.
  3. pAudioAttributes 매개 변수의 MFCreateAudioRenderer 함수에 특성 저장소를 전달합니다.

MFCreateAudioRendererActivate 함수를 사용하는 경우 함수는 ppActivate 매개 변수의 IMFAttributes 인터페이스에 대한 포인터를 반환합니다. 이 포인터를 사용하여 특성을 추가합니다.

구성 특성 목록은 오디오 렌더러 특성을 참조하세요.

오디오 엔드포인트 디바이스 선택

오디오 엔드포인트 디바이스는 오디오를 렌더링하거나 캡처하는 하드웨어 디바이스입니다. 예를 들어 스피커, 헤드폰, 마이크 및 CD 플레이어가 있습니다. SAR은 항상 오디오 렌더링 디바이스를 사용합니다. 디바이스를 선택하는 방법에는 두 가지가 있습니다.

첫 번째 방법은 IMMDeviceEnumerator 인터페이스를 사용하여 시스템의 오디오 렌더링 디바이스를 열거하는 것입니다. 이 인터페이스는 핵심 오디오 API 설명서에 설명되어 있습니다.

  1. 디바이스 열거자 개체를 만듭니다.
  2. 디바이스 열거자를 사용하여 오디오 렌더링 디바이스를 열거합니다. 각 디바이스는 IMMDevice 인터페이스에 대한 포인터로 표시됩니다.
  3. 디바이스 속성 또는 사용자의 선택에 따라 디바이스를 선택합니다.
  4. IMMDevice::GetId를 호출하여 디바이스 식별자를 가져옵니다.
  5. 디바이스 식별자를 MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID 특성의 값으로 설정합니다.

디바이스를 열거하는 대신 해당 역할별로 오디오 디바이스를 지정할 수 있습니다. 오디오 역할은 일반적인 사용 범주를 식별합니다. 예를 들어 콘솔 역할은 게임 및 시스템 알림에 대해 정의되고 멀티미디어 역할은 음악 및 영화에 대해 정의됩니다. 각 역할에는 하나의 오디오 렌더링 디바이스가 할당되어 있으며 사용자는 이러한 할당을 변경할 수 있습니다. 디바이스 역할을 지정하는 경우 SAR은 해당 역할에 할당된 오디오 디바이스를 사용합니다. 디바이스 역할을 지정하려면 MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE 특성을 설정합니다.

이 섹션에 나열된 두 특성은 상호 배타적입니다. 둘 중 하나를 설정하지 않으면 SAR은 eConsole 역할에 할당된 오디오 디바이스를 사용합니다.

다음 코드는 오디오 렌더링 디바이스를 열거하고 목록의 첫 번째 디바이스를 SAR에 할당합니다. 이 예제에서는 MFCreateAudioRenderer 함수를 사용하여 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);

SAR에 대한 활성화 개체를 만들려면 IMMDevice::GetId 를 호출한 후 표시되는 코드를 다음으로 변경합니다.

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

오디오 세션 선택

오디오 세션은 애플리케이션이 전체적으로 관리할 수 있는 관련 오디오 스트림 그룹입니다. 애플리케이션은 볼륨 수준을 제어하고 각 세션의 상태를 음소거할 수 있습니다. 세션은 GUID로 식별됩니다. SAR에 대한 오디오 세션을 지정하려면 MF_AUDIO_RENDERER_ATTRIBUTE_SESSION_ID 특성을 사용합니다. 이 특성을 설정하지 않으면 SAR은 GUID_NULL 식별되는 해당 프로세스의 기본 세션에 조인합니다.

기본적으로 오디오 세션은 프로세스에 따라 다릅니다. 즉, 호출 프로세스의 스트림만 포함됩니다. 프로세스 간 세션에 참가하려면 MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS 특성을 MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_CROSSPROCESS값으로 설정합니다.

SAR을 만든 후 IMFAudioPolicy 인터페이스를 사용하여 세션을 세션 그룹에 조인합니다. 이 모든 세션은 제어판의 동일한 볼륨 제어에 의해 제어됩니다. 이 인터페이스를 사용하여 볼륨 컨트롤에 표시되는 표시 이름과 아이콘을 설정할 수도 있습니다.

볼륨 수준 제어

SAR의 오디오 세션에 있는 모든 스트림의 master 볼륨 수준을 제어하려면 IMFSimpleAudioVolume 인터페이스를 사용합니다. 개별 스트림의 볼륨을 제어하거나 스트림 내의 개별 채널 볼륨을 제어하려면 IMFAudioStreamVolume 인터페이스를 사용합니다. 두 인터페이스 모두 IMFGetService::GetService를 호출하여 가져옵니다. SAR에서 직접 GetService 를 호출하거나 미디어 세션에서 호출할 수 있습니다. 볼륨 수준은 감쇠 값으로 표현됩니다. 각 채널에 대해 감쇠 수준은 master 볼륨 및 채널 볼륨의 산물입니다.

오디오/비디오 재생