mmsystem.h
をインクルードし,winmm.lib
とリンクする.
(MSDNには「windows.h
をインクルード」と書いてあるが,WIN32_LEAN_AND_MEAN
が定義されているとインクルードされないので注意が必要)
- デバイスの列挙
- デバイスのオープン
- 録音の開始
- 録音の停止
- デバイスのクローズ
という順序で行う.
デバイスの列挙
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か16WAVE_FORMAT_EXTENSIBLE
のときは,任意の8の倍数.
録音の開始・停止
録音の開始にはwaveInStart
関数,
録音の停止にはwaveInStop
関数,
録音の終了にはwaveInReset
関数を使用する.
waveInStop
関数は,現在書き込み中のバッファのみを書き込み済みとして,アプリケーションに返す.
一方,waveInReset
関数は,登録されたすべてのバッファを書き込み済みとして,アプリケーションに返す.
バッファ
バッファは録音中,
- 初期化
- 登録
- データ処理
- 解除
を繰り返す.録音開始前にすべてのバッファを登録し,バッファを受け取る度に
- データ処理
- 解除
- 初期化
- 再登録
を行う.
バッファの初期化には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 件のコメント:
コメントを投稿