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