デバイス形式

オーディオ アプリケーションの場合、DirectSound や Windows マルチメディア waveOutXxx 関数など、上位レベルのオーディオ API を使用する利点は、アプリケーションで使用されるストリーム形式とオーディオ デバイスで使用される形式の間で API が自動的に変換されることにあります。 これに対し、コア オーディオ API は、デバイスで使用される形式と同じか密接に関連する形式をアプリケーション ストリームで使用する必要があるため、より制限が厳しくなっています。 したがって、コア オーディオ API を使用してオーディオ ストリームを再生または記録するアプリケーションでは、ストリーム形式間の変換の一部またはすべてを行う必要があります。

WASAPI を使用して共有モード ストリームを管理するアプリケーションは、限られた形式変換のみを実行する点で、オーディオ エンジンに依存できます。 オーディオ エンジンは、アプリケーションで使用される標準の PCM サンプル サイズと、エンジンが内部処理に使用する浮動小数点サンプルの間で変換することができます。 ただし、通常、アプリケーション ストリームの形式には、デバイスで使用されるストリーム形式と同じ数のチャネルと同じサンプル レートが必要です。

アプリケーションがデバイスを排他モードで使用している場合、アプリケーションはオーディオ ハードウェアが明示的にサポートしているストリーム形式を使用する必要があります。 排他モードでは、アプリケーションとデバイスは、オーディオ エンジンによる介入なしにオーディオ データを直接交換します。

多くのオーディオ デバイスでは、PCM ストリーム形式と PCM 以外のストリーム形式の両方がサポートされています。 ただし、オーディオ エンジンは PCM ストリームのみ混在させることができます。 したがって、非 PCM 形式を使用できるのは排他モード ストリームのみです。 さらに、排他モードでは、固定データ レートを持つ非 PCM 形式のみサポートされます。 固定レートの非 PCM 形式の例として、デコードされずにデジタル形式で Sony/Philips デジタル インターフェイス (S/PDIF) リンクを通過する 48 kHz Windows Media Audio Professional (WMA Pro) オーディオ ストリームがあります。 S/PDIF 経由での WMA Pro ストリームの使用について詳しくは、「WMA Pro データ範囲の指定」をご覧ください。

WASAPI は、WAVEFORMATEX または WAVEFORMATEXTENSIBLE 構造を使用してストリーム形式を指定します。 WAVEFORMATEXTENSIBLE 構造は実質的に、より広範な形式を記述するよう拡張された WAVEFORMATEX 構造です。 スタンドアロンの WAVEFORMATEX 構造によって記述できる任意の形式は、WAVEFORMATEXTENSIBLE 構造によっても記述できます。

WAVEFORMATEXTENSIBLE 構造の最初のメンバーは WAVEFORMATEX 構造です。 WAVEFORMATEX 構造の内容は、それがスタンドアロンの WAVEFORMATEX 構造であるか、WAVEFORMATEXTENSIBLE 構造の一部であるかを示します。

スタンドアロンの WAVEFORMATEX 構造は、1 つまたは 2 つのチャネルと 8 ビットの倍数のサンプル サイズを持つ形式を適切に記述できます。 WAVEFORMATEX 構造自体では、スピーカー位置へのチャネルのマッピングを指定することができません。 加えて、WAVEFORMATEX は各オーディオ サンプルのコンテナーのサイズを指定しますが、サンプルの有効桁数のビット数を指定することはできません (たとえば、24 ビット コンテナーでは 20 ビットの有効桁数)。 これに対し、WAVEFORMATEXTENSIBLE 構造は、チャネルからスピーカーへのマッピングと各サンプルの有効桁数の両方を指定できます。

WAVEFORMATEXWAVEFORMATEXTENSIBLE について詳しくは、Windows DDK のドキュメントをご覧ください。

Windows 7 以降、WAVEFORMATEXTENSIBLE は、IEC 61937 互換インターフェイス経由でエンコードされたオーディオを送信するためのデバイス形式を表すために拡張されました。 新しい構造について詳しくは、「IEC 61937 伝送の形式の表現」をご覧ください。

デバイス形式の指定

次の WASAPI メソッドは、WAVEFORMATEX および WAVEFORMATEXTENSIBLE 構造を使用してストリーム形式を記述します。

GetMixFormat メソッドは、オーディオ エンジンが共有モード ストリームの内部処理に使用するストリーム形式を取得します。 このメソッドは常に、スタンドアロンの WAVEFORMATEX 構造ではなく WAVEFORMATEXTENSIBLE 構造を使用して形式を指定します。

IsFormatSupported メソッドは、オーディオ エンドポイント デバイスが特定のストリーム形式をサポートしているかどうかを示します。 呼び出し元は、ストリーム形式を共有モードまたは排他モードのどちらで使用するかを指定する必要があります。 共有モード形式の場合、メソッドはオーディオ エンジンに対してクエリを実行し、指定した形式がサポートされているかどうかを判断します。 排他モード形式の場合、メソッドはデバイス ドライバーに対してクエリを実行します。 一部のデバイス ドライバーは、形式がスタンドアロンの WAVEFORMATEX 構造で指定されている場合、1 チャネルまたは 2 チャネルの PCM 形式をサポートすると報告しますが、WAVEFORMATEXTENSIBLE 構造で指定されている場合は同じ形式を拒否します。 これらのドライバーから信頼性の高い結果を得るため、排他モード アプリケーションは、1 チャネルまたは 2 チャネルの PCM 形式ごとに 2 回 IsFormatSupported を呼び出す必要があります。一方の呼び出しで、スタンドアロンの WAVEFORMATEX 構造を使用して形式を指定し、もう一方の呼び出しで WAVEFORMATEXTENSIBLE 構造を使用して同じ形式を指定する必要があります。

アプリケーションが GetMixFormat または IsFormatSupported を使用して共有モードまたは排他モード ストリームの適切な形式を見つけたら、アプリケーションは Initialize メソッドを呼び出して、その形式によってストリームを初期化できます。 GetMixFormat メソッドから取得されたミックス形式と同じではないが、チャネルの数が同じで、ミックス形式と同じサンプル レートを持つ形式によって共有モード ストリームを初期化しようとするアプリケーションは、成功する可能性があります。 Initialize を呼び出す前に、アプリケーションは IsFormatSupported を呼び出して、Initialize が形式を受け入れることを確認できます。

オーディオ エンジンが共有モード ストリームの内部処理に使用するミックス形式は、オーディオ エンドポイント デバイスが共有モードで使用するストリーム形式と密接に関連していますが、必ずしも同じとは限りません。 ユーザーは、Windows マルチメディア コントロール パネル Mmsys.cpl を通じて、オーディオ エンドポイント デバイスが共有モードで動作するときに使用するストリーム形式を選択できます。 手順は次のとおりです。

  1. Mmsys.cpl を実行するには、コマンド プロンプト ウィンドウを開き、次のコマンドを入力します。

    control mmsys.cpl

    または、タスク バーの右側にある通知領域のスピーカー アイコンを右クリックし、[再生デバイス] または [録音デバイス] を選択して、Mmsys.cpl を実行することもできます。

  2. Mmsys.cpl ウィンドウが開いたら、再生デバイスの一覧または記録デバイスの一覧からデバイスを選択し、[プロパティ] をクリックします。

  3. プロパティ ウィンドウが開いたら、[詳細設定] をクリックし、[既定の形式] というラベルのボックスで使用可能な形式の一覧から形式を選択します。

たとえば、再生デバイスで使用可能な形式の一覧から、ユーザーが次の既定の形式を選択するとします。

2 チャンネル、16 ビット、44100 Hz (CD 品質)

これは、デバイスが共有モードで動作しているときに後で使用する形式です。 Windows Vista では、オーディオ エンジンは、共有モード ストリームの内部処理に、この形式の少し修正されたバージョンを使用します。 オーディオ エンジンは、チャネルの数 (2) とサンプル レート (44100 Hz) が同じ形式を使用しますが、処理する前にサンプルを浮動小数点数に変換します。 オーディオ エンジンは、デバイスを介して再生する前に、出力ミックス内の浮動小数点サンプルを 16 ビット整数に変換します。

アプリケーションは、オーディオ エンドポイント デバイスの PKEY_AudioEngine_DeviceFormat プロパティに対してクエリを実行し、ユーザーがデバイス用に選択した共有モード形式を取得できます。 デバイスのプロパティのクエリについて詳しくは、「デバイスのプロパティ」をご覧ください。

一部のアプリケーションでは、デバイスの PKEY_AudioEngine_DeviceFormat プロパティによって指定された形式が、デバイスで排他モード ストリームを開くのに適した形式であると見なされる場合があります。 排他モード ストリームを管理する他のアプリケーションには、デバイスとの複雑な形式ネゴシエーションを要求する追加の要件が存在することがあります。 通常、これらのアプリケーションの 1 つが適切な形式のリストを作成し、リストの先頭で優先形式を指定します。 その後、アプリケーションは、デバイスがサポートする形式が見つかるまで、リストの先頭から、リスト内の連続する各形式で IsFormatSupported を繰り返し呼び出します。

オーディオ エンドポイント デバイス