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 は WAVEFORMATEX の制限を受けません。これは、2 つ以上のチャネルを持つ形式を明確に指定できないか、サンプルあたりの有効なビット数がサンプル コンテナー のサイズと等しくない場合です。 詳細については、「オーディオ データ形式とデータ範囲を参照してください。
多くの場合、サンプルの有効桁数を指定する wValidBitsPerSample メンバーには、Formatと同じ値が含まれます。wBitsPerSampleメンバーを します。このメンバーは、サンプル コンテナーのサイズを指定します。 ただし、これらの値は異なる場合があります。 たとえば、ウェーブ データが 20 ビットの A/D コンバーターから送信された場合、wValidBitsPerSample は 20 ですが、Formatである必要があります。wBitsPerSample は 24 または 32 である可能性があります。 wValidBitsPerSample が Formatより小さい場合。wBitsPerSample、有効なビット (実際の PCM データ) はコンテナー内で左揃えになります。 コンテナーの最下位部分の未使用ビットは 0 に設定する必要があります。
サンプル コンテナーは、バイト境界で開始および終了し、Formatの値です。wBitsPerSample は常に 8 の倍数にする必要があります。 また、wValidBitsPerSample の値は、形式の値を超えないようにする必要があります。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 指定されているチャネルは、上の表に示した順序で、先頭から順に存在する必要があります。
たとえば、前-左と前中央のみを指定する場合は、インターリーブされたストリームのチャネル 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 を参照してください。
マルチチャネル構成の詳細については、オーディオ テクノロジ Web サイトの「Multiple Channel Audio Data and WAVE Files」というホワイト ペーパーを参照してください。
SubFormat メンバーには、ウェーブ ストリームの一般的なデータ形式を指定する GUID が含まれています。 たとえば、この GUID では、ストリームに整数の PCM データが含まれていることを指定できます。 他のメンバーは、サンプル サイズやチャネル数などの追加情報を提供します。 SubFormat GUID の意味は、WAVEFORMATEX 構造体の wFormatTag メンバー内の 16 ビット形式タグの意味と似ています。
WINDOWS 98 Second Edition で WAVEFORMATEXTENSIBLE が導入される前は、WAVE 形式を指定するために WAVEFORMATEX が推奨される構造でした。 その時点で、ベンダーは、公式の書式タグを形式に割り当てることができるように、新しいウェーブ形式を Microsoft に登録する必要があります。 登録されたフォーマット タグの一覧が、mmreg.h パブリック ヘッダー ファイルに表示されます。
WAVEFORMATEXTENSIBLE では、フォーマットの登録は不要になります。 ベンダーは、必要に応じて、SubFormat GUID を新しい形式に個別に割り当てることができます。 ただし、Microsoft では、パブリック ヘッダー ファイルの SubFormat GUID Ksmedia.hの一部を一覧表示しています。 新しい 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 を自由に定義して、ウェーブ形式タグが存在しない独自の形式を識別できます。
必要条件
要件 | 価値 |
---|---|
ヘッダー | ksmedia.h (Mmreg.h、Ksmedia.h、Mmreg.h を含む) |
関連項目
WAVEFORMATEX を する