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 と共に列挙される。