Author: silverblade Date: Tue Jul 15 15:43:32 2008 New Revision: 34534
URL: http://svn.reactos.org/svn/reactos?rev=34534&view=rev Log: Corrected wave output device close routine to ensure the device is "idle" rather than "stopped" (which actually means playback is paused...) Also added code to the I/O completion routine to detect when a submitted WAVEHDR from the client application has finished being played. No WAVEHDRs are returned to the client application (yet...)
Modified: branches/silverblade-audio/lib/drivers/sound/mmebuddy/wave/streaming.c branches/silverblade-audio/lib/drivers/sound/mmebuddy/wave/wodMessage.c
Modified: branches/silverblade-audio/lib/drivers/sound/mmebuddy/wave/streaming.c URL: http://svn.reactos.org/svn/reactos/branches/silverblade-audio/lib/drivers/so... ============================================================================== --- branches/silverblade-audio/lib/drivers/sound/mmebuddy/wave/streaming.c [iso-8859-1] (original) +++ branches/silverblade-audio/lib/drivers/sound/mmebuddy/wave/streaming.c [iso-8859-1] Tue Jul 15 15:43:32 2008 @@ -176,7 +176,14 @@ StreamInfo->CurrentBuffer = StreamInfo->CurrentBuffer->lpNext; }
+ /* Reset the writing offset */ StreamInfo->BufferOffset = 0; + + if ( StreamInfo->CurrentBuffer ) + { + /* Reset the completion offset */ + StreamInfo->CurrentBuffer->reserved = 0; + } }
/* Increase the number of outstanding buffers */ @@ -217,6 +224,7 @@ IN DWORD BytesWritten) { PWAVE_STREAM_INFO StreamInfo; + PWAVEHDR WaveHeader = (PWAVEHDR) Parameter;
TRACE_("CompleteWaveBuffer(%p, %p, %d)\n", SoundDeviceInstance, @@ -224,6 +232,25 @@ (int) BytesWritten);
ASSERT(SoundDeviceInstance); + ASSERT(WaveHeader); + + WaveHeader->reserved += BytesWritten; + ASSERT(WaveHeader->reserved <= WaveHeader->dwBufferLength); + + if ( WaveHeader->reserved == WaveHeader->dwBufferLength ) + { + TRACE_("* Completed wavehdr %p (length %d)\n", + WaveHeader, + (int) WaveHeader->dwBufferLength); + /* TODO: Give it back to the client */ + } + else + { + TRACE_("* Partial wavehdr completion %p (%d/%d)\n", + WaveHeader, + (int) WaveHeader->reserved, + (int) WaveHeader->dwBufferLength); + }
StreamInfo = &SoundDeviceInstance->Streaming.Wave;
Modified: branches/silverblade-audio/lib/drivers/sound/mmebuddy/wave/wodMessage.c URL: http://svn.reactos.org/svn/reactos/branches/silverblade-audio/lib/drivers/so... ============================================================================== --- branches/silverblade-audio/lib/drivers/sound/mmebuddy/wave/wodMessage.c [iso-8859-1] (original) +++ branches/silverblade-audio/lib/drivers/sound/mmebuddy/wave/wodMessage.c [iso-8859-1] Tue Jul 15 15:43:32 2008 @@ -114,7 +114,8 @@ Result = GetWaveDeviceState(Instance, &State); ASSERT(Result == MMSYSERR_NOERROR);
- if ( State == WAVE_DD_PLAYING ) + /* Must not be playing or paused */ + if ( State != WAVE_DD_IDLE ) return WAVERR_STILLPLAYING;
Result = DestroySoundDeviceInstance(Instance);