サウンド デバイスの列挙
ユーザーが好む再生装置で単純にサウンドを再生するだけのアプリケーションでは、利用可能なデバイスを列挙する必要はない。DirectSoundCreate8 関数を呼び出してデバイス オブジェクトを作成する際に、デフォルトのデバイスを指定できる。詳細については、「デバイス オブジェクトの作成」を参照すること。
以下のような状況では列挙が必要になる。
- アプリケーションが、デバイスによっては利用できない能力を必要とする。
- アプリケーションが、2 つ以上のデバイスを必要とする。
- ユーザーがデバイスを選択できるようにしたい。
列挙は 3 つの目的で使われる。
- 利用可能なハードウェアを報告する。
- 各デバイスに GUID を割り当てる。
- 列挙された各デバイスに対して一時的なデバイス オブジェクトを作成し、デバイスの能力をチェックできるようにする。
デバイスを列挙するには、システム上のデバイスごとに 1 回呼び出されるコールバック関数を最初に設定しなければならない。必要なすべての処理をこの関数内で実行し、関数に任意の名前を付けることができるが、この関数はプロトタイプである DSEnumCallback と同じ形式で宣言しなければならない。このコールバック関数は、列挙を続ける場合は TRUE、その他 (たとえば必要な能力を備えたデバイスを見つけた後など) の場合は FALSE を返さなければならない。
次のコールバック関数では、列挙された各デバイスの名前をコンボ ボックスに追加し、デバイスの GUID を項目データとして格納している。最初の 3 つのパラメータの値は、デバイス ドライバによって提供される。4 番目のパラメータは、DirectSoundEnumerate 関数から渡される。このパラメータは任意の 32 ビット値を渡すために使え、この例ではコンボ ボックスのウィンドウ ハンドルを渡している。コンボ ボックスに文字列とデータを追加するには、Windowsx.h で定義されているマクロを使っている。
BOOL CALLBACK DSEnumProc(LPGUID lpGUID,
LPCTSTR lpszDesc,
LPCTSTR lpszDrvName,
LPVOID lpContext )
{
HWND hCombo = (HWND)lpContext;
LPGUID lpTemp = NULL;
if (lpGUID != NULL) // "プライマリ サウンド ドライバ" に対してのみ NULL。
{
if ((lpTemp = (LPGUID)malloc(sizeof(GUID))) == NULL)
{
return(TRUE);
}
memcpy(lpTemp, lpGUID, sizeof(GUID));
}
ComboBox_AddString(hCombo, lpszDesc);
ComboBox_SetItemData(hCombo,
ComboBox_FindString(hCombo, 0, lpszDesc),
lpTemp );
free(lpTemp);
return(TRUE);
}
コンボ ボックスを含むダイアログ ボックスを初期化が初期化されると、列挙が開始する。hCombo はコンボ ボックスのハンドルで、hDlg はダイアログ ボックスのハンドルであるものとする。
if (FAILED(DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc,
(VOID*)&hCombo)))
{
EndDialog(hDlg, TRUE);
return(TRUE);
}
この例では、コンボ ボックスのハンドルのアドレスは DirectSoundEnumerate に送られ、次にコールバック関数に渡される。このパラメータは、コールバック関数内でアクセスしたい任意の 32 ビットの値とすることができる。
注 列挙された最初のデバイスは常にプライマリ サウンド ドライバと呼ばれ、コールバックの lpGUID パラメータは NULL である。このデバイスは、ユーザーがコントロール パネルで設定した優先する再生デバイスを表す。アプリケーションが "プライマリ サウンド ドライバ" という項目を一覧に追加して、ユーザーにデバイスの選択肢を提供しやすくするために、このデバイスは別に列挙される。プライマリ デバイスは、適切な名前および GUID と共に列挙される。