waveOutReset() と ノイズ(再)
前回分の具体的な使用例。
こんな感じで大丈夫なはずです。/*
=== 使用する変数・定数 ===
・再生デバイスのハンドル
… (HWAVEOUT) wave_out・実際に鳴らすデータ
(再生用バッファ)
… (short*) play_data
((short*) play_data[M_B])・実際に鳴らす長さ
(バッファサイズ)
… WAVEBUF_LEN・WAVE形式定義用ヘッダ
… (WAVEHDR*) header
((WAVEHDR*) header[M_B])
(・(マルチバッファリング((複数のバッファを用いて音を途切れさせずに(長時間?)鳴らす方法。
小さいバッファを使い回すので、普通に一発録りしたもの(?)を鳴らすよりもメモリ効率が良く、
(細かい単位で扱える為、)音を加工しながら鳴らすことも可能になる。))時の)バッファ数
… M_B
)
とする。
//*//*** 本文はここから ***/
...
// 停止
waveOutReset( wave_out );// ヘッダ(鳴らすバッファ)がx1の場合
/*
if( play_data != NULL )
{
memset( play_data, (short)0, WAVEBUF_LEN );
waveOutWrite( wave_out, header, sizeof(WAVEHDR) );
}
//*/
// ヘッダが複数存在する場合
{
int k=0;for( ; k < M_B ; k++ )
{
// 念のためデータ領域が確保されているか確認
if( play_data != NULL )
{
// 残っているデータ(=ゴミの部分)を初期化する
// ちなみにBYTE型のデータを使用する場合は
// 「(BYTE)128」で初期化する
memset( play_data[k], (short)0, WAVEBUF_LEN );// 空のデータを鳴らしてキューを掃除する
waveOutWrite( wave_out, header[k], sizeof(WAVEHDR) );
}
}
}
...
/*** 本文はここまで ***/
最後のwaveOutWrite()が無いと
たまに次回の再生に失敗するようなので
きっちり無音を鳴らしてキューの掃除をしておくのが正解のようです。
後、
マルチバッファリング時に
再生用のバッファ、
上記で言うと「play_data」の部分を
連続して確保しておくと
こんな感じでまとめて初期化が出来るので
{
int k=0;if( play_data[0] != NULL )
{
// 連続して確保してあるので
// まとめて一回で初期化が済む
memset( play_data[0], (short)0, WAVEBUF_LEN *M_B );for( ; k < M_B ; k++ )
{
waveOutWrite( wave_out, header[k], sizeof(WAVEHDR) );
}
}
}
楽なだけでなく(おそらく)速いです。
--- 修正 07/08/29 9:44
memsetのサイズ指定が若干間違っていたの修正