mirror of
https://github.com/reactos/reactos.git
synced 2025-04-25 16:10:29 +00:00

Implement GetWavePosition API for both Legacy and MMixer modes. [WDMAUD.DRV] - Fix wrong I/O control code passed to DeviceIoControl for Legacy mode. Use IOCTL_GETPOS instead of IOCTL_OPEN_WDMAUD, to use the correct routine. - Implement WdmAudGetWavePosition for MMixer mode, as it was completely unimplemented there. Call an appropiate MMixer routine and return back resulting wave position. [WDMAUD] - Implement WdmAudGetPostion routine, which is used by Legacy mode, and call the same MMixer routine from it too. - Handle it in IOCTL_GETPOS I/O control request of dispatch routine. [MMIXER] - Implement MMixerGetWavePosition internal routine, which is called by both Legacy and MMixer modes, and does the actual work of retrieving playback position. - Call an apporpriate KSPROPERTY_AUDIO_POSITION property from it, and return in the output resulting KSAUDIO_POSITION.PlayOffset member, which contains the current playback position offset, to be returned to the caller. This fixes a failure retreiving the current audio playback position snd subsequent playing the audio data by several 3rd-party applications which are using this API (for example, some Gecko based browsers by @roytam1: Basilisk (Serpent) 52.9.0 IA-32 build, NewMoon 28.10.7 IA-32 build and KMeleon 76.5.3 Goanna engine). CORE-19542
338 lines
6.5 KiB
C
338 lines
6.5 KiB
C
#ifndef _WDMAUD_PCH_
|
|
#define _WDMAUD_PCH_
|
|
|
|
#include <portcls.h>
|
|
#include <mmsystem.h>
|
|
|
|
#include "interface.h"
|
|
|
|
typedef struct
|
|
{
|
|
PMDL Mdl;
|
|
ULONG Length;
|
|
ULONG Function;
|
|
PFILE_OBJECT FileObject;
|
|
}WDMAUD_COMPLETION_CONTEXT, *PWDMAUD_COMPLETION_CONTEXT;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
HANDLE Handle;
|
|
SOUND_DEVICE_TYPE Type;
|
|
ULONG FilterId;
|
|
ULONG PinId;
|
|
PRKEVENT NotifyEvent;
|
|
}WDMAUD_HANDLE, *PWDMAUD_HANDLE;
|
|
|
|
typedef struct
|
|
{
|
|
LIST_ENTRY Entry;
|
|
HANDLE hProcess;
|
|
ULONG NumPins;
|
|
WDMAUD_HANDLE * hPins;
|
|
|
|
LIST_ENTRY MixerEventList;
|
|
}WDMAUD_CLIENT, *PWDMAUD_CLIENT;
|
|
|
|
typedef struct
|
|
{
|
|
LIST_ENTRY Entry;
|
|
ULONG NotificationType;
|
|
ULONG Value;
|
|
HANDLE hMixer;
|
|
}EVENT_ENTRY, *PEVENT_ENTRY;
|
|
|
|
typedef struct
|
|
{
|
|
LIST_ENTRY Entry;
|
|
UNICODE_STRING SymbolicLink;
|
|
}SYSAUDIO_ENTRY, *PSYSAUDIO_ENTRY;
|
|
|
|
typedef struct
|
|
{
|
|
KSDEVICE_HEADER DeviceHeader;
|
|
PVOID SysAudioNotification;
|
|
|
|
BOOL DeviceInterfaceSupport;
|
|
|
|
KSPIN_LOCK Lock;
|
|
ULONG NumSysAudioDevices;
|
|
LIST_ENTRY SysAudioDeviceList;
|
|
HANDLE hSysAudio;
|
|
PFILE_OBJECT FileObject;
|
|
LIST_ENTRY WdmAudClientList;
|
|
|
|
ULONG SysAudioDeviceCount;
|
|
PIO_WORKITEM WorkItem;
|
|
KEVENT InitializationCompletionEvent;
|
|
ULONG WorkItemActive;
|
|
|
|
PDEVICE_OBJECT NextDeviceObject;
|
|
}WDMAUD_DEVICE_EXTENSION, *PWDMAUD_DEVICE_EXTENSION;
|
|
|
|
typedef struct
|
|
{
|
|
PWDMAUD_CLIENT ClientInfo;
|
|
PWDMAUD_DEVICE_EXTENSION DeviceExtension;
|
|
SOUND_DEVICE_TYPE DeviceType;
|
|
}PIN_CREATE_CONTEXT, *PPIN_CREATE_CONTEXT;
|
|
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
OpenWavePin(
|
|
IN PWDMAUD_DEVICE_EXTENSION DeviceExtension,
|
|
IN ULONG FilterId,
|
|
IN ULONG PinId,
|
|
IN LPWAVEFORMATEX WaveFormatEx,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
OUT PHANDLE PinHandle);
|
|
|
|
NTSTATUS
|
|
WdmAudRegisterDeviceInterface(
|
|
IN PDEVICE_OBJECT PhysicalDeviceObject,
|
|
IN PWDMAUD_DEVICE_EXTENSION DeviceExtension);
|
|
|
|
NTSTATUS
|
|
WdmAudOpenSysAudioDevices(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PWDMAUD_DEVICE_EXTENSION DeviceExtension);
|
|
|
|
NTSTATUS
|
|
WdmAudOpenSysaudio(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PWDMAUD_CLIENT *pClient);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
WdmAudDeviceControl(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
WdmAudReadWrite(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
WdmAudWrite(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp);
|
|
|
|
NTSTATUS
|
|
WdmAudControlOpenMixer(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp,
|
|
IN PWDMAUD_DEVICE_INFO DeviceInfo,
|
|
IN PWDMAUD_CLIENT ClientInfo);
|
|
|
|
NTSTATUS
|
|
WdmAudControlCloseMixer(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp,
|
|
IN PWDMAUD_DEVICE_INFO DeviceInfo,
|
|
IN PWDMAUD_CLIENT ClientInfo,
|
|
IN ULONG Index);
|
|
|
|
VOID
|
|
WdmAudCloseAllMixers(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PWDMAUD_CLIENT ClientInfo,
|
|
IN ULONG Index);
|
|
|
|
NTSTATUS
|
|
WdmAudControlOpenWave(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp,
|
|
IN PWDMAUD_DEVICE_INFO DeviceInfo,
|
|
IN PWDMAUD_CLIENT ClientInfo);
|
|
|
|
NTSTATUS
|
|
WdmAudControlOpenMidi(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp,
|
|
IN PWDMAUD_DEVICE_INFO DeviceInfo,
|
|
IN PWDMAUD_CLIENT ClientInfo);
|
|
|
|
ULONG
|
|
GetNumOfMixerDevices(
|
|
IN PDEVICE_OBJECT DeviceObject);
|
|
|
|
NTSTATUS
|
|
SetIrpIoStatus(
|
|
IN PIRP Irp,
|
|
IN NTSTATUS Status,
|
|
IN ULONG Length);
|
|
|
|
NTSTATUS
|
|
WdmAudOpenSysAudioDevice(
|
|
IN LPWSTR DeviceName,
|
|
OUT PHANDLE Handle);
|
|
|
|
NTSTATUS
|
|
FindProductName(
|
|
IN LPWSTR PnpName,
|
|
IN ULONG ProductNameSize,
|
|
OUT LPWSTR ProductName);
|
|
|
|
NTSTATUS
|
|
WdmAudMixerCapabilities(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PWDMAUD_DEVICE_INFO DeviceInfo,
|
|
IN PWDMAUD_CLIENT ClientInfo,
|
|
IN PWDMAUD_DEVICE_EXTENSION DeviceExtension);
|
|
|
|
NTSTATUS
|
|
WdmAudWaveCapabilities(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PWDMAUD_DEVICE_INFO DeviceInfo,
|
|
IN PWDMAUD_CLIENT ClientInfo,
|
|
IN PWDMAUD_DEVICE_EXTENSION DeviceExtension);
|
|
|
|
NTSTATUS
|
|
WdmAudMidiCapabilities(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PWDMAUD_DEVICE_INFO DeviceInfo,
|
|
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(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp,
|
|
IN PWDMAUD_DEVICE_INFO DeviceInfo,
|
|
IN PWDMAUD_CLIENT ClientInfo);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
WdmAudGetLineInfo(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp,
|
|
IN PWDMAUD_DEVICE_INFO DeviceInfo,
|
|
IN PWDMAUD_CLIENT ClientInfo);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
WdmAudGetLineControls(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp,
|
|
IN PWDMAUD_DEVICE_INFO DeviceInfo,
|
|
IN PWDMAUD_CLIENT ClientInfo);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
WdmAudSetControlDetails(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp,
|
|
IN PWDMAUD_DEVICE_INFO DeviceInfo,
|
|
IN PWDMAUD_CLIENT ClientInfo);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
WdmAudGetMixerEvent(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp,
|
|
IN PWDMAUD_DEVICE_INFO DeviceInfo,
|
|
IN PWDMAUD_CLIENT ClientInfo);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
WdmAudGetControlDetails(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp,
|
|
IN PWDMAUD_DEVICE_INFO DeviceInfo,
|
|
IN PWDMAUD_CLIENT ClientInfo);
|
|
|
|
NTSTATUS
|
|
WdmAudMixerInitialize(
|
|
IN PDEVICE_OBJECT DeviceObject);
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
WdmAudWaveInitialize(
|
|
IN PDEVICE_OBJECT DeviceObject);
|
|
|
|
ULONG
|
|
ClosePin(
|
|
IN PWDMAUD_CLIENT ClientInfo,
|
|
IN ULONG FilterId,
|
|
IN ULONG PinId,
|
|
IN SOUND_DEVICE_TYPE DeviceType);
|
|
|
|
NTSTATUS
|
|
InsertPinHandle(
|
|
IN PWDMAUD_CLIENT ClientInfo,
|
|
IN ULONG FilterId,
|
|
IN ULONG PinId,
|
|
IN SOUND_DEVICE_TYPE DeviceType,
|
|
IN HANDLE PinHandle,
|
|
IN ULONG FreeIndex);
|
|
|
|
NTSTATUS
|
|
GetSysAudioDevicePnpName(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN ULONG DeviceIndex,
|
|
OUT LPWSTR * Device);
|
|
|
|
NTSTATUS
|
|
OpenSysAudioDeviceByIndex(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN ULONG DeviceIndex,
|
|
IN PHANDLE DeviceHandle,
|
|
IN PFILE_OBJECT * FileObject);
|
|
|
|
NTSTATUS
|
|
OpenDevice(
|
|
IN LPWSTR Device,
|
|
OUT PHANDLE DeviceHandle,
|
|
OUT PFILE_OBJECT * FileObject);
|
|
|
|
ULONG
|
|
WdmAudGetMixerDeviceCount(VOID);
|
|
|
|
ULONG
|
|
WdmAudGetWaveInDeviceCount(VOID);
|
|
|
|
ULONG
|
|
WdmAudGetWaveOutDeviceCount(VOID);
|
|
|
|
ULONG
|
|
WdmAudGetMidiInDeviceCount(VOID);
|
|
|
|
ULONG
|
|
WdmAudGetMidiOutDeviceCount(VOID);
|
|
|
|
NTSTATUS
|
|
WdmAudGetPnpNameByIndexAndType(
|
|
IN ULONG DeviceIndex,
|
|
IN SOUND_DEVICE_TYPE DeviceType,
|
|
OUT LPWSTR *Device);
|
|
|
|
|
|
/* sup.c */
|
|
|
|
ULONG
|
|
GetSysAudioDeviceCount(
|
|
IN PDEVICE_OBJECT DeviceObject);
|
|
|
|
|
|
PVOID
|
|
AllocateItem(
|
|
IN POOL_TYPE PoolType,
|
|
IN SIZE_T NumberOfBytes);
|
|
|
|
VOID
|
|
FreeItem(
|
|
IN PVOID Item);
|
|
|
|
#endif /* _WDMAUD_PCH_ */
|