拡張可能な Wave 形式の記述子

次の図は、wave オーディオ ストリームのデータ形式記述子を示しています。

Diagram illustrating a wave-format descriptor for an audio stream.

図に示すように、KSDATAFORMAT 構造に続く追加の形式情報の量は、データ形式によって異なります。

オーディオ システムでは、次のようないくつかの方法でこの種類の形式記述子が使用されます。

  • 前の図に示すような形式記述子は、ミニポート ドライバーの NewStream メソッドの呼び出しパラメーターとして渡されます (たとえば、IMiniportWaveCyclic::NewStream を参照してください)。

  • IMiniport::D ataRangeIntersection メソッドの ResultantFormat パラメーターは、前の図に示すような形式記述子をメソッドが書き込むバッファーを指します。

  • KSPROPERTY_PIN_DATAINTERSECTION get プロパティ要求は、前の図に示すような形式記述子を取得します。

  • KSPROPERTY_PIN_PROPOSEDATAFORMAT set プロパティ要求は、前の図に示すような形式記述子を受け入れます。

  • KsCreatePin 関数の Connect 呼び出しパラメーターにも同様の形式が使用されます。 このパラメーターは、形式記述子も含むバッファーの先頭にある KSPIN_CONNECT 構造を指します。 KSPIN_CONNECT 構造の直後にある形式記述子は、前の図に示すような KSDATAFORMAT 構造で始まります。

KSDATAFORMAT 構造に続く形式情報は、WAVEFORMATEXTENSIBLE 構造である必要があります。 WAVEFORMATEXTENSIBLE は、WAVEFORMATEX よりも広い範囲の形式を記述できる WAVEFORMATEX の拡張バージョンです。

WAVEFORMAT は廃止されたため、どのバージョンの Microsoft Windows の WDM オーディオ サブシステムでもサポートされていません。 PCMWAVEFORMAT 構造は、廃止された WAVEFORMAT の拡張バージョンです。

WAVEFORMAT、PCMWAVEFORMAT、WAVEFORMATEX、WAVEFORMATEXTENSIBLE の 4 つの wave 形式構造体はどれも、wFormatTag から始まる同じ 5 つのメンバーで始まります。 上の図は、これら 4 つの構造を互いに重ね合わせて、同一の構造の部分を強調したものです。

WAVEFORMATEXTENSIBLE は、Samples.wValidBitsPerSample から始まる 3 つのメンバーを追加することにより WAVEFORMATEX を拡張します。 (Samples は、一部の圧縮形式で wValidBitsPerSample の代わりに他のメンバー wValidSamplesPerBlock が使用される共用体です)。バッファー内の KSDATAFORMAT 構造の末尾の直後にある wFormatTag メンバーは、KSDATAFORMAT に続く形式情報の種類を指定します。

WAVEFORMATEX とは異なり、WAVEFORMATEXTENSIBLE は次のことを実行できます。

  1. サンプル コンテナーのサイズとは別に、サンプルあたりのビット数を指定します。 たとえば、20 ビットのサンプルは、3 バイトのコンテナー内に左揃えで格納できます。 WAVEFORMATEX は、サンプルあたりのデータ ビット数とサンプル コンテナー サイズを区別できず、そのような形式を明確に記述できません。

  2. マルチチャネル ストリームのオーディオ チャネルに特定のスピーカーの場所を割り当てます。 WAVEFORMATEX にはこの機能がないため、モノラルおよび (2 チャンネル) ステレオ ストリームのみ適切にサポートできます。

WAVEFORMATEX の従来の使用法

WAVEFORMATEX で記述される任意の形式は、WAVEFORMATEXTENSIBLE でも記述できます。 WAVEFORMATEX 構造を WAVEFORMATEXTENSIBLE に変換する方法については、「形式タグとサブフォーマット GUID の間の変換」をご覧ください。

WAVEFORMATEX は、サンプル サイズが 8 ビットまたは 16 ビットの形式を記述するのに十分ですが、16 ビットを超えるサンプル精度の形式を適切に記述するには WAVEFORMATEXTENSIBLE が必要です。 次に 2 つの例を挙げます。

  • サンプル精度が 24 ビットのストリームでは、効率的な処理に 32 ビット コンテナー サイズを使用できますが、24 ビット コンテナーを使用するように変換し、データを失うことなくストレージ効率を向上させることができます。

  • 24 ビットのサンプル データでストリームを処理する場合、20 ビットの精度のみを提供するレンダリング デバイスではディザリングを使用して、出力信号の忠実性を高めることができます。 ただし、ディザリングには追加の処理時間が必要です。元のストリームが 20 ビットに対してのみ正確な場合、追加の処理は不要です。

どちらの例でも、サンプルの精度とコンテナー サイズの両方がわかっている場合のみ、処理とストレージの効率の適切なトレードオフを行いながら、信号品質を維持できます。

WAVEFORMATEX または WAVEFORMATEXTENSIBLE 構造によって単純な形式を明確に記述できる場合、オーディオ ドライバーには、形式を記述するいずれかの構造を選択するオプションがあります。 ただし、オーディオ ドライバーは通常、WAVEFORMATEX を使用して、8 ビットまたは 16 ビットのサンプルを含むモノラルおよび (2 チャンネル) ステレオ PCM 形式を指定してきました。一部の古いアプリケーションでは、すべてのオーディオ ドライバーが WAVEFORMATEX を使用してこれらの形式を指定することが想定される場合があります。

ドライバーが、WAVEFORMATEX または WAVEFORMATEXTENSIBLE 構造として明確に指定できるオーディオ形式をサポートしている場合、クライアント アプリケーションまたはコンポーネントが構造を指定するために、2 つの構造のどちらを使用するかに関係なく、ドライバーは形式を認識する必要があります。 たとえば、オーディオ デバイスが 44.1 kHz、16 ビット、ステレオ PCM 形式をサポートしている場合、ミニポート ドライバーの KSPROPERTY_PIN_PROPOSEDATAFORMAT プロパティ ハンドラーとその NewStream メソッドの実装は、形式が WAVEFORMATEX 構造または WAVEFORMATEXTENSIBLE 構造のどちらとして指定されているかどうかに関係なく、その形式を受け入れる必要があります。

形式データの処理を簡略化するため、ドライバーは通常、WAVEFORMATEXTENSIBLE 構造を使用して内部的に形式を表します。 このアプローチでは、入力 WAVEFORMATEX 構造を内部 WAVEFORMATEXTENSIBLE 表現に変換したり、内部 WAVEFORMATEXTENSIBLE 表現を出力 WAVEFORMATEX 構造に変換したりする必要がある場合があります。

WAVEFORMATEXTENSIBLE では、dwBitsPerSample はコンテナー サイズであり、wValidBitsPerSample はサンプルあたりの有効なデータ ビット数です。 コンテナーは常にメモリ内でバイト アラインされ、コンテナー サイズは 8 ビットの倍数として指定する必要があります。