IDirectMusicSynthSink
COM公式ドキュメント
IDirectMusicSynthSink インターフェイスは現在ではほぼ廃止されており、DirectX 8 より前のバージョンの DirectMusic でのみサポートされます。
メソッド 8
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
Init メソッドは、シンスシンク (synth-sink) オブジェクトを初期化します。
| pSynth | IDirectMusicSynth* | in | シンスシンクオブジェクトの接続先となるシンセオブジェクトへのポインター。このパラメーターは、有効かつ NULL でない IDirectMusicSynth オブジェクトへのポインターです。 |
戻り値
呼び出しが成功した場合、Init は S_OK を返します。それ以外の場合は、該当するエラーコードを返します。
解説(Remarks)
IDirectMusicSynth::SetSynthSink の呼び出しによってシンセサイザーがシンスシンクに接続されると、シンセサイザーはシンスシンクの Init メソッドを呼び出します。
循環参照を避けるため、IDirectMusicSynthSink は IDirectMusicSynth シンセオブジェクトの参照カウントを増やしません。代わりに、IDirectMusicSynth オブジェクトが常に親であり、使用を終えたときには常に IDirectMusicSynthSink オブジェクトを解放するという規則に従います。
接続後、シンスシンクは IDirectMusicSynthSink::Activate の呼び出しによってアクティブ化する必要があります。この時点でシンスシンクは wave バッファーの生成を開始し、IDirectMusicSynth::Render を呼び出してそれらをシンセサイザーに渡します。
pSynth パラメーターは、COM オブジェクトの参照カウントの規約に従います。
詳細については、Synthesizers and Wave Sinks を参照してください。また、Microsoft Windows SDK ドキュメントの IDirectMusic インターフェイスの説明も参照してください。
SetMasterClock メソッドは、DirectMusic の他の部分との同期に必要となるマスタータイムソースをシンスシンクに提供します。
| pClock | IReferenceClock* | in | 同期先となるマスタークロックを指定します。このパラメーターは、マスタークロックオブジェクトの IReferenceClock インターフェイス (Microsoft Windows SDK ドキュメントで説明) へのポインターです。 |
戻り値
呼び出しが成功した場合、SetMasterClock は S_OK を返します。それ以外の場合は、該当するエラーコードを返します。次の表に、返される可能性のあるステータスコードの一部を示します。
| 戻り値 | 説明 |
|---|---|
| メソッドがクロックを受け入れられないことを示します。 |
解説(Remarks)
シンスシンクは、ストリーミング wave を DirectMusic の他の部分と同期させるためのマスタークロックを受け取るまで機能できません。
マスタータイムとサンプルタイムは異なるクリスタル (発振子) で駆動されている可能性があるため、両者はずれていくことがあります。シンスシンクは、位相同期ループ (PLL) を用いて、現在のサンプルタイムの認識をマスタータイムにロックできます。
マスタークロックは、IDirectMusicSynth::GetLatencyClock の呼び出しによってシンスシンクから取得されるレイテンシークロックとは異なります。マスタークロックがタイムベースを提供するのに対し、レイテンシークロックは wave ストリームへのノートのレンダリングの進行状況を追跡するだけです。これにより、アプリケーションは IDirectMusicSynth::PlayBuffer メソッドを使用して再生用メッセージを送信できる最も早い時刻を知ることができます。レイテンシークロックはマスタークロックと厳密に同期している必要があるため、その単位は相対的なものです。
レイテンシークロックの時刻とマスタークロックの時刻を比較することで、シンセサイザーのレイテンシーを測定できます。なお、レイテンシークロックには、シンセサイザーのミキシングのバースト的な性質を反映したジッターが生じます (IDirectMusicSynth::Render の呼び出しごとにバッファー長の分だけ前方にジャンプします)。これに対して、マスタークロックは滑らかに増加します。
pClock パラメーターは、COM オブジェクトの参照カウントの規約に従います。
GetLatencyClock メソッドは、出力オーディオストリームの進行状況を測定するレイテンシークロックを取得します。
| ppClock | IReferenceClock** | out | レイテンシークロックの出力ポインター。このパラメーターは、呼び出し側が割り当てたポインター変数を指し、メソッドはそこにレイテンシークロックオブジェクトの IReferenceClock インターフェイス (Microsoft Windows SDK ドキュメントで説明) へのポインターを書き込みます。 |
戻り値
呼び出しが成功した場合、GetLatencyClock は S_OK を返します。それ以外の場合は、該当するエラーコードを返します。次の表に、返される可能性のあるステータスコードの一部を示します。
| 戻り値 | 説明 |
|---|---|
| メソッドがレイテンシークロックにアクセスできないことを示します。 |
解説(Remarks)
レイテンシー用の IReferenceClock は、その IReferenceClock::GetTime メソッドが呼び出されるたびに、現在のレンダリング時刻を返します。この時刻は常に、IDirectMusicSynthSink::SetMasterClock を使用してシンスシンクに設定されたマスタークロックによって確立された時刻からの相対値です。レイテンシー時刻は、DirectMusic のパフォーマンス層が、次にノートの再生を開始できる時刻を判別するために使用します。
ppClock パラメーターは、COM オブジェクトの参照カウントの規約に従います。
レイテンシークロックの詳細については、Synthesizer Latency を参照してください。また、Microsoft Windows SDK ドキュメントの IReferenceClock および IDirectMusic インターフェイスの説明も参照してください。
Activate メソッドは、シンセサイザーシンクをアクティブ化または非アクティブ化します。
| fEnable | BOOL | in | シンスシンクをアクティブ化するかどうかを指定します。TRUE の場合、メソッドはシンスシンクをアクティブ化します。FALSE の場合は非アクティブ化します。 |
戻り値
呼び出しが成功した場合、Activate は S_OK を返します。それ以外の場合は、該当するエラーコードを返します。次の表に、返される可能性のあるステータスコードの一部を示します。
| 戻り値 | 説明 |
|---|---|
| メソッドがシンスシンクをアクティブ化または非アクティブ化できないことを示します。 | |
|
シンセが設定されていないか、正しく構成されていないことを示します。 |
|
シンクが既にアクティブであることを示します。 |
|
SetDirectSound が正常に呼び出されていないことを示します。 |
|
SetMasterClock が正常に呼び出されていないことを示します。 |
解説(Remarks)
シンセサイザー自体に対して、オーディオデバイスの有効化または無効化を指示できます。これを受けてシンセサイザーは、オーディオデバイスを管理するシンスシンクを呼び出します。これにより、アプリケーションはリソースの使用を管理できます。音楽を再生していないときにシンクを非アクティブ化すれば、wave 出力デバイスを他のアプリケーションのために解放できます。
詳細については、Microsoft Windows SDK ドキュメントの IDirectMusic インターフェイスの説明を参照してください。
SampleToRefTime メソッドは、サンプルタイムをリファレンスタイムに変換します。
| llSampleTime | LONGLONG | in | サンプルタイムを指定します。詳細については、以下の「解説」セクションを参照してください。 |
| prfTime | LONGLONG* | inout | リファレンスタイムの出力ポインター。このパラメーターは、呼び出し側が割り当てた REFERENCE_TIME 変数を指し、メソッドはそこにリファレンスタイムを書き込みます。 |
戻り値
呼び出しが成功した場合、SampleToRefTime は S_OK を返します。それ以外の場合は、該当するエラーコードを返します。
解説(Remarks)
SampleToRefTime メソッドは、サンプルタイムをリファレンスタイムに変換します。サンプルタイムはレンダリングされたサンプル数で表され、リファレンスタイムは 100 ナノ秒単位で計測されます。
シンスシンクは、マスタークロック (IDirectMusicSynthSink::SetMasterClock の呼び出しで設定) とオーディオストリームとの間のタイミング関係を管理します。
詳細については、Synthesizer Timing のリファレンスタイムとサンプルタイムの説明を参照してください。
RefTimeToSample メソッドは、リファレンスタイムをサンプルタイムに変換します。
| rfTime | LONGLONG | in | リファレンスタイムを指定します。リファレンスタイムは 100 ナノ秒単位で計測されます。 |
| pllSampleTime | LONGLONG* | inout | サンプルタイムの出力ポインター。このパラメーターは、呼び出し側が割り当てた LONGLONG 変数を指し、メソッドはそこにサンプルタイムを書き込みます。 |
戻り値
呼び出しが成功した場合、RefTimeToSample は S_OK を返します。それ以外の場合は、該当するエラーコードを返します。
解説(Remarks)
RefTimeToSample メソッドは、リファレンスタイムをサンプルタイムに変換します。このメソッドは入力パラメーターとしてリファレンスタイムを受け取り、対応するサンプルタイムを出力します。
リファレンスタイムからのサンプルタイムの計算は、サンプリング周波数に依存します。たとえば、出力バッファーが 44.2 kHz 形式である場合、サンプルタイム 44,200 はリファレンスタイムの 1 秒に相当します。
シンスシンクは、マスタークロック (IDirectMusicSynthSink::SetMasterClock の呼び出しで設定) とオーディオストリームとの間のタイミング関係を管理します。
詳細については、Synthesizer Timing のリファレンスタイムとサンプルタイムの説明を参照してください。
SetDirectSound メソッドは、シンセサイザーシンクを既存の DirectSound オブジェクトおよび DirectSound バッファーに接続します。
| pDirectSound | IDirectSound* | in | シンクを関連付ける IDirectSound オブジェクトへのポインター。このパラメーターには、有効かつ NULL でないポインター値を設定します。 |
| pDirectSoundBuffer | IDirectSoundBuffer* | in | シンクを関連付ける IDirectSoundBuffer オブジェクトへのポインター。このパラメーターは NULL にできます。詳細については、以下の「解説」セクションを参照してください。 |
戻り値
呼び出しが成功した場合、SetDirectSound は S_OK を返します。それ以外の場合は、該当するエラーコードを返します。次の表に、返される可能性のあるステータスコードの一部を示します。
| 戻り値 | 説明 |
|---|---|
|
シンセが設定されていないことを示します。 |
|
シンクがアクティブであることを示します。 |
解説(Remarks)
pDirectSound パラメーターは、IDirectMusicPort::SetDirectSound から受け取った IDirectSound インスタンスを指し、NULL ではありません。
pDirectSoundBuffer が NULL の場合、IDirectSound のプライマリバッファーは、必要に応じてシンクのサンプルレートおよびチャンネル情報 (IDirectMusicSynth::GetFormat から取得) をサポートするようにアップグレードされます。
IDirectSoundBuffer は、シンセサイザーから取得した形式に一致する形式を持つセカンダリストリーミングバッファーである必要があります。pDirectSoundBuffer が NULL の場合は、適切な IDirectSoundBuffer インスタンスが内部的に作成されます。
シンクがアクティブ化された後は、IDirectSound インスタンスも IDirectSoundBuffer インスタンスも変更できません。
pDirectSound および pDirectSoundBuffer パラメーターは、COM オブジェクトの参照カウントの規約に従います。
詳細については、Microsoft Windows SDK ドキュメントの IDirectSound、IDirectSoundBuffer、IDirectMusicPort インターフェイスの説明を参照してください。
GetDesiredBufferSize メソッドは、シンセサイザーが推奨するバッファーサイズをサンプル単位で取得します。
| pdwBufferSizeInSamples | DWORD* | inout | バッファーサイズの出力ポインター。このパラメーターは、呼び出し側が割り当てた変数を指し、メソッドはそこに希望するバッファー長をサンプル単位で書き込みます。 |
戻り値
呼び出しが成功した場合、GetDesiredBufferSize は S_OK を返します。それ以外の場合は、該当するエラーコードを返します。次の表に、返される可能性のあるステータスコードの一部を示します。
| 戻り値 | 説明 |
|---|---|
|
シンセが設定されていないことを示します。 |
解説(Remarks)
GetDesiredBufferSize メソッドは、シンセの現在の形式に基づいて、希望するバッファーサイズを返します。IDirectMusicSynthSink::SetDirectSound に渡す DirectSound バッファーは、少なくともこのサイズがないと無効になる可能性があります。
詳細については、Microsoft Windows SDK ドキュメントの IDirectMusicPort インターフェイスの説明を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDirectMusicSynthSink "{09823663-5C85-11D2-AFA6-00AA0024D8B6}" #usecom global IDirectMusicSynthSink IID_IDirectMusicSynthSink "{AEC17CE3-A514-11D1-AFA6-00AA0024D8B6}" #comfunc global IDirectMusicSynthSink_Init 3 sptr #comfunc global IDirectMusicSynthSink_SetMasterClock 4 sptr #comfunc global IDirectMusicSynthSink_GetLatencyClock 5 sptr #comfunc global IDirectMusicSynthSink_Activate 6 int #comfunc global IDirectMusicSynthSink_SampleToRefTime 7 int64,var #comfunc global IDirectMusicSynthSink_RefTimeToSample 8 int64,var #comfunc global IDirectMusicSynthSink_SetDirectSound 9 sptr,sptr #comfunc global IDirectMusicSynthSink_GetDesiredBufferSize 10 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDirectMusicSynthSink "{09823663-5C85-11D2-AFA6-00AA0024D8B6}" #usecom global IDirectMusicSynthSink IID_IDirectMusicSynthSink "{AEC17CE3-A514-11D1-AFA6-00AA0024D8B6}" #comfunc global IDirectMusicSynthSink_Init 3 sptr #comfunc global IDirectMusicSynthSink_SetMasterClock 4 sptr #comfunc global IDirectMusicSynthSink_GetLatencyClock 5 sptr #comfunc global IDirectMusicSynthSink_Activate 6 int #comfunc global IDirectMusicSynthSink_SampleToRefTime 7 int64,sptr #comfunc global IDirectMusicSynthSink_RefTimeToSample 8 int64,sptr #comfunc global IDirectMusicSynthSink_SetDirectSound 9 sptr,sptr #comfunc global IDirectMusicSynthSink_GetDesiredBufferSize 10 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。