ストリーミング オーディオ レンダラー
ストリーミング オーディオ レンダラー (SAR) は、オーディオをレンダリングするメディア シンクです。 SAR の各インスタンスは、1 つのオーディオ ストリームをレンダリングします。 複数のストリームをレンダリングするには、SAR の複数のインスタンスを使用します。
SAR を作成するには、次のいずれかの関数を呼び出します。
- MFCreateAudioRendererをします。 SAR へのポインターを返します。
- MFCreateAudioRendererActivateをします。 SAR の作成に使用できるアクティブ化オブジェクトへのポインターを返します。
アクティブ化オブジェクトを保護されたプロセスにシリアル化する必要があるため、保護されたコンテンツを再生する場合は、アクティブ化オブジェクトを返す 2 番目の関数が必要です。 コンテンツをクリアするには、どちらの関数も使用できます。
SAR は、PCM または IEEE 浮動小数点形式で非圧縮オーディオを受信できます。 再生速度が 1× より速いか遅い場合、SAR は自動的にピッチを調整します。
オーディオ レンダラーの構成
SAR では、いくつかの構成属性がサポートされています。 これらの属性を設定するメカニズムは、SAR を作成するために呼び出す関数によって異なります。 MFCreateAudioRenderer 関数を使用する場合は、次の操作を行います。
- MFCreateAttributes呼び出して、新しい属性ストアを作成します。
- 属性ストアに属性を追加します。
- pAudioAttributes パラメーターの MFCreateAudioRenderer 関数に属性ストアを渡します。
MFCreateAudioRendererActivate 関数を使用すると、ppActivate パラメーターの IMFAttributes インターフェイスへのポインターが返されます。 このポインターを使用して属性を追加します。
構成属性の一覧については、「オーディオ レンダラー属性 」を参照してください。
オーディオ エンドポイント デバイスの選択
オーディオ エンドポイント デバイス は、オーディオをレンダリングまたはキャプチャするハードウェア デバイスです。 たとえば、スピーカー、ヘッドフォン、マイク、CD プレーヤーなどがあります。 SAR は常にオーディオ レンダリング デバイスを使用します。 デバイスを選択するには、2 つの方法があります。
1 つ目の方法は、IMMDeviceEnumerator インターフェイスを使用して、システム上のオーディオ レンダリング デバイスを列挙することです。 このインターフェイスは、コア オーディオ API のドキュメントに記載されています。
- デバイス列挙子オブジェクトを作成します。
- デバイス列挙子を使用して、オーディオ レンダリング デバイスを列挙します。 各デバイスは、IMMDevice インターフェイスへのポインターによって表されます。
- デバイスのプロパティまたはユーザーの選択に基づいて、デバイスを選択します。
- IMMDevice::GetId呼び出して、デバイス識別子を取得します。
- デバイス識別子を 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を呼び出すことによって取得されます。 GetService を SAR で直接呼び出すか、メディア セッションで呼び出すことができます。 ボリューム レベルは減衰値として表されます。 各チャネルの減衰レベルは、マスター ボリュームとチャネル ボリュームの積です。
関連トピック