デバイスの形式
オーディオ アプリケーションの場合、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 構造体では、チャンネルからスピーカーへのマッピングと各サンプルの有効桁数の両方を指定できます。
WAVEFORMATEXTENSIBLE WAVEFORMATEX との詳細については、Windows DDK のドキュメントを参照してください。
Windows 7 以降、WAVEFORMATEXTENSIBLE は、IEC 61937 互換インターフェイス経由でエンコードされたオーディオを送信するためのデバイス形式を表すために拡張されました。 新しい構造の詳細については、「IEC 61937 伝送の形式を表すを参照してください。
デバイス形式の指定
次の WASAPI メソッドでは、WAVEFORMATEX と WAVEFORMATEXTENSIBLE 構造体を使用してストリーム形式を記述します。
GetMixFormat メソッドは、オーディオ エンジンが共有モード ストリームの内部処理に使用するストリーム形式を取得します。 このメソッドは常に、スタンドアロンの WAVEFORMATEX 構造体ではなく、WAVEFORMATEXTENSIBLE 構造体を使用して形式を指定します。
IsFormatSupported メソッドは、オーディオ エンドポイント デバイスが特定のストリーム形式をサポートしているかどうかを示します。 呼び出し元は、ストリーム形式を共有モードまたは排他モードのどちらで使用するかを指定する必要があります。 共有モード形式の場合、メソッドはオーディオ エンジンに対してクエリを実行して、指定した形式がサポートされているかどうかを判断します。 排他モード形式の場合、メソッドはデバイス ドライバーを照会します。 一部のデバイス ドライバーは、形式がスタンドアロン WAVEFORMATEX 構造体で指定されている場合、1 チャネルまたは 2 チャネルの PCM 形式をサポートすると報告しますが、WAVEFORMATEXTENSIBLE 構造体で指定されている場合は、同じ形式を拒否します。 これらのドライバーから信頼性の高い結果を得るには、排他モード アプリケーションは、1 チャネルまたは 2 チャネルの PCM 形式ごとに IsFormatSupported を 2 回呼び出す必要があります。1 つの呼び出しでは、スタンドアロン WAVEFORMATEX 構造体を使用して形式を指定し、もう一方の呼び出しでは、WAVEFORMATEXTENSIBLE 構造体を使用して同じ形式を指定する必要があります。
アプリケーションが GetMixFormat 使用するか、IsFormatSupported を して共有モードまたは排他モード ストリームの適切な形式を検索した後、アプリケーションは Initialize メソッドを呼び出して、その形式でストリームを初期化できます。 GetMixFormat メソッドから取得したミックス形式と同じではないが、チャネル数とミックス形式と同じサンプル レートを持つ形式で共有モード ストリームを初期化しようとするアプリケーションは、成功する可能性があります。 Initialize 呼び出す前に、アプリケーション IsFormatSupported を呼び出して、Initialize が形式を受け入れることを確認できます。
オーディオ エンジンが共有モード ストリームの内部処理に使用するミックス形式は、オーディオ エンドポイント デバイスが共有モードで使用するストリーム形式と密接に関連していますが、必ずしも同じではありません。 ユーザーは、Windows マルチメディア コントロール パネル Mmsys.cplを使用して、オーディオ エンドポイント デバイスが共有モードで動作するときに使用するストリーム形式を選択できます。 手順は次のとおりです。
Mmsys.cplを実行するには、コマンド プロンプト ウィンドウを開き、次のコマンドを入力します。
コントロールの mmsys.cpl
または、タスク バーの右側にある通知領域のスピーカー アイコンを右クリックし、再生デバイス または Recording Devicesを選択して、Mmsys.cpl を実行することもできます。
Mmsys.cpl ウィンドウが開いたら、再生デバイスの一覧または記録デバイスの一覧からデバイスを選択し、[プロパティ] をクリックします。
プロパティ ウィンドウが開いたら、[詳細設定] クリックし、[既定の形式] のラベルが付いたボックスで使用可能な形式の一覧から書式選択します。
たとえば、ユーザーが再生デバイスで使用可能な形式の一覧から次の既定の形式を選択するとします。
2 チャンネル、16 ビット、44100 Hz (CD 品質)
これは、デバイスが共有モードで動作するときに後で使用する形式です。 Windows Vista では、オーディオ エンジンは、共有モード ストリームの内部処理に、この形式の少し変更されたバージョンを使用します。 オーディオ エンジンは、同じ数のチャネル (2) と同じサンプル レート (44100 Hz) の形式を使用しますが、処理する前にサンプルを浮動小数点数に変換します。 オーディオ エンジンは、デバイスを介して再生する前に、出力ミックス内の浮動小数点サンプルを 16 ビット整数に変換します。
アプリケーションは、オーディオ エンドポイント デバイスの PKEY_AudioEngine_DeviceFormat プロパティに対してクエリを実行して、ユーザーがデバイス用に選択した共有モード形式を取得できます。 デバイスのプロパティに対するクエリの詳細については、「デバイスのプロパティの」を参照してください。
一部のアプリケーションでは、デバイスの PKEY_AudioEngine_DeviceFormat プロパティで指定された形式が、デバイスで排他モード ストリームを開くのに適した形式であると見なされる場合があります。 排他モード ストリームを管理する他のアプリケーションには、デバイスとの複雑な形式ネゴシエーションを要求する追加の要件がある場合があります。 通常、これらのアプリケーションの 1 つは、適切な形式のリストを作成し、リストの先頭に優先形式を指定します。 その後、アプリケーションは、デバイスがサポートする形式が見つかるまで、リストの先頭から始まる連続する各形式で、IsFormatSupported を繰り返し呼び出します。
関連トピック
-
オーディオ エンドポイント デバイスの を する