カクタスソフトウェア
カクタスソフトウェア
サウンド MIDI マルチメディア アプリケーション

WAVEFORMATEXTENSIBLE構造体

このセクションではWAVEFORMATEXTENSIBLE構造体の使い方について解説します。

以下にWAVEFORMATEXTENSIBLE構造体のコードを示します。

typedef struct {
    WAVEFORMATEX    Format;
    union {
        WORD wValidBitsPerSample;       /* bits of precision  */
        WORD wSamplesPerBlock;          /* valid if wBitsPerSample==0 */
        WORD wReserved;                 /* If neither applies, set to zero. */
    } Samples;
    DWORD           dwChannelMask;      /* which channels are */
                                        /* present in stream  */
    GUID            SubFormat;
} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;

この構造体のメンバーは以下の4つです。

最初の2つは、WAVEFORMATEXのwBitsPerSampleがゼロかどうかで役割が変わります。unionで定義されていることに注意して下さい。

wValidBitsPerSample

1サンプル点あたりの有効データサイズを示します。この変数を利用する時は、WAVEFORMATEXのメンバーwBitsPerSampleに1サンプル点あたりのコンテナサイズを格納します。詳しくはセクション「コンテナサイズと有効データサイズ」を参照して下さい。

wSamplesPerBlock

圧縮フォーマットの時に用いられ、1つのコンテナに含まれるデータ数を示します。例えば、2つの20Bitデータを5バイトのコンテナに格納する場合、以下の様にパラメータを指定します。

    wBitsPerSample = 0;
    wSamplesPerBlock = 2;
    nBlockAlign = 5;
非圧縮フォーマットWAVE_FORMAT_PCMでは、1つのコンテナに2つ以上のデータを格納できません。例えば20Bitデータの場合、コンテナを24Bitあるいは32Bitとし、使わないビットをゼロで埋めるという使い方をしなければなりません。

dwChannelMask

スピーカーの配置を指定します。

“mmreg.h”や“ksmedia.h”に以下の定義があり、スピーカーの位置をビットパタンで表現します。

#define SPEAKER_FRONT_LEFT             0x1
#define SPEAKER_FRONT_RIGHT            0x2
#define SPEAKER_FRONT_CENTER           0x4
#define SPEAKER_LOW_FREQUENCY          0x8
#define SPEAKER_BACK_LEFT              0x10
#define SPEAKER_BACK_RIGHT             0x20
#define SPEAKER_FRONT_LEFT_OF_CENTER   0x40
#define SPEAKER_FRONT_RIGHT_OF_CENTER  0x80
#define SPEAKER_BACK_CENTER            0x100
#define SPEAKER_SIDE_LEFT              0x200
#define SPEAKER_SIDE_RIGHT             0x400
#define SPEAKER_TOP_CENTER             0x800
#define SPEAKER_TOP_FRONT_LEFT         0x1000
#define SPEAKER_TOP_FRONT_CENTER       0x2000
#define SPEAKER_TOP_FRONT_RIGHT        0x4000
#define SPEAKER_TOP_BACK_LEFT          0x8000
#define SPEAKER_TOP_BACK_CENTER        0x10000
#define SPEAKER_TOP_BACK_RIGHT         0x20000
#define SPEAKER_RESERVED               0x80000000

例えば4チャンネルステレオで、スピーカーの位置が「左前・右前・左後・右後」の場合、以下の様になります。

    dwChannelMask =
        SPEAKER_FRONT_LEFT |           // 左前
        SPEAKER_FRONT_RIGHT |          // 右前
        SPEAKER_BACK_LEFT |            // 左後
        SPEAKER_BACK_RIGHT;            // 右後

ウェーブデータの並びは、上記定義の数値の小さい順、この例では「左前・右前・左後・右後」でなければなりません。またnチャンネルでは、dwChannelMaskにn個のビットを立てなければなりません。

チャンネルは順にアサインされるため、チャンネル数よりビット数が多い場合、余ったビットは無視されます。逆に少ない場合、動作は不定となります。順に次のスピーカーにアサインされるかも知れませんし、音が出ないかも知れません。これはデバイスドライバーの書き方に依存するするので避けなければなりません。

特殊なケースとして、ウェーブデータをn個のモノデータの集合、つまりアーカイブとして扱いたい時があります。この場合、スピーカーの位置情報はいらないので、dwChannelMaskはゼロとすべきでしょう。

チャンネル数がモノやステレオで、スピーカーの位置が明白と思われる場合でも、dwChannelMaskには規定のビットを立てておきます。

MONO

    dwChannelMask = SPEAKER_FRONT_CENTER;

STEREO

    dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT;

“ksmedia.h”に便利な定義があるので、以下に紹介します。

#define KSAUDIO_SPEAKER_MONO            (SPEAKER_FRONT_CENTER)
#define KSAUDIO_SPEAKER_STEREO          (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT)
#define KSAUDIO_SPEAKER_QUAD            (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \
                                         SPEAKER_BACK_LEFT  | SPEAKER_BACK_RIGHT)
#define KSAUDIO_SPEAKER_SURROUND        (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \
                                         SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER)
#define KSAUDIO_SPEAKER_5POINT1         (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \
                                         SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | \
                                         SPEAKER_BACK_LEFT  | SPEAKER_BACK_RIGHT)
以下省略…

SubFormat

WAVE_FORMAT_EXTENSIBLE構造体を用いた場合、wFormatTagにWAVE_FORMAT_EXTENSIBLEを指定し、実際のフォーマットタグをSubFormatで指定することができます。

wFormatTagでタグを指定する場合、そのタグは“mmreg.h”に登録されていなければなりません。タグを“mmreg.h”に登録するには、マイクロソフトに届けを出さなければなりませんが、SubFormatを利用するとその必要がありません。

SubFormatはGUIDで表現されます。KSDATAFORMAT_SUBTYPE_PCMやKSDATAFORMAT_SUBTYPE_IEEE_FLOATなど既存のタグは、“ksmedia.h”で定義されています。

以下はSubFormatを用い、従来のフォーマットを指定した例です。

PCMを指定

WAVE_FORMAT_EXTENSIBLE waveFormatEx;
waveFormatEx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
waveFormatEx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;

floatを指定

WAVE_FORMAT_EXTENSIBLE waveFormatEx;
waveFormatEx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
waveFormatEx.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;

ドキュメントの先頭へ

カクタスソフトウェア 技術協力 資料室 資料室の広場 SourceForge.jp お問い合わせ