mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 07:56:59 +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 MMDEVICE_TYPE DeviceType,
|
||||||
IN BOOLEAN bStartReset)
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -277,8 +277,62 @@ StopStreamingInSoundThread(
|
||||||
IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
|
IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
|
||||||
IN PVOID Parameter)
|
IN PVOID Parameter)
|
||||||
{
|
{
|
||||||
/* TODO */
|
MMDEVICE_TYPE DeviceType;
|
||||||
return MMSYSERR_NOTSUPPORTED;
|
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
|
||||||
|
|
|
@ -111,6 +111,11 @@ wodMessage(
|
||||||
/* Continue playback when paused */
|
/* Continue playback when paused */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case WODM_PAUSE :
|
||||||
|
{
|
||||||
|
/* pause playback */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case WODM_GETPOS :
|
case WODM_GETPOS :
|
||||||
{
|
{
|
||||||
|
|
|
@ -206,6 +206,12 @@ MMixerSetWaveStatus(
|
||||||
IN HANDLE PinHandle,
|
IN HANDLE PinHandle,
|
||||||
IN KSSTATE State);
|
IN KSSTATE State);
|
||||||
|
|
||||||
|
MIXER_STATUS
|
||||||
|
MMixerSetWaveResetState(
|
||||||
|
IN PMIXER_CONTEXT MixerContext,
|
||||||
|
IN HANDLE PinHandle,
|
||||||
|
IN ULONG bBegin);
|
||||||
|
|
||||||
MIXER_STATUS
|
MIXER_STATUS
|
||||||
MMixerGetWaveDevicePath(
|
MMixerGetWaveDevicePath(
|
||||||
IN PMIXER_CONTEXT MixerContext,
|
IN PMIXER_CONTEXT MixerContext,
|
||||||
|
|
|
@ -608,6 +608,16 @@ MMixerSetWaveStatus(
|
||||||
{
|
{
|
||||||
KSPROPERTY Property;
|
KSPROPERTY Property;
|
||||||
ULONG Length;
|
ULONG Length;
|
||||||
|
MIXER_STATUS Status;
|
||||||
|
|
||||||
|
/* verify mixer context */
|
||||||
|
Status = MMixerVerifyContext(MixerContext);
|
||||||
|
|
||||||
|
if (Status != MM_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
/* invalid context passed */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* setup property request */
|
/* setup property request */
|
||||||
Property.Set = KSPROPSETID_Connection;
|
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
|
MIXER_STATUS
|
||||||
MMixerGetWaveDevicePath(
|
MMixerGetWaveDevicePath(
|
||||||
IN PMIXER_CONTEXT MixerContext,
|
IN PMIXER_CONTEXT MixerContext,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue