WAVEFORMATEXTENSIBLE 構造体 (ksmedia.h)
WAVEFORMATEXTENSIBLE 構造体は、オーディオウェーブストリームの形式を指定します。
構文
typedef struct {
WAVEFORMATEX Format;
union {
WORD wValidBitsPerSample;
WORD wSamplesPerBlock;
WORD wReserved;
} Samples;
DWORD dwChannelMask;
GUID SubFormat;
} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;
メンバー
Format
ストリームのウェーブ データ形式を指定します。 このメンバーは、 WAVEFORMATEX 型の構造です。 WAVEFORMATEX の wFormat メンバーは、WAVE_FORMAT_EXTENSIBLEに設定する必要があります。 WAVEFORMATEX の wBitsPerSample メンバーは、各サンプルのコンテナーのサイズとして明確に定義されます。 サンプル コンテナーは常にバイトアラインされ、 wBitsPerSample は 8 の倍数である必要があります。
Samples
Samples.wValidBitsPerSample
サンプルの精度をビット単位で指定します。 このメンバーの値は、 Format で指定されたコンテナー サイズ以下である必要があります。wBitsPerSample メンバー。 詳細については、「解説」を参照してください。
Samples.wSamplesPerBlock
1 つの圧縮ブロックに含まれるサンプルの数を指定します。 この値は、各ブロック内に固定数のサンプルがある圧縮形式のバッファー要件を見積もる場合に便利です。 圧縮されたオーディオ データの各ブロックに可変数のサンプルが含まれている場合は、このメンバーを 0 に設定します。 この場合、バッファー推定とバッファー位置の情報は、他の方法で取得する必要があります。
Samples.wReserved
オペレーティング システムによる内部使用のために予約されています。 0 に初期化します。
dwChannelMask
マルチチャネル ストリーム内のチャネルを話者の位置に割り当てを指定します。 エンコードは、KSAUDIO_CHANNEL_CONFIG 構造体の ActiveSpeakerPositions メンバーに使用されるのと同じです。 詳細については、「解説」を参照してください。
SubFormat
サブフォーマットを指定します。 詳細については、「解説」を参照してください。
解説
WAVEFORMATEXTENSIBLE は、 WAVEFORMATEX 構造体の拡張形式です。 WAVEFORMATEX では、WAVEFORMATEXTENSIBLE で記述できる形式のサブセットのみを明確に記述できます。 WAVEFORMATEXTENSIBLE には、2 つ以上のチャネルを持つ形式を明確に指定できない、またはサンプルあたりの有効なビット数がサンプル コンテナー サイズと等しくない WAVEFORMATEX の制限は適用されません。 詳細については、「 オーディオ データ形式とデータ範囲」を参照してください。
多くの場合、サンプルの有効桁数を指定する wValidBitsPerSample メンバーには、 Format と同じ値が含まれています。サンプル コンテナー サイズを指定する wBitsPerSample メンバー。 ただし、これらの値は異なる場合があります。 たとえば、ウェーブ データが 20 ビットの A/D コンバーターから生成された場合、 wValidBitsPerSample は 20 ですが Format である必要があります。wBitsPerSample は 24 または 32 である可能性があります。 wValidBitsPerSample が Format より小さい場合。wBitsPerSample では、有効なビット (実際の PCM データ) がコンテナー内で左揃えになります。 コンテナーの最下位部分の未使用ビットは 0 に設定する必要があります。
サンプル コンテナーは、バイト境界で開始および終了し、Format の値を指定 します。wBitsPerSample は常に 8 の倍数である必要があります。 また、 wValidBitsPerSample の値が Format の値を超えないようにする必要があります。wBitsPerSample。 ドライバーは、これらの規則に違反するウェーブ形式を拒否する必要があります。
WAVEFORMATEXTENSIBLE 構造体の dwChannelMask メンバーには、マルチチャネル ストリームに存在するチャネルを示すマスクが含まれています。 最下位ビットはフロントレフトスピーカーを表し、次のビットはフロントライトスピーカーに対応します。 ヘッダー ファイル Ksmedia.h では、次のフラグ ビットが定義されています。
スピーカーの位置 | フラグ ビット |
---|---|
SPEAKER_FRONT_LEFT | 0x1 |
SPEAKER_FRONT_RIGHT | 0x2 |
SPEAKER_FRONT_CENTER | 0x4 |
SPEAKER_LOW_FREQUENCY | 0x8 |
SPEAKER_BACK_LEFT | 0x10 |
SPEAKER_BACK_RIGHT | 0x20 |
SPEAKER_FRONT_LEFT_OF_CENTER | 0x40 |
SPEAKER_FRONT_RIGHT_OF_CENTER | 0x80 |
SPEAKER_BACK_CENTER | 0x100 |
SPEAKER_SIDE_LEFT | 0x200 |
SPEAKER_SIDE_RIGHT | 0x400 |
SPEAKER_TOP_CENTER | 0x800 |
SPEAKER_TOP_FRONT_LEFT | 0x1000 |
SPEAKER_TOP_FRONT_CENTER | 0x2000 |
SPEAKER_TOP_FRONT_RIGHT | 0x4000 |
SPEAKER_TOP_BACK_LEFT | 0x8000 |
SPEAKER_TOP_BACK_CENTER | 0x10000 |
SPEAKER_TOP_BACK_RIGHT | 0x20000 |
dwChannelMask で指定されたチャネルは、上の表の先頭から始まる順序で存在する必要があります。
たとえば、front-left と front-center のみを指定する場合は、インターリーブストリームのチャネル 0 と 1 に、フロント左とフロントセンターをそれぞれ配置する必要があります。
2 つ目の例として、 nChannels ( Format メンバーの場合は「 WAVEFORMATEX」を参照) が 4 に設定され、 dwChannelMask が 0x00000033 に設定されている場合、オーディオ チャネルは、フロントレフ、フロント右、バック左、およびバック右のスピーカーへの再生を目的としています。 チャネル データは、各ブロック内でその順序でインターリーブする必要があります。
定義済みの場所を超えるチャネルの場所は予約済みと見なされます。
または、チャネル マスクは、 Ksmedia.h で定義され、標準のスピーカー構成を表す上記のフラグのビットごとの ORed の組み合わせである、次のいずれかの定数として指定できます。
KSAUDIO_SPEAKER_MONO
KSAUDIO_SPEAKER_STEREO
KSAUDIO_SPEAKER_QUAD
KSAUDIO_SPEAKER_SURROUND
KSAUDIO_SPEAKER_5POINT1
KSAUDIO_SPEAKER_7POINT1
KSAUDIO_SPEAKER_DIRECTOUT
ハードウェア デバイスは、 KSPROPERTY_AUDIO_CHANNEL_CONFIG set-property 要求によって、これらのスピーカー構成のいずれかに設定できます。 スピーカー構成の設定の詳細については、「 KSAUDIO_CHANNEL_CONFIG」を参照してください。
通常、 nChannels のカウントは dwChannelMask で設定されたビット数と等しくなりますが、これは必ずしもそうであるとは限りません。 nChannels が dwChannelMask に設定されているビット数より少ない場合、dwChannelMask の余分な (最も重要な) ビットは無視されます。 nChannels が dwChannelMask に設定されているビット数を超える場合、対応するマスク ビットがないチャネルは、物理スピーカーの位置には割り当てされません。 KSAUDIO_SPEAKER_DIRECTOUT以外のスピーカー構成では、KMixer のようなオーディオ シンク ( 「KMixer システム ドライバー」を参照) は、これらの余分なチャネルを無視し、対応するマスク ビットを持つチャネルのみを混在させます。
KSAUDIO_SPEAKER_DIRECTOUTは、スピーカーのない構成を表し、 Ksmedia.h でゼロとして定義されます。 この構成では、オーディオ デバイスはデバイスの最初のポートに最初のチャネルをレンダリングし、2 番目のチャネルはデバイス上の 2 番目のポートにレンダリングします。 これにより、オーディオオーサリングアプリケーションは、デジタルミキサーやデジタルオーディオストレージデバイス(ハードディスクまたはADAT)などのデバイスに変更を加えることなく、マルチチャンネルデータを直接出力できます。 たとえば、チャンネル 0 から 30 には、それぞれドラム、ギター、ベース、音声などが含まれる場合があります。 このような生のオーディオ データの場合、話者の位置は意味がなく、スピーカーの位置を入力ストリームまたは出力ストリームに割り当てると、KMixer などのコンポーネントが不要な形式変換を実行して不適切に介入する可能性があります。 デバイスが生のオーディオ ストリームを処理できない場合は、スピーカーの構成をKSAUDIO_SPEAKER_DIRECTOUTに変更する要求を拒否する必要があります。 詳細については、「 DSSPEAKER_DIRECTOUT Speaker Configuration」を参照してください。
マルチチャネル構成の詳細については、オーディオ テクノロジ Web サイトの「マルチ チャネル オーディオ データと WAVE ファイル」というホワイト ペーパーを参照してください。
SubFormat メンバーには、ウェーブ ストリームの一般的なデータ形式を指定する GUID が含まれています。 たとえば、この GUID では、ストリームに整数の PCM データが含まれていることを指定できます。 他のメンバーは、サンプル サイズやチャネル数などの追加情報を提供します。 SubFormat GUID の意味は、WAVEFORMATEX 構造体の wFormatTag メンバーの 16 ビット形式タグの意味と似ています。
WINDOWS 98 Second Edition で WAVEFORMATEXTENSIBLE が導入される前は、WAVE 形式を指定するために WAVEFORMATEX が推奨される構造でした。 その時点で、ベンダーは、公式の書式タグを形式に割り当てることができるように、新しいウェーブ形式を Microsoft に登録する必要があります。 登録済みの書式タグの一覧が、パブリック ヘッダー ファイル Mmreg.h に表示されます。
WAVEFORMATEXTENSIBLE では、書式の登録は不要になりました。 ベンダーは、必要に応じて 、SubFormat GUID を新しい形式に個別に割り当てることができます。 ただし、Microsoft では、パブリック ヘッダー ファイル Ksmedia.h で一般的な SubFormat GUID の一部を一覧表示します。 新しい SubFormat GUID を定義する前に、ベンダーは Ksmedia.h の KSDATAFORMAT_SUBTYPE_Xxx 定数の一覧をチェックして、特定の形式に対して適切な GUID が既に定義されているかどうかを確認する必要があります。
下位互換性のために、スタンドアロンの WAVEFORMATEX 構造体で指定できるウェーブ形式は、WAVEFORMATEXTENSIBLE 構造体でも定義できます。 したがって、Mmreg.h のすべての書式タグには、対応する SubFormat GUID があります。 次の表は、一般的な書式タグとそれに対応する SubFormat GUID を示しています。
タグの書式設定 | SubFormat GUID |
---|---|
WAVE_FORMAT_PCM | KSDATAFORMAT_SUBTYPE_PCM |
WAVE_FORMAT_IEEE_FLOAT | KSDATAFORMAT_SUBTYPE_IEEE_FLOAT |
WAVE_FORMAT_DRM | KSDATAFORMAT_SUBTYPE_DRM |
WAVE_FORMAT_ALAW | KSDATAFORMAT_SUBTYPE_ALAW |
WAVE_FORMAT_MULAW | KSDATAFORMAT_SUBTYPE_MULAW |
WAVE_FORMAT_ADPCM | KSDATAFORMAT_SUBTYPE_ADPCM |
詳細については、「 書式タグとサブフォーマット GUID 間の変換」を参照してください。
WAVEFORMATEXTENSIBLE は WAVEFORMATEX の拡張バージョンであるため、WAVEFORMATEX だけでは記述できない追加の形式を記述できます。 ベンダーは、独自の SubFormat GUID を自由に定義して、ウェーブ形式タグが存在しない独自の形式を識別できます。
要件
要件 | 値 |
---|---|
Header | ksmedia.h (Mmreg.h、Ksmedia.h、Mmreg.h を含む) |