曲を途中から再生する
http://ochakkolab.blog116.fc2.com/blog-entry-136.html
うまくコメントを投稿できないのでこちらに書きます。
XAudio2はまだ使っていないのですが、ドキュメントを読む限りではIXAudio2SourceVoice::SubmitSourceBuffer
関数に渡すXAUDIO2_BUFFER
型の変数に再生開始位置を指定できると思います。
具体的には以下のようにしてみるとか:
XAUDIO2_BUFFER buffer = {0}; buffer.PlayBegin = 100; // 100サンプルから再生開始 // 以下略
MSDNにあるIXAudio2SourceVoice::SubmitSourceBuffer
関数のドキュメントの「特定のバッファーの一部のみを再生する必要がある場合は」あたりからの記述や、
また、XAUDIO2_BUFFER
構造体のドキュメントのPlayBegin
変数の説明も参考になると思います。
追記
手元にあったDirectX SDK (March 2009)のサンプル XAudio2BasicSound を使って動作を確認しました。
XAudio2BasicSound.cppのPlayPCM
関数に以下ようなコードがあります。
// Submit the wave sample data using an XAUDIO2_BUFFER structure XAUDIO2_BUFFER buffer = {0}; buffer.pAudioData = pbWaveData; buffer.Flags = XAUDIO2_END_OF_STREAM; // tell the source voice not to expect any data after this buffer buffer.AudioBytes = cbWaveSize; if( FAILED( hr = pSourceVoice->SubmitSourceBuffer( &buffer ) ) )
これを次のようにします。
// Submit the wave sample data using an XAUDIO2_BUFFER structure XAUDIO2_BUFFER buffer = {0}; buffer.pAudioData = pbWaveData; buffer.Flags = XAUDIO2_END_OF_STREAM; // tell the source voice not to expect any data after this buffer buffer.AudioBytes = cbWaveSize; buffer.PlayBegin = 40000; // 追加。40000は適当な数字。1サンプル単位。 if( FAILED( hr = pSourceVoice->SubmitSourceBuffer( &buffer ) ) )
こうすることで、曲の途中から再生が開始されました。
追記2
やっぱりうまくコメントを投稿できなかったので、メールでこの日記を読んでいただくよう伝えた。