次の方法で共有


サウンド デバイスの列挙

ユーザーが好む再生装置で単純にサウンドを再生するだけのアプリケーションでは、利用可能なデバイスを列挙する必要はない。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 と共に列挙される。