WASAPI利用時のPlaySoundMemの挙動について質問があり、スレッドを立てさせていただきます。
PlaySoundMemの説明に、第3引数TopPositionFlagにFALSEを与えた場合、
「最後に StopSoundMem をした位置か、SetSoundCurrentTime で指定した位置から再生される」とあります。
実際DxLib Ver3.20fにてそのようにふるまうことを確認しています。
しかしDxLib Ver3.21dでは、TopPositionFlagにFALSEを与えた場合の挙動が変わっているようです。
具体的な挙動を表現すると、「StopSoundMemを呼び出した後は音声は出力されないが、(再生位置を保存せずに)内部的に再生が続いており、
PlaySoundMemを呼び出すと再び音声が出力される(StopSoundMemを呼び出した位置よりも進んだところから再生される)」という状態です。
また上記の挙動はWASAPIを利用している場合のみ発生するようです。
(SetEnableWASAPIFlag(FALSE)を実行することで、以前と同じ挙動になります。)
以上のようなWASAPI利用時のPlaySoundMemの挙動は意図したものでしょうか?
以下、検証に利用したプログラムを載せます。
(利用したwavファイルは長さ約40秒のサンプリングレート44.1kHz ステレオ 32bitPCMでした。)
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
int SHandle;
// これを実行することで期待通り(Ver 3.20fと同様)の挙動になる
// SetEnableWASAPIFlag(FALSE);
if (DxLib_Init() == -1) return -1;
SHandle = LoadSoundMem("test.wav");
PlaySoundMem(SHandle, DX_PLAYTYPE_LOOP);
WaitTimer(5000);
// 約5秒再生したところで音声の出力が停止する
StopSoundMem(SHandle);
WaitTimer(5000);
// WASAPI利用時、音声の先頭から約10秒の部分から再生される
// WASAPI非利用時とVer3.20fでは音声の先頭から約5秒の部分から再生される
PlaySoundMem(SHandle, DX_PLAYTYPE_LOOP, FALSE);
WaitTimer(5000);
DeleteSoundMem(SHandle);
DxLib_End();
return 0;
}