Microsoft DirectX 8.0 (C++)

DirectMusic ポートのプロパティ セット

IKsControl::KsProperty メソッドを使って、プロパティが利用可能であるかどうかを確認し、プロパティの値を設定および取得する。IDirectMusicPort8::QueryInterface メソッドを呼び出し、インターフェイス識別子として IID_IKsControl を渡すことにより、ポートに対応する IKsControl インターフェイスを取得する。

プロパティ セットは GUID によって表され、セットの各項目は 0 から始まるインデックスによって表される。GUID に対してインデックス化された項目の意味が変更されることはない。DirectMusic でサポートされるプロパティ セットのリストについては、「KSPROPERTY」を参照すること。

DirectMusic であらかじめ定義されているプロパティ セットはすべて、ただ 1 つの項目を持っており、通常、インデックス番号は 0 に設定されている。カーネルストリーミング (KS) プロパティの完全定義もサポートされており、ベンダーは任意の数の項目とインスタンス、および任意のサイズのデータを持つプロパティ セットを自由に作成できる。

プロパティ項目の要求をポートに対して送信する作業は、ポートの実装に依存する。Win32® ハンドル ベースのマルチメディア呼び出し (midiOutmidiIn の各関数) を利用して DirectMusic のエミュレーションを行っているポートでは、どのプロパティもサポートされない。

次のサンプル コードでは、IKsControl::KsProperty メソッドを使って、ポートが General MIDI サウンド セットをハードウェアでサポートしているかどうかを調べている。

BOOL IsGMSupported(IDirectMusicPort8 *pPort) 
{ 
    HRESULT     hr; 
    IKsControl  *pControl; 
    KSPROPERTY  ksp; 
    DWORD       dwFlags; 
    ULONG       cb; 
    BOOL        fIsSupported;
 
    // IKsControl インターフェイスの照会を行う。
    hr = pPort->QueryInterface(IID_IKsControl, (void**)&pControl); 
    if (FAILED(hr)) 
    { 
        // ポートがプロパティをサポートしていない。GM サポートがないと仮定する。
        return FALSE; 
    }
    // GM について問い合わせる。 
    ksp.Set   = GUID_DMUS_PROP_GM_Hardware; 
    ksp.Id    = 0; 
    ksp.Flags = KSPROPERTY_TYPE_BASICSUPPORT;
    hr = pControl->KsProperty(&ksp, sizeof(ksp),
            &dwFlags, sizeof(dwFlags), &cb);
    fIsSupported = FALSE; 
    if (SUCCEEDED(hr) || (cb >= sizeof(dwFlags))
    {
        // セットがサポートされている。
        fIsSupported = (BOOL)(dwFlags & KSPROPERTY_TYPE_GET);
    }
    pControl->Release();
    return fIsSupported;
}