[AUDIO-BRINGUP]
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Fri, 10 Dec 2010 06:14:10 +0000 (06:14 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Fri, 10 Dec 2010 06:14:10 +0000 (06:14 +0000)
- 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
lib/drivers/sound/mmebuddy/wave/streaming.c
lib/drivers/sound/mmebuddy/wave/wodMessage.c
lib/drivers/sound/mmixer/mmixer.h
lib/drivers/sound/mmixer/wave.c

index 0047e8d..143c670 100644 (file)
@@ -751,7 +751,19 @@ WdmAudResetStreamByMMixer(
     IN  MMDEVICE_TYPE DeviceType,
     IN  BOOLEAN bStartReset)
 {
     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;
 }
 
     return MMSYSERR_NOTSUPPORTED;
 }
 
index 2d46089..847adeb 100644 (file)
@@ -277,8 +277,62 @@ StopStreamingInSoundThread(
     IN  PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
     IN  PVOID Parameter)
 {
     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
 }
 
 MMRESULT
index 330c5f2..935c271 100644 (file)
@@ -111,6 +111,11 @@ wodMessage(
             /* Continue playback when paused */
             break;
         }
             /* Continue playback when paused */
             break;
         }
+        case WODM_PAUSE :
+        {
+            /* pause playback */
+            break;
+        }
 
         case WODM_GETPOS :
         {
 
         case WODM_GETPOS :
         {
index 4b7b146..5cd530a 100644 (file)
@@ -206,6 +206,12 @@ MMixerSetWaveStatus(
     IN HANDLE PinHandle,
     IN KSSTATE State);
 
     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,
 MIXER_STATUS
 MMixerGetWaveDevicePath(
     IN PMIXER_CONTEXT MixerContext,
index c48f03b..1d39f37 100644 (file)
@@ -608,6 +608,16 @@ MMixerSetWaveStatus(
 {
     KSPROPERTY Property;
     ULONG Length;
 {
     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;
 
     /* 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);
 }
 
     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,
 MIXER_STATUS
 MMixerGetWaveDevicePath(
     IN PMIXER_CONTEXT MixerContext,