diff --git a/dll/win32/wdmaud.drv/legacy.c b/dll/win32/wdmaud.drv/legacy.c index f1ada7cdd3b95..95d38c3c43a80 100644 --- a/dll/win32/wdmaud.drv/legacy.c +++ b/dll/win32/wdmaud.drv/legacy.c @@ -832,7 +832,7 @@ WdmAudGetWavePositionByLegacy( DeviceInfo.DeviceType = DeviceType; Result = SyncOverlappedDeviceIoControl(KernelHandle, - IOCTL_OPEN_WDMAUD, + IOCTL_GETPOS, (LPVOID) &DeviceInfo, sizeof(WDMAUD_DEVICE_INFO), (LPVOID) &DeviceInfo, diff --git a/dll/win32/wdmaud.drv/mmixer.c b/dll/win32/wdmaud.drv/mmixer.c index 8fc2ed6309c9b..3b032531026c8 100644 --- a/dll/win32/wdmaud.drv/mmixer.c +++ b/dll/win32/wdmaud.drv/mmixer.c @@ -776,7 +776,32 @@ WdmAudGetWavePositionByMMixer( IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance, IN MMTIME* Time) { - /* FIXME */ + PSOUND_DEVICE SoundDevice; + MMDEVICE_TYPE DeviceType; + MIXER_STATUS Status; + MMRESULT Result; + DWORD Position; + + Result = GetSoundDeviceFromInstance(SoundDeviceInstance, &SoundDevice); + if (!MMSUCCESS(Result)) + return TranslateInternalMmResult(Result); + + Result = GetSoundDeviceType(SoundDevice, &DeviceType); + SND_ASSERT(Result == MMSYSERR_NOERROR); + + if (DeviceType == WAVE_IN_DEVICE_TYPE || DeviceType == WAVE_OUT_DEVICE_TYPE) + { + Status = MMixerGetWavePosition(&MixerContext, SoundDeviceInstance->Handle, &Position); + if (Status == MM_STATUS_SUCCESS) + { + /* Store position */ + Time->wType = TIME_BYTES; + Time->u.cb = Position; + + /* Completed successfully */ + return MMSYSERR_NOERROR; + } + } return MMSYSERR_NOTSUPPORTED; } diff --git a/drivers/wdm/audio/legacy/wdmaud/control.c b/drivers/wdm/audio/legacy/wdmaud/control.c index f9ae9a323396b..5aecad326d086 100644 --- a/drivers/wdm/audio/legacy/wdmaud/control.c +++ b/drivers/wdm/audio/legacy/wdmaud/control.c @@ -366,6 +366,7 @@ WdmAudDeviceControl( case IOCTL_RESET_STREAM: return WdmAudResetStream(DeviceObject, Irp, DeviceInfo); case IOCTL_GETPOS: + return WdmAudGetPosition(DeviceObject, Irp, DeviceInfo); case IOCTL_GETDEVID: case IOCTL_GETVOLUME: case IOCTL_SETVOLUME: diff --git a/drivers/wdm/audio/legacy/wdmaud/mmixer.c b/drivers/wdm/audio/legacy/wdmaud/mmixer.c index dbf97ba56081d..1c7b9a5cf141f 100644 --- a/drivers/wdm/audio/legacy/wdmaud/mmixer.c +++ b/drivers/wdm/audio/legacy/wdmaud/mmixer.c @@ -769,6 +769,28 @@ WdmAudMidiCapabilities( return STATUS_UNSUCCESSFUL; } +NTSTATUS +NTAPI +WdmAudGetPosition( + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp, + _In_ PWDMAUD_DEVICE_INFO DeviceInfo) +{ + MIXER_STATUS Status; + ULONG Position; + + /* Get position */ + Status = MMixerGetWavePosition(&MixerContext, DeviceInfo->hDevice, &Position); + + if (Status == MM_STATUS_SUCCESS) + { + DeviceInfo->u.Position = (ULONGLONG)Position; + return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); + } + else + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); +} + MIXER_STATUS CreatePinCallback( diff --git a/drivers/wdm/audio/legacy/wdmaud/wdmaud.h b/drivers/wdm/audio/legacy/wdmaud/wdmaud.h index 4c56a87e21ea8..12588f0a2a56d 100644 --- a/drivers/wdm/audio/legacy/wdmaud/wdmaud.h +++ b/drivers/wdm/audio/legacy/wdmaud/wdmaud.h @@ -198,6 +198,13 @@ WdmAudMidiCapabilities( IN PWDMAUD_CLIENT ClientInfo, IN PWDMAUD_DEVICE_EXTENSION DeviceExtension); +NTSTATUS +NTAPI +WdmAudGetPosition( + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp, + _In_ PWDMAUD_DEVICE_INFO DeviceInfo); + NTSTATUS NTAPI WdmAudFrameSize( diff --git a/sdk/lib/drivers/sound/mmixer/mmixer.h b/sdk/lib/drivers/sound/mmixer/mmixer.h index 7d88125ce369b..396d221d2e493 100644 --- a/sdk/lib/drivers/sound/mmixer/mmixer.h +++ b/sdk/lib/drivers/sound/mmixer/mmixer.h @@ -207,6 +207,12 @@ MMixerOpenWave( IN PVOID Context, OUT PHANDLE PinHandle); +MIXER_STATUS +MMixerGetWavePosition( + _In_ PMIXER_CONTEXT MixerContext, + _In_ HANDLE PinHandle, + _Out_ PDWORD Position); + MIXER_STATUS MMixerSetWaveStatus( IN PMIXER_CONTEXT MixerContext, diff --git a/sdk/lib/drivers/sound/mmixer/wave.c b/sdk/lib/drivers/sound/mmixer/wave.c index cdf9a78d92f46..bfce31e562788 100644 --- a/sdk/lib/drivers/sound/mmixer/wave.c +++ b/sdk/lib/drivers/sound/mmixer/wave.c @@ -614,6 +614,40 @@ MMixerGetWaveOutCount( return MixerList->WaveOutListCount; } +MIXER_STATUS +MMixerGetWavePosition( + _In_ PMIXER_CONTEXT MixerContext, + _In_ HANDLE PinHandle, + _Out_ PDWORD Position) +{ + KSAUDIO_POSITION AudioPosition; + KSPROPERTY Property; + MIXER_STATUS Status; + ULONG Length; + + /* Validate mixer context */ + Status = MMixerVerifyContext(MixerContext); + + if (Status != MM_STATUS_SUCCESS) + return Status; + + Property.Id = KSPROPERTY_AUDIO_POSITION; + Property.Set = KSPROPSETID_Audio; + Property.Flags = KSPROPERTY_TYPE_GET; + + Status = MixerContext->Control(PinHandle, IOCTL_KS_PROPERTY, + &Property, sizeof(Property), + &AudioPosition, sizeof(AudioPosition), + &Length); + if (Status == MM_STATUS_SUCCESS) + { + /* store audio position */ + *Position = (DWORD)AudioPosition.PlayOffset; + } + + return Status; +} + MIXER_STATUS MMixerSetWaveStatus( IN PMIXER_CONTEXT MixerContext,