次の方法で共有


音声の割り当て

シンセサイザー ミニポート ドライバーを含むほとんどのアダプター ドライバーには、DirectSound ハードウェア アクセラレーションも含まれています。 これにより、シンセサイザー ボイスとハードウェア アクセラレータによる DirectSound バッファー間のボイス割り当ての問題が生じます。

DirectMusicシンセサイザー(ハードウェアとソフトウェアの両方)は、同時クライアントの数を最大化するために、複数のインスタンスをサポートする必要があります。 シンセサイザーの作者は、シンセサイザーにボイスを静的に割り当てたくなるかもしれませんが、シンセサイザーの利用可能なすべてのインスタンスは、共通のダイナミックなボイスプールから引き出されていると考えるべきでしょう。 次に、各インスタンスは、プールで使用可能な音声の合計数として、使用可能な音声の数を報告します。

この方法で実装すると、物理的な声の数が限られているハードウェアシンセでも、多数のシンセインスタンスをサポートできます。 リアルタイムで、STATS 呼び出しは、各インスタンスが現在使用しているボイスの数をクライアントに通知します。 動的プールが枯渇し、シンセインスタンスが新しいボイスを必要とする場合、そのシンセインスタンスは、そのインスタンス内からボイスを解放するためにボイススティーリングスキームを実装する必要があります。

次の割り当てスキームは、ドライバーがどの音声にどのデータを入れるかを制御し、音声の盗用について決定を下すことができるため、シンセサイザーで使用される音声は DirectSound バッファーよりも簡単に共有できるという考えに基づいています (DLS レベル 1 仕様で概説されています)。

ミニポート ドライバー (ハードウェア、ソフトウェア、またはハードウェアとソフトウェアの組み合わせ) で使用できるすべての音声は、2 つのプールに分割されます。 最初のプール (フリー プール) は、どこにもコミットされていないボイスで構成されます。 2 番目のプール (動的プール) は、シンセサイザー インスタンスによって使用されることがコミットされたボイスで構成されます。 これらの音声は、シンセサイザーインスタンスによって現在使用されている場合と使用されていない場合があります。 動的プールのサイズは、任意のシンセサイザー インスタンスによって要求されるボイスの最大数として、フリー プールの現在の内容に応じて決まります。 DirectSound バッファーは、割り当て時に空きプールから削除され、割り当て解除時に返されます。

次の表に、実際のスキームを示す音声割り当てのシーケンスの例を示します。

時刻 要求 無料プール ダイナミックプール ミニポート ドライバーのアクション

T0

パワーアップ

64

0

Initialize。

T1

DSound (4)

60

0

DirectSound バッファーに 4 つのボイスを静的に割り当てます。

T2

シンセ (32)

28

32

動的プールを 32 ボイスに増やします。

T3

シンセ (24)

28

32

NO ACTION 動的プールには既に 24 を超えるボイスがあります。

T4

DSound (24)

4

32

DirectSound バッファーに 24 個のボイスを静的に割り当てます。

T5

シンセ (48)

0

36

動的プールを 36 ボイスに増やします。 (ポートを作成するメソッドは S_FALSE を返し、DMUS_PORTPARAMS.dwVoices= 36 を設定します。)

T6

DSound (10)

0

36

失敗。 空きプールに声がありません。

T7

DSound (-5)

5

36

無料の五つの音声。 これらは、最後の要求 (時刻 T5) が許可された数を超えて要求された場合でも、動的プールに戻されないことに注意してください。

DirectSound バッファーは実際には 1 つずつ割り当てられ、読みやすくするためにテーブルにグループ化されていることに注意してください。

シンセサイザー ピン インスタンスが作成された直後に、それに基づいてボイスを割り当てないでください。 作成後まもなく、KSPROPERTY_SYNTH_PORTPARAMETERSプロパティ項目が受信されます。 このプロパティ項目は、特に、このインスタンスに関連付けられるボイスの数を示します。 また、この項目は、要求されたすべての音声を割り当てることができなかった場合に、動的プールの実際の新しいサイズを報告する機会をミニポート ドライバーに与えます。