Platform SDK: DirectX

ポートの使い方

ポートは、ミュージック データの送信または受信を行うデバイスである。ハードウェア デバイス、ソフトウェア シンセサイザ、ソフトウェア フィルタのいずれかを表す。

[C++]

DirectMusic アプリケーション内の各ポートは、IDirectMusicPort インターフェイスによって表される。このインターフェイスのメソッドを使って、デバイスに関する情報の取り出し、デバイス内のメモリの管理、DLS 音色のダウンロードとアンロード、流入データの読み込み、再生バッファの挿入を行う。

どのパフォーマンスも少なくとも 1 つのポートを備えていなければならない。デフォルト ポート以外のポートを使って、デフォルト ポートの特別なパラメータを設定する場合は、まず DMUS_PORTPARAMS 構造体を設定する。すべてのメンバに値を入力する必要はないが、dwValidParams メンバに適切なフラグを書き込むことにより、どのメンバが有効な情報を持っているのか DirectMusic に知らせなければならない。次に、この構造体を IDirectMusic::CreatePort メソッドに渡す。

次の C++コード例では、デフォルトの出力ポート用のオブジェクトを作成し、ポートに 5 つのチャンネル グループを設定する方法を示している。pDirectMusic は、有効な IDirectMusic ポインタとする。

IDirectMusicPort*  pPort;
DMUS_PORTPARAMS    dmos;
 
ZeroMemory( &dmos, sizeof(DMUS_PORTPARAMS) );
dmos.dwSize = sizeof(DMUS_PORTPARAMS);
dmos.dwValidParams = DMUS_PORTPARAMS_CHANNELGROUPS;
dmos.dwChannelGroups = 5;
HRESULT hr = pDirectMusic->CreatePort( GUID_NULL, &dmos, 
        &pPort, NULL )

設定したポートは IDirectMusic::Activate または IDirectMusicPort::Activate を呼び出してアクティブ化し、IDirectMusicPerformance::AddPort メソッドを使ってパフォーマンスに付加する。

ポートをパフォーマンスに付加するときに、IDirectMusicPerformance::AssignPChannelBlock メソッドを呼び出して、P チャンネルのブロックを割り当てる。IDirectMusicPerformance::AddPort に NULL を渡してデフォルト ポートを追加するときだけ、この処理が必要ない。この場合、P チャンネル 0-15 は、ポートの最初のグループの MIDI チャンネルに割り当てられる。

IDirectMusicPerformance::AssignPChannelBlock および IDirectMusicPerformance::AssignPChannel の各メソッドを使うと、これらのP チャンネルを異なった方法で割り当て、ほかの P チャンネルを追加し、P チャンネルをほかのポートに割り当てることができる。

[Visual Basic]

DirectX for Visual Basic では、各パフォーマンスに対して 1 つのポートだけがサポートされ、すべての P チャンネル はこのポートに割り当てられる。パフォーマンスを初期化した後に、DirectMusicPerformance.SetPort を使ってポートを選択する。デフォルト ポート を使用するには、index パラメータに -1 を渡す。

パフォーマンスを初期化するときに、利用可能なポートが自動的に列挙される。DirectMusicPerformance.GetPortCountDirectMusicPerformance.GetPortCaps、および DirectMusicPerformance.GetPortName メソッドを使って、特定のポートや機能を検索することができる。次のコードでは、最初のソフトウェア シンセサイザを検索し、パフォーマンスのポートとして設定している。最大で 16 のチャンネル グループがサポートされている。

' perf は DirectMusicPerformance オブジェクトである。
Dim X As Integer
Dim portcaps As DMUS_PORTCAPS

perf.Init(Nothing, Me.hWnd)
For X = 1 to perf.GetPortCount
    Call perf.GetPortCaps(X, portcaps)
    If portcaps.lFlags And DMUS_PC_SOFTWARESYNTH Then 
        perf.SetPort(X, 16)
        Exit For
    End If
Next X
' ポートが設定されてなかった場合は、デフォルト ポートを設定するか、ほかの操作を行う。

ポートの詳細については、次のトピックを参照すること。