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 / 8nBlockAlign:1サンプルあたりのバイト数;非圧縮の場合 nChannels * wBitsPerSample / 8wBitsPerSample: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 件のコメント:
コメントを投稿