From a0f720954dd99b87da0b00811858a224c23669fd Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 10 Dec 2010 06:14:10 +0000 Subject: [PATCH] [AUDIO-BRINGUP] - Implement WdmAudResetStreamByMMixer, StopStreamingInSoundThread - WIDM_RESET / WODM_RESET are now implemented - Skipping now audio bytes (i.e. jumping to different audio position) now properly works and no longer causes a hang under certain conditions svn path=/branches/audio-bringup/; revision=49997 --- dll/win32/wdmaud.drv/mmixer.c | 14 ++++- lib/drivers/sound/mmebuddy/wave/streaming.c | 58 +++++++++++++++++++- lib/drivers/sound/mmebuddy/wave/wodMessage.c | 5 ++ lib/drivers/sound/mmixer/mmixer.h | 6 ++ lib/drivers/sound/mmixer/wave.c | 35 ++++++++++++ 5 files changed, 115 insertions(+), 3 deletions(-) diff --git a/dll/win32/wdmaud.drv/mmixer.c b/dll/win32/wdmaud.drv/mmixer.c index 0047e8d520f..143c670082c 100644 --- a/dll/win32/wdmaud.drv/mmixer.c +++ b/dll/win32/wdmaud.drv/mmixer.c @@ -751,7 +751,19 @@ WdmAudResetStreamByMMixer( IN MMDEVICE_TYPE DeviceType, IN BOOLEAN bStartReset) { - /* FIXME */ + MIXER_STATUS Status; + + if (DeviceType == WAVE_IN_DEVICE_TYPE || DeviceType == WAVE_OUT_DEVICE_TYPE) + { + Status = MMixerSetWaveResetState(&MixerContext, SoundDeviceInstance->Handle, bStartReset); + if (Status == MM_STATUS_SUCCESS) + { + /* completed successfully */ + return MMSYSERR_NOERROR; + } + } + + return MMSYSERR_NOTSUPPORTED; } diff --git a/lib/drivers/sound/mmebuddy/wave/streaming.c b/lib/drivers/sound/mmebuddy/wave/streaming.c index 2d4608949fa..847adebc137 100644 --- a/lib/drivers/sound/mmebuddy/wave/streaming.c +++ b/lib/drivers/sound/mmebuddy/wave/streaming.c @@ -277,8 +277,62 @@ StopStreamingInSoundThread( IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, IN PVOID Parameter) { - /* TODO */ - return MMSYSERR_NOTSUPPORTED; + MMDEVICE_TYPE DeviceType; + PMMFUNCTION_TABLE FunctionTable; + MMRESULT Result; + PSOUND_DEVICE SoundDevice; + + /* set state reset in progress */ + SoundDeviceInstance->ResetInProgress = TRUE; + + /* Get sound device */ + Result = GetSoundDeviceFromInstance(SoundDeviceInstance, &SoundDevice); + SND_ASSERT( Result == MMSYSERR_NOERROR ); + + /* Obtain the function table */ + Result = GetSoundDeviceFunctionTable(SoundDevice, &FunctionTable); + SND_ASSERT( Result == MMSYSERR_NOERROR ); + + /* Obtain device instance type */ + Result = GetSoundDeviceType(SoundDevice, &DeviceType); + SND_ASSERT( Result == MMSYSERR_NOERROR ); + + /* Check if reset function is supported */ + if (FunctionTable->ResetStream) + { + /* cancel all current audio buffers */ + FunctionTable->ResetStream(SoundDeviceInstance, DeviceType, TRUE); + } + + /* complete all current headers */ + while( SoundDeviceInstance->HeadWaveHeader ) + { + SND_TRACE(L"StopStreamingInSoundThread: Completing Header %p\n", SoundDeviceInstance->HeadWaveHeader); + CompleteWaveHeader( SoundDeviceInstance, SoundDeviceInstance->HeadWaveHeader ); + } + + /* there should be no oustanding buffers now */ + SND_ASSERT(SoundDeviceInstance->OutstandingBuffers == 0); + + while(SoundDeviceInstance->OutstandingBuffers) + { + SND_ERR("StopStreamingInSoundThread OutStandingBufferCount %lu\n", SoundDeviceInstance->OutstandingBuffers); + /* my hack of doom */ + Sleep(10); + } + + /* Check if reset function is supported */ + if (FunctionTable->ResetStream) + { + /* finish the reset */ + FunctionTable->ResetStream(SoundDeviceInstance, DeviceType, FALSE); + } + + /* clear state reset in progress */ + SoundDeviceInstance->ResetInProgress = FALSE; + + + return MMSYSERR_NOERROR; } MMRESULT diff --git a/lib/drivers/sound/mmebuddy/wave/wodMessage.c b/lib/drivers/sound/mmebuddy/wave/wodMessage.c index 330c5f2aab6..935c2710b8b 100644 --- a/lib/drivers/sound/mmebuddy/wave/wodMessage.c +++ b/lib/drivers/sound/mmebuddy/wave/wodMessage.c @@ -111,6 +111,11 @@ wodMessage( /* Continue playback when paused */ break; } + case WODM_PAUSE : + { + /* pause playback */ + break; + } case WODM_GETPOS : { diff --git a/lib/drivers/sound/mmixer/mmixer.h b/lib/drivers/sound/mmixer/mmixer.h index 4b7b1467788..5cd530abffa 100644 --- a/lib/drivers/sound/mmixer/mmixer.h +++ b/lib/drivers/sound/mmixer/mmixer.h @@ -206,6 +206,12 @@ MMixerSetWaveStatus( IN HANDLE PinHandle, IN KSSTATE State); +MIXER_STATUS +MMixerSetWaveResetState( + IN PMIXER_CONTEXT MixerContext, + IN HANDLE PinHandle, + IN ULONG bBegin); + MIXER_STATUS MMixerGetWaveDevicePath( IN PMIXER_CONTEXT MixerContext, diff --git a/lib/drivers/sound/mmixer/wave.c b/lib/drivers/sound/mmixer/wave.c index c48f03bba58..1d39f37c479 100644 --- a/lib/drivers/sound/mmixer/wave.c +++ b/lib/drivers/sound/mmixer/wave.c @@ -608,6 +608,16 @@ MMixerSetWaveStatus( { KSPROPERTY Property; ULONG Length; + MIXER_STATUS Status; + + /* verify mixer context */ + Status = MMixerVerifyContext(MixerContext); + + if (Status != MM_STATUS_SUCCESS) + { + /* invalid context passed */ + return Status; + } /* setup property request */ Property.Set = KSPROPSETID_Connection; @@ -617,6 +627,31 @@ MMixerSetWaveStatus( return MixerContext->Control(PinHandle, IOCTL_KS_PROPERTY, &Property, sizeof(KSPROPERTY), &State, sizeof(KSSTATE), &Length); } +MIXER_STATUS +MMixerSetWaveResetState( + IN PMIXER_CONTEXT MixerContext, + IN HANDLE PinHandle, + IN ULONG bBegin) +{ + ULONG Length; + MIXER_STATUS Status; + KSRESET Reset; + + /* verify mixer context */ + Status = MMixerVerifyContext(MixerContext); + + if (Status != MM_STATUS_SUCCESS) + { + /* invalid context passed */ + return Status; + } + + /* begin / stop reset */ + Reset = (bBegin ? KSRESET_BEGIN : KSRESET_END); + + return MixerContext->Control(PinHandle, IOCTL_KS_RESET_STATE, &Reset, sizeof(KSRESET), NULL, 0, &Length); +} + MIXER_STATUS MMixerGetWaveDevicePath( IN PMIXER_CONTEXT MixerContext, -- 2.17.1