Share via


ストリーミング オーディオ レンダラー

ストリーミング オーディオ レンダラー (SAR) は、オーディオをレンダリングするメディア シンクです。 SAR の各インスタンスは、1 つのオーディオ ストリームをレンダリングします。 複数のストリームをレンダリングするには、SAR の複数のインスタンスを使用します。

SAR を作成するには、次のいずれかの関数を呼び出します。

アクティブ化オブジェクトを再生する場合は、アクティブ化オブジェクトを保護されたプロセスにシリアル化する必要があるため、アクティブ化オブジェクトを返す 2 番目の関数が必要です。 コンテンツをクリアするには、どちらの関数も使用できます。

SAR は、PCM または IEEE 浮動小数点形式で非圧縮オーディオを受信できます。 再生速度が 1× より速いか遅い場合は、SAR によってピッチが自動的に調整されます。

オーディオ レンダラーの構成

SAR では、いくつかの構成属性がサポートされています。 これらの属性を設定するメカニズムは、SAR を作成するために呼び出す関数によって異なります。 MFCreateAudioRenderer 関数を使用する場合は、次の操作を行います。

  1. MFCreateAttributes を呼び出して、新しい属性ストアを作成します。
  2. 属性ストアに属性を追加します。
  3. pAudioAttributes パラメーターの MFCreateAudioRenderer 関数に属性ストアを渡します。

MFCreateAudioRendererActivate 関数を使用する場合、関数は ppActivate パラメーターの IMFAttributes インターフェイスへのポインターを返します。 属性を追加するには、このポインターを使用します。

構成属性の一覧については、「 オーディオ レンダラー属性」を参照してください。

オーディオ エンドポイント デバイスの選択

オーディオ エンドポイント デバイスは、オーディオをレンダリングまたはキャプチャするハードウェア デバイスです。 たとえば、スピーカー、ヘッドフォン、マイク、CD プレーヤーなどがあります。 SAR は常にオーディオ レンダリング デバイスを使用します。 デバイスを選択するには、2 つの方法があります。

最初の方法は、 IMMDeviceEnumerator インターフェイスを使用して、システム上のオーディオ レンダリング デバイスを列挙することです。 このインターフェイスは、オーディオ API のコア ドキュメントに記載されています。

  1. デバイス列挙子オブジェクトを作成します。
  2. デバイス列挙子を使用して、オーディオ レンダリング デバイスを列挙します。 各デバイスは、 IMMDevice インターフェイスへのポインターで表されます。
  3. デバイスのプロパティまたはユーザーの選択に基づいて、デバイスを選択します。
  4. IMMDevice::GetId を呼び出して、デバイス識別子を取得します。
  5. デバイス識別子を MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID 属性の値として設定します。

デバイスを列挙するのではなく、その 役割でオーディオ デバイスを指定できます。 オーディオ ロールは、使用の一般的なカテゴリを識別します。 たとえば、 コンソール ロールはゲームとシステム通知に対して定義され、 マルチメディア ロールは音楽と映画に対して定義されます。 各ロールには 1 つのオーディオ レンダリング デバイスが割り当てられ、ユーザーはこれらの割り当てを変更できます。 デバイス ロールを指定すると、SAR はそのロールに割り当てられているオーディオ デバイスを使用します。 デバイス ロールを指定するには、 MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE 属性を設定します。

このセクションに記載されている 2 つの属性は相互に排他的です。 どちらの設定も行わない場合、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_CROSSPROCESS値を使用して MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS 属性を設定します。

SAR を作成した後、 IMFAudioPolicy インターフェイスを使用してセッションのグループにセッションを参加させます。そのすべてが、コントロール パネルの同じボリューム コントロールによって制御されます。 このインターフェイスを使用して、ボリューム コントロールに表示される表示名とアイコンを設定することもできます。

ボリューム レベルの制御

SAR のオーディオ セッション内のすべてのストリームのマスター ボリューム レベルを制御するには、 IMFSimpleAudioVolume インターフェイスを使用します。 個々のストリームのボリュームを制御したり、ストリーム内の個々のチャネルのボリュームを制御したりするには、 IMFAudioStreamVolume インターフェイスを使用します。 どちらのインターフェイスも、 IMFGetService::GetService を呼び出すことによって取得されます。 SAR で GetService を 直接呼び出すか、メディア セッションで呼び出すことができます。 ボリューム レベルは減衰値として表されます。 各チャネルについて、減衰レベルはマスター ボリュームとチャネル ボリュームの積です。

オーディオ/ビデオの再生