mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 07:26:20 +00:00
[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
This commit is contained in:
parent
7ae8c563cc
commit
a0f720954d
5 changed files with 115 additions and 3 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -111,6 +111,11 @@ wodMessage(
|
|||
/* Continue playback when paused */
|
||||
break;
|
||||
}
|
||||
case WODM_PAUSE :
|
||||
{
|
||||
/* pause playback */
|
||||
break;
|
||||
}
|
||||
|
||||
case WODM_GETPOS :
|
||||
{
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue