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を指定します。



Windows、DirectXおよびDirectSoundは米国Microsoft Corporationの登録商標です。