Platform SDK: DirectX

サウンド デバイスの列挙

[C++]

ユーザーが好む再生装置で単純にサウンドを再生するだけのアプリケーションでは、利用可能なデバイスを列挙する必要はない。デバイス識別子として NULL を指定して DirectSound オブジェクトを作成する場合、デフォルトのデバイスが存在すると、インターフェイスは自動的にそのデバイスに関連付けられる。デバイス ドライバが存在しない場合は、DirectSoundCreate 関数の呼び出しは失敗する。

しかし、特定の種類のデバイスを探している場合や、複数のデバイスを使って動作する必要がある場合は、システム上で利用可能なデバイスを DirectSound に列挙させなければならない。

列挙は 3 つの目的で使われる。

デバイスを列挙するには、DirectSound がデバイスを見つけるたびに呼び出すコールバック関数を最初に作成しなければならない。必要なすべての処理をこの関数内で実行し、関数に任意の名前を付けることができるが、この関数はプロトタイプである DSEnumCallback と同じ形式で宣言しなければならない。このコールバック関数は、列挙を続ける場合は TRUE、その他 (たとえば必要な能力を備えたデバイスを見つけた後など) の場合は FALSE を返さなければならない。

次のコールバック関数は、列挙された各デバイスに関する情報をコンボ ボックスに追加する。最初の 3 つのパラメータがデバイス ドライバによって供給されている点に注意すること。4 番目のパラメータは DirectSoundEnumerate 関数から引き渡される。

BOOL CALLBACK DSEnumProc(LPGUID lpGUID, 
                         LPCTSTR lpszDesc,
                         LPCTSTR lpszDrvName, 
                         LPVOID lpContext )
{
    HWND   hCombo = *(HWND *)lpContext;
    LPGUID lpTemp = NULL;
 
    if ( lpGUID != NULL )
    {
        if (( lpTemp = malloc( sizeof(GUID))) == NULL )
        return( TRUE );
 
        memcpy( lpTemp, lpGUID, sizeof(GUID));
    }
 
    ComboBox_AddString( hCombo, lpszDesc );
    ComboBox_SetItemData( hCombo,
                ComboBox_FindString( hCombo, 0, lpszDesc ),
                lpTemp );
    return( TRUE );
}
 

コンボ ボックスを含むダイアログを初期化する際に、列挙を行う。

if FAILED(DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc,
        &hCombo))
{
    EndDialog( hDlg, TRUE );
    return( TRUE );
}
 

この例では、コンボ ボックスのハンドルのアドレスは DirectSoundEnumerate に送られ、次にコールバック関数に渡される。このパラメータは、コールバック関数内でアクセスしたい任意の 32 ビットの値とすることができる。

[Visual Basic]

ユーザーが好む再生装置で単純にサウンドを再生するだけのアプリケーションでは、利用可能なデバイスを列挙する必要はない。デバイス識別子として空の文字列を渡して DirectSound オブジェクトを作成する場合、デフォルトのデバイスが存在すると、オブジェクトは自動的にそのデバイスに関連付けられる。デバイス ドライバが存在しない場合は、DirectX7.DirectSoundCreate メソッドの呼び出しは失敗する。

しかし、特定の種類のデバイスを探している場合や、複数のデバイスを使って動作する必要がある場合は、システム上で利用可能なデバイスを DirectSound に列挙させなければならない。

列挙は 3 つの目的で使われる。

デバイスを列挙するには、DirectX7.GetDSEnum メソッドを最初に呼び出して、DirectSound の利用可能なデバイスのコレクションを保持する DirectSoundEnum オブジェクトを作成しなければならない。利用可能なデバイス数を決定するには、DirectSoundEnum.GetCount メソッドを呼び出す。そして各デバイスの情報は、DirectSoundEnum.GetDescriptionDirectSoundEnum.GetGuidDirectSoundEnum.GetName の各メソッドを呼び出し、コレクション内の特定のデバイスをインデックス引数として渡すことで取得する。