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のサイズ指定が若干間違っていたの修正