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;
}
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
{
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;
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,