ISpatialAudioClient
COM公式ドキュメント
ISpatialAudioClient インターフェイスは、3D 空間内の位置から音声を発するオーディオストリームをクライアントが作成できるようにします。
解説(Remarks)
次のサンプルコードは、IMMDevice を使用してこのインターフェイスを初期化する方法を示します。
HRESULT hr;
Microsoft::WRL::ComPtr<IMMDeviceEnumerator> deviceEnum;
Microsoft::WRL::ComPtr<IMMDevice> defaultDevice;
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&deviceEnum);
hr = deviceEnum->GetDefaultAudioEndpoint(EDataFlow::eRender, eMultimedia, &defaultDevice);
Microsoft::WRL::ComPtr<ISpatialAudioClient> spatialAudioClient;
hr = defaultDevice->Activate(__uuidof(ISpatialAudioClient), CLSCTX_INPROC_SERVER, nullptr, (void**)&spatialAudioClient);
IMMDevice にアクセスできない UWP アプリの場合は、ActivateAudioInterfaceAsync を呼び出して ISpatialAudioClient のインスタンスを取得してください。例については、WindowsAudioSession サンプルを参照してください。
メソッド 8
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
指定された静的空間オーディオチャネルの 3D 空間内の位置を取得します。
| type | AudioObjectType | in | 位置を照会する対象の静的空間オーディオチャネルを示す値。値が静的チャネルを表さない場合(AudioObjectType_Dynamic および AudioObjectType_None を含む)、このメソッドは E_INVALIDARG を返します。 |
| x | FLOAT* | out | 静的オーディオチャネルの x 座標(メートル単位、リスナーからの相対位置)。正の値はリスナーの右側、負の値は左側を表します。 |
| y | FLOAT* | out | 静的オーディオチャネルの y 座標(メートル単位、リスナーからの相対位置)。正の値はリスナーの上方、負の値は下方を表します。 |
| z | FLOAT* | out | 静的オーディオチャネルの z 座標(メートル単位、リスナーからの相対位置)。正の値はリスナーの後方、負の値は前方を表します。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合、返される可能性のあるコードには次の表に示す値が含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| 指定された AudioObjectType 値が静的チャネルを表していません。 |
解説(Remarks)
位置の値は、各単位が 1 メートルを表す右手系デカルト座標系を使用します。この座標系はリスナーを基準としており、原点(x=0.0, y=0.0, z=0.0)はリスナーの両耳の中心点を表します。
現在のレンダリングエンジンにネイティブな静的スピーカーベッドチャネルのサブセットを表すチャネルマスクを取得します。
| mask | AudioObjectType* | out | 静的スピーカーチャネルのサブセットを示す、AudioObjectType 列挙型の値のビットごとの組み合わせ。返される値には静的チャネルの値のみが含まれ、AudioObjectType_Dynamic は含まれません。 |
戻り値
メソッドが成功した場合は S_OK を返します。
空間オーディオクライアントの動的オーディオオブジェクトの最大数を取得します。
| value | DWORD* | out | このクライアントの動的オブジェクトの最大数を取得します。 |
戻り値
メソッドが成功した場合は S_OK を返します。
解説(Remarks)
動的な ISpatialAudioObject とは、ISpatialAudioObjectRenderStream::ActivateSpatialAudioObject メソッドの type パラメーターを AudioObjectType_Dynamic に設定してアクティブ化されたものです。クライアントには、同時にアクティブ化できる動的空間オーディオオブジェクトの最大数の上限があります。オーディオレンダリングパイプラインの容量が変化すると、システムは同時に使用できる動的空間オーディオオブジェクトの最大数を動的に調整します。その前に、システムは OnAvailableDynamicObjectCountChange を呼び出し、リソース上限の変更をクライアントに通知します。
ISpatialAudioObject が使用されなくなった場合は、その Release を呼び出してリソースを解放し、新しい動的空間オーディオオブジェクトを作成できるようにしてください。
Windows Sonic が利用できない場合(たとえば、ノートパソコンに内蔵されたステレオスピーカーで再生している場合や、ユーザーがデバイス上で Windows Sonic を明示的に有効にしていない場合)、GetMaxDynamicObjectCount がアプリケーションに返す利用可能な動的オブジェクトの数は 0 になります。
空間オーディオオブジェクトでサポートされているすべてのオーディオ形式を含む IAudioFormatEnumerator を取得します。リスト内の最初の項目が最も推奨される形式を表します。
| enumerator | IAudioFormatEnumerator** | out | IAudioFormatEnumerator インターフェイスを受け取るポインターへのポインター。 |
戻り値
メソッドが成功した場合は S_OK を返します。
1 回の処理パスあたりの最大フレーム数を取得します。このメソッドは、各処理パスでオーディオデータを伝送するために割り当てるべきソースバッファーのサイズを決定するために使用できます。
| objectFormat | WAVEFORMATEX* | in | 最大フレーム数の計算に使用するオーディオ形式。これは、ActivateSpatialAudioStream に渡される SpatialAudioObjectRenderStreamActivationParams の ObjectFormat フィールドで指定したものと同じ形式である必要があります。 |
| frameCountPerBuffer | DWORD* | out | 1 回のパスで処理されるオーディオフレームの最大数。 |
戻り値
メソッドが成功した場合は S_OK を返します。
ISpatialAudioObjectRenderStream が指定された形式をサポートするかどうかを示す値を取得します。
| objectFormat | WAVEFORMATEX* | in | サポートの有無を照会する対象の形式。 |
戻り値
指定された形式がサポートされている場合は S_OK を返します。指定された形式がサポートされていない場合、このメソッドは AUDCLNT_E_UNSUPPORTED_FORMAT を返します。
成功した場合、現在アクティブな空間レンダリングエンジンが指定された空間オーディオレンダーストリームをサポートするかどうかを示す値を取得します。
| streamUuid | GUID* | in | 利用可能性を照会する対象のインターフェイスのインターフェイス ID。 |
| auxiliaryInfo | PROPVARIANT* | inoptional | サポートを照会する際に使用される追加情報を含む構造体。詳細については、「解説」を参照してください。 |
戻り値
メソッドが成功した場合は S_OK を返します。失敗した場合、返される可能性のあるコードには次の表に示す値が含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
|
指定されたストリームインターフェイスは、現在アクティブなレンダリングエンジンではアクティブ化できません。 |
|
auxiliaryInfo パラメーターで指定されたメタデータ形式は、現在のレンダリングエンジンではサポートされていません。詳細については、「解説」を参照してください。 |
解説(Remarks)
ISpatialAudioObjectRenderStreamForMetadata を照会する際、auxiliaryInfo パラメーターを使用して特定のメタデータ形式がサポートされているかどうかを照会できます。次のコード例は、メタデータ形式のサポートを確認するために PROPVARIANT 構造体を初期化する方法を示します。
PROPVARIANT auxiliaryInfo;
auxiliaryInfo.vt = VT_CLSID;
auxiliaryInfo.puuid = const_cast<CLSID*>(&CONTOSO_SPATIAL_METADATA_V1_0);
指定されたメタデータ形式がサポートされていない場合、IsSpatialAudioStreamAvailable は SPTLAUDCLNT_E_METADATA_FORMAT_IS_NOT_SUPPORTED を返します。
空間オーディオストリームアクティブ化構造体のいずれかを使用して、空間オーディオストリームをアクティブ化して初期化します。
| activationParams | PROPVARIANT* | in | 空間オーディオストリームのアクティブ化パラメーターを定義する構造体。vt フィールドは VT_BLOB に設定し、blob フィールドには SpatialAudioObjectRenderStreamActivationParams または SpatialAudioObjectRenderStreamForMetadataActivationParams を設定する必要があります。 |
| riid | GUID* | in | アクティブ化する空間オーディオストリームインターフェイスの UUID。 |
| stream | void** | out | アクティブ化された空間オーディオインターフェイスを受け取るポインターへのポインター。 |
戻り値
メソッドが成功した場合は S_OK を返します。
解説(Remarks)
このメソッドは、次の空間オーディオストリームインターフェイスのアクティブ化をサポートします。
ISpatialAudioObjectRenderStream
ISpatialAudioObjectRenderStreamForMetadata
例
Microsoft::WRL::ComPtr<ISpatialAudioClient> spatialAudioClient;
// Activate ISpatialAudioClient on the desired audio-device
hr = defaultDevice->Activate(__uuidof(ISpatialAudioClient), CLSCTX_INPROC_SERVER, nullptr, (void**)&spatialAudioClient);
hr = spatialAudioClient->IsAudioObjectFormatSupported(&format);
// Create the event that will be used to signal the client for more data
HANDLE bufferCompletionEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
SpatialAudioObjectRenderStreamActivationParams streamParams;
streamParams.ObjectFormat = &format;
streamParams.StaticObjectTypeMask = ChannelMask_Stereo;
streamParams.MinDynamicObjectCount = 0;
streamParams.MaxDynamicObjectCount = 0;
streamParams.Category = AudioCategory_SoundEffects;
streamParams.EventHandle = bufferCompletionEvent;
streamParams.NotifyObject = nullptr;
PROPVARIANT activationParams;
PropVariantInit(&activationParams);
activationParams.vt = VT_BLOB;
activationParams.blob.cbSize = sizeof(streamParams);
activationParams.blob.pBlobData = reinterpret_cast<BYTE *>(&streamParams);
Microsoft::WRL::ComPtr<ISpatialAudioObjectRenderStream> spatialAudioStream;
hr = spatialAudioClient->ActivateSpatialAudioStream(&activationParams, __uuidof(spatialAudioStream), (void**)&spatialAudioStream);
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ISpatialAudioClient "{BBF8E066-AAAA-49BE-9A4D-FD2A858EA27F}" #usecom global ISpatialAudioClient IID_ISpatialAudioClient "{}" #comfunc global ISpatialAudioClient_GetStaticObjectPosition 3 int,var,var,var #comfunc global ISpatialAudioClient_GetNativeStaticObjectTypeMask 4 var #comfunc global ISpatialAudioClient_GetMaxDynamicObjectCount 5 var #comfunc global ISpatialAudioClient_GetSupportedAudioObjectFormatEnumerator 6 sptr #comfunc global ISpatialAudioClient_GetMaxFrameCount 7 var,var #comfunc global ISpatialAudioClient_IsAudioObjectFormatSupported 8 var #comfunc global ISpatialAudioClient_IsSpatialAudioStreamAvailable 9 var,var #comfunc global ISpatialAudioClient_ActivateSpatialAudioStream 10 var,var,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ISpatialAudioClient "{BBF8E066-AAAA-49BE-9A4D-FD2A858EA27F}" #usecom global ISpatialAudioClient IID_ISpatialAudioClient "{}" #comfunc global ISpatialAudioClient_GetStaticObjectPosition 3 int,sptr,sptr,sptr #comfunc global ISpatialAudioClient_GetNativeStaticObjectTypeMask 4 sptr #comfunc global ISpatialAudioClient_GetMaxDynamicObjectCount 5 sptr #comfunc global ISpatialAudioClient_GetSupportedAudioObjectFormatEnumerator 6 sptr #comfunc global ISpatialAudioClient_GetMaxFrameCount 7 sptr,sptr #comfunc global ISpatialAudioClient_IsAudioObjectFormatSupported 8 sptr #comfunc global ISpatialAudioClient_IsSpatialAudioStreamAvailable 9 sptr,sptr #comfunc global ISpatialAudioClient_ActivateSpatialAudioStream 10 sptr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。