2009年8月5日水曜日

Windows Multimedia Audioによる録音

mmsystem.hをインクルードし,winmm.libとリンクする. (MSDNには「windows.hをインクルード」と書いてあるが,WIN32_LEAN_AND_MEANが定義されているとインクルードされないので注意が必要)

  1. デバイスの列挙
  2. デバイスのオープン
  3. 録音の開始
  4. 録音の停止
  5. デバイスのクローズ

という順序で行う.

デバイスの列挙

waveInGetNumDevs関数を用いてデバイスの数を取得し, waveInGetDevCaps関数で個々のデバイスの情報 (WAVEINCAPS構造体)を得る.

デバイスのオープン・クローズ

デバイスを開くにはwaveInOpen関数, 閉じるにはwaveInClose関数を使用する.

waveInOpen関数の第2引数uDeviceIDにはデバイスの列挙で使用したのと同じ番号を指定できる.

また,waveInOpen関数の第3引数に使用するWAVEFORMATEX構造体の各メンバの意味を簡単にまとめておく.(非圧縮の場合)

typedef struct tWAVEFORMATEX {
    WORD   wFormatTag;
    WORD   nChannels;
    DWORD  nSamplesPerSec;
    DWORD  nAvgBytesPerSec;
    WORD   nBlockAlign;
    WORD   wBitsPerSample;
    WORD   cbSize;
} WAVEFORMATEX, *PWAVEFORMATEX, NEAR NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;
wFormatTag:録音形式の種類
  • WAVE_FORMAT_PCM
  • WAVE_FORMAT_EXTENSIBLE
  • その他はmmreg.hを参照
nChannels:チャンネル数
nSamplesPerSec:1秒当たりのサンプル数
nAvgBytesPerSec:非圧縮の場合nChannels * wBitsPerSample / 8
nBlockAlign:1サンプルあたりのバイト数;非圧縮の場合nChannels * wBitsPerSample / 8
wBitsPerSample:1サンプル,1チャンネルあたりのビット数
  • WAVE_FORMAT_PCMのときは,8か16
  • WAVE_FORMAT_EXTENSIBLEのときは,任意の8の倍数.

録音の開始・停止

録音の開始にはwaveInStart関数, 録音の停止にはwaveInStop関数, 録音の終了にはwaveInReset関数を使用する.

waveInStop関数は,現在書き込み中のバッファのみを書き込み済みとして,アプリケーションに返す. 一方,waveInReset関数は,登録されたすべてのバッファを書き込み済みとして,アプリケーションに返す.

バッファ

バッファは録音中,

  1. 初期化
  2. 登録
  3. データ処理
  4. 解除

を繰り返す.録音開始前にすべてのバッファを登録し,バッファを受け取る度に

  1. データ処理
  2. 解除
  3. 初期化
  4. 再登録

を行う.

バッファの初期化にはwaveInPrepareHeader関数, 設定にはwaveInAddBuffer関数, 解除にはwaveInUnprepareHeader関数を使用する. バッファとして確保したメモリ領域を解放する際には,必ず先にバッファを解除しておく.

バッファの識別に用いるWAVEHDR構造体は,以下のように設定してから初期化・設定し,使用する.

typedef struct wavehdr_tag {
    LPSTR       lpData;
    DWORD       dwBufferLength;
    DWORD       dwBytesRecorded;
    DWORD_PTR   dwUser;
    DWORD       dwFlags;
    DWORD       dwLoops;
    struct wavehdr_tag FAR *lpNext;
    DWORD_PTR   reserved;
} WAVEHDR, *PWAVEHDR, NEAR *NPWAVEHDR, FAR *LPWAVEHDR;
lpData:バッファとして使用するメモリブロックの先頭へのポインタ
dwBufferLength:バッファのサイズ(バイト)
dwBytesRecorded:録音したデータのサイズ(初期化の時には使用せず,データ処理時に使用する)
その他:0に初期化し,使用しない.

コールバックについて

コールバック関数(waveInProc),スレッド,ウィンドウなどを使うことができる.

いずれの場合でも,バッファがアプリケーションに返されるときにはWIM_DATAメッセージが使われる. WIM_DATAメッセージのdwParam1(またはlParam)をLPWAVEHDRに型キャストして処理する.


Windows Multimedia Audioを使うメリットは,現行のほぼすべてのバージョンのWindowsでサポートされていること. Windows Vista以降では,より低レベルなWindows Core Audio APIを使用することもできる.

0 件のコメント:

コメントを投稿