diff --git a/sdk/include/reactos/libs/sound/mmebuddy.h b/sdk/include/reactos/libs/sound/mmebuddy.h index d124e8bbc1d..4056621b181 100644 --- a/sdk/include/reactos/libs/sound/mmebuddy.h +++ b/sdk/include/reactos/libs/sound/mmebuddy.h @@ -120,7 +120,6 @@ typedef struct _SOUND_OVERLAPPED OVERLAPPED Standard; struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance; PWAVEHDR Header; - BOOL PerformCompletion; LPOVERLAPPED_COMPLETION_ROUTINE OriginalCompletionRoutine; PVOID CompletionContext; diff --git a/sdk/lib/drivers/sound/mmebuddy/readme.txt b/sdk/lib/drivers/sound/mmebuddy/readme.txt index 91b52a78b63..a57127b8916 100644 --- a/sdk/lib/drivers/sound/mmebuddy/readme.txt +++ b/sdk/lib/drivers/sound/mmebuddy/readme.txt @@ -26,7 +26,7 @@ Unsupported MME messages: * Any not mentioned above Notes/Bugs: -* WHDR_BEGINLOOP and WHDR_ENDLOOP are ignored +* WHDR_BEGINLOOP and WHDR_ENDLOOP are not working for looping multiple wave headers, only for a single header. * Not possible to pause/restart playback diff --git a/sdk/lib/drivers/sound/mmebuddy/wave/streaming.c b/sdk/lib/drivers/sound/mmebuddy/wave/streaming.c index 3a4cabc9385..15a58cfd486 100644 --- a/sdk/lib/drivers/sound/mmebuddy/wave/streaming.c +++ b/sdk/lib/drivers/sound/mmebuddy/wave/streaming.c @@ -10,7 +10,6 @@ #include "precomp.h" - /* DoWaveStreaming Check if there is streaming to be done, and if so, do it. @@ -54,6 +53,22 @@ DoWaveStreaming( return; } + /* Do we need to loop a header? */ + if (DeviceType == WAVE_OUT_DEVICE_TYPE && (Header->dwFlags & WHDR_BEGINLOOP)) + { + if ((Header->dwFlags & WHDR_ENDLOOP)) + { + /* Get loop count */ + SoundDeviceInstance->LoopsRemaining = Header->dwLoops; + } + else + { + /* Report and help notice such a case */ + SND_WARN(L"Looping multiple headers is UNIMPLEMENTED. Will play once only\n"); + SND_ASSERT((Header->dwFlags & (WHDR_BEGINLOOP | WHDR_ENDLOOP)) == (WHDR_BEGINLOOP | WHDR_ENDLOOP)); + } + } + while ( ( SoundDeviceInstance->OutstandingBuffers < SoundDeviceInstance->BufferCount ) && ( Header ) && SoundDeviceInstance->ResetInProgress == FALSE) { @@ -106,10 +121,6 @@ DoWaveStreaming( Overlap->SoundDeviceInstance = SoundDeviceInstance; Overlap->Header = Header; - /* Don't complete this header if it's part of a loop */ - Overlap->PerformCompletion = TRUE; -// ( SoundDeviceInstance->LoopsRemaining > 0 ); - /* Adjust the commit-related counters */ HeaderExtension->BytesCommitted += BytesToCommit; ++ SoundDeviceInstance->OutstandingBuffers; @@ -189,8 +200,8 @@ CompleteIO( -- SoundDeviceInstance->OutstandingBuffers; /* Did we finish a WAVEHDR and aren't looping? */ - if ( HdrExtension->BytesCompleted + dwNumberOfBytesTransferred >= WaveHdr->dwBufferLength && - SoundOverlapped->PerformCompletion ) + if (HdrExtension->BytesCompleted + dwNumberOfBytesTransferred >= WaveHdr->dwBufferLength && + SoundDeviceInstance->LoopsRemaining == 0) { /* Wave buffer fully completed */ Bytes = WaveHdr->dwBufferLength - HdrExtension->BytesCompleted; @@ -203,9 +214,24 @@ CompleteIO( } else { - /* Partially completed */ - HdrExtension->BytesCompleted += dwNumberOfBytesTransferred; - SND_TRACE(L"%d/%d bytes of wavehdr completed\n", HdrExtension->BytesCompleted, WaveHdr->dwBufferLength); + /* Do we loop a header? */ + if (HdrExtension->BytesCommitted == WaveHdr->dwBufferLength && + SoundDeviceInstance->LoopsRemaining != 0) + { + /* Reset amount of bytes and decrement loop count, to play next iteration */ + HdrExtension->BytesCommitted = 0; + + if (SoundDeviceInstance->LoopsRemaining != INFINITE) + --SoundDeviceInstance->LoopsRemaining; + SND_TRACE(L"Looping the header, remaining loops %u\n", SoundDeviceInstance->LoopsRemaining); + } + else + { + /* Partially completed */ + HdrExtension->BytesCompleted += dwNumberOfBytesTransferred; + SND_TRACE(L"%u/%u bytes of wavehdr completed\n", HdrExtension->BytesCompleted, WaveHdr->dwBufferLength); + } + break; }