C#でDirectSoundを利用してWAVファイルを再生する
(その3)
DirectSoundでは、SetNotificationPositionsにて事前に登録した再生位置までサウンド再生が実行されるとアプリケーションに対してイベントが通知されます。
サンプルコードでは、このイベントの通知を受けたときに、直前にサウンドデータを書き込んだ最終位置からサウンドバッファ・サイズの1/2のサウンドデータをストリームバッファに書き込みます
サンプルコードを以下に示します。
/****************************************************************************/
/*!
* @brief DirectSoundからの再生イベント通知コールバック.
*
* @param なし.
*
* @retval なし.
*/
private void OutputEventTask()
{
m_WaveEnd = false;
m_EndDelay = 3;
while( m_IsDoing == true ){
//! DirectSoundからのイベントが発生するまで待つ.
m_Event.WaitOne();
if( m_IsPlay == true ){
//! WAVファイルから読み込む前に読み込みバッファをクリアする.
System.Array.Clear( m_DataBuf, 0, m_DataBuf.Length );
//! WAVファイルから再生データを読み込む.
int len = m_File.Read( m_DataBuf );
if( len == 0 && m_WaveEnd == false ){
m_WaveEnd = true;
m_EndDelay = 3;
}
//! 再生バッファにオーディオ・データを書き込む.
m_DXBuf.Write( m_WritePos, m_DataBuf, LockFlag.None );
m_WritePos = m_WritePos + m_DataBuf.Length;
if( m_WritePos >= m_BufSize ){
m_WritePos = 0;
}
//! 最終データの再生が終了したので、STOPコマンドを発行する.
if( m_WaveEnd == true ){
if( m_EndDelay == 0 ){
Invoke( new Delegate_Stop_WaveSound( Stop_WaveSound ) );
}else{
m_EndDelay = m_EndDelay - 1;
}
}
}
}
}
SecondaryBufferクラスのWrite()メソッドを使用して、ストリームバッファに再生するWAVEデータを書き込みます。
public void Write( int bufferStartingLocation, Array data, LockFlag flag )
引数 | 説明 |
---|---|
bufferStartingLocation | データの書き込み開始位置(バイト)。 |
data | ストリームバッファに書き込むバイトデータの配列。 |
flag | LockFlag.Noneを指定します。 |