VB.NETでDirectSoundを利用してWAVファイルを再生する
(その3)

ストリームバッファにサウンドデータを書き込む

DirectSoundでは、SetNotificationPositionsにて事前に登録した再生位置までサウンド再生が実行されるとアプリケーションに対してイベントが通知されます。

サンプルコードでは、このイベントの通知を受けたときに、直前にサウンドデータを書き込んだ最終位置からサウンドバッファ・サイズの1/2のサウンドデータをストリームバッファに書き込みます

サンプルコードを以下に示します。


'****************************************************************************/
'*
'*  @brief  DirectSoundからの再生イベント通知コールバック.
'*
'*  @param  なし.
'*
'*  @retval なし.
'*/
Private Sub OutputEventTask()

    m_WaveEnd  = False
    m_EndDelay = 3

    Do While ( m_IsDoing = True )

        ' DirectSoundからのイベントが発生するまで待つ.
        m_Event.WaitOne()
        If ( m_IsPlay = True ) Then

            ' WAVファイルから読み込む前に読み込みバッファをクリアする.
            m_DataBuf.Clear( m_DataBuf, 0, m_DataBuf.Length )

            ' WAVファイルから再生データを読み込む.
            Dim len As Integer
            len = m_File.Read( m_DataBuf )

            If ( len = 0 And m_WaveEnd = False ) Then
                m_WaveEnd  = True
                m_EndDelay = 3
            End If

            ' 再生バッファにオーディオ・データを書き込む.
            m_DXBuf.Write( m_WritePos, m_DataBuf, LockFlag.None )

            m_WritePos = m_WritePos + m_DataBuf.Length
            If ( m_WritePos >= m_BufSize ) Then
                m_WritePos = 0
            End If

            ' 最終データの再生が終了したので、STOPコマンドを発行する.
            If ( m_WaveEnd = True ) Then
                If ( m_EndDelay = 0 ) Then
                    Invoke( new Delegate_Stop_WaveSound( AddressOf Me.Stop_WaveSound ) )
                Else
                    m_EndDelay = m_EndDelay - 1
                End If
            End If
        End If
    Loop

End Sub
	

オーディオデータをストリームバッファに書き込む

SecondaryBufferクラスのWrite()メソッドを使用して、ストリームバッファに再生するWAVEデータを書き込みます。


    Public Sub Write( ByVal bufferStartingLocation As Integer, _
                      ByVal data As System.Array, _
                      ByVal flag As Microsoft.DirectX.DirectSound.LockFlag)
	

引数説明
bufferStartingLocation

データの書き込み開始位置(バイト)。

data

ストリームバッファに書き込むバイトデータの配列。

flag

LockFlag.Noneを指定します。



商標に関する表示