Platform SDK: DirectX |
ポートは、ミュージック データの送信または受信を行うデバイスである。ハードウェア デバイス、ソフトウェア シンセサイザ、ソフトウェア フィルタのいずれかを表す。
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 チャンネルをほかのポートに割り当てることができる。
DirectX for Visual Basic では、各パフォーマンスに対して 1 つのポートだけがサポートされ、すべての P チャンネル はこのポートに割り当てられる。パフォーマンスを初期化した後に、DirectMusicPerformance.SetPort を使ってポートを選択する。デフォルト ポート を使用するには、index パラメータに -1 を渡す。
パフォーマンスを初期化するときに、利用可能なポートが自動的に列挙される。DirectMusicPerformance.GetPortCount、DirectMusicPerformance.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 ' ポートが設定されてなかった場合は、デフォルト ポートを設定するか、ほかの操作を行う。
ポートの詳細については、次のトピックを参照すること。