Microsoft DirectX 8.0 (C++)

サウンド デバイスの列挙

ユーザーが好む再生装置で単純にサウンドを再生するだけのアプリケーションでは、利用可能なデバイスを列挙する必要はない。DirectSoundCreate8 関数を呼び出して DirectSound オブジェクトを作成する場合、デフォルトのデバイスを指定できる。詳細については、「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,
        (VOID*)&hCombo))
{
    EndDialog( hDlg, TRUE );
    return( TRUE );
}
 

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

  列挙された最初のデバイスは常にプライマリ サウンド ドライバと呼ばれ、コールバックの lpGUID パラメータは NULL である。このデバイスは、ユーザーがコントロール パネルで設定した優先する再生デバイスを表す。アプリケーションが "プライマリ サウンド ドライバ" を一覧に追加して、ユーザーにデバイスの選択肢を提供しやすくするために、このデバイスは別に列挙される。プライマリ デバイスは、適切な名前および GUID と共に列挙される。