20 #ifndef ROS_AUDIO_MMEBUDDY_H 21 #define ROS_AUDIO_MMEBUDDY_H 27 #define AllocateStruct(thing) \ 28 (thing*) AllocateMemory(sizeof(thing)) 30 #define StringLengthToBytes(chartype, string_length) \ 31 ( ( string_length + 1 ) * sizeof(chartype) ) 33 #define AllocateWideString(string_length) \ 34 (PWSTR) AllocateMemory(StringLengthToBytes(WCHAR, string_length)) 36 #define ZeroWideString(string) \ 37 ZeroMemory(string, StringLengthToBytes(WCHAR, wcslen(string))) 39 #define CopyWideString(dest, source) \ 40 CopyMemory(dest, source, StringLengthToBytes(WCHAR, wcslen(source))) 47 #define MinimumOf(value_a, value_b) \ 48 ( value_a < value_b ? value_a : value_b ) 50 #define MaximumOf(value_a, value_b) \ 51 ( value_a > value_b ? value_a : value_b ) 58 #define SOUND_DEVICE_TYPE_TO_INDEX(x) \ 59 ( x - MIN_SOUND_DEVICE_TYPE ) 61 #define INDEX_TO_SOUND_DEVICE_TYPE(x) \ 62 ( x + MIN_SOUND_DEVICE_TYPE ) 69 #define IsValidSoundDeviceType IS_VALID_SOUND_DEVICE_TYPE 71 #define VALIDATE_MMSYS_PARAMETER(parameter_condition) \ 73 if ( ! (parameter_condition) ) \ 75 SND_ERR(L"FAILED parameter check: %hS at File %S Line %lu\n", #parameter_condition, __FILE__, __LINE__); \ 76 return MMSYSERR_INVALPARAM; \ 80 #define MMSUCCESS(result) \ 81 ( result == MMSYSERR_NOERROR ) 93 #define DEFINE_GETCAPS_FUNCTYPE(func_typename, caps_type) \ 94 typedef MMRESULT (*func_typename)( \ 95 IN struct _SOUND_DEVICE* SoundDevice, \ 97 OUT caps_type Capabilities, \ 98 IN DWORD CapabilitiesSize); 388 #define MmePrepareWaveHeader(private_handle, header) \ 389 PrepareWaveHeader((PSOUND_DEVICE_INSTANCE)private_handle, (PWAVEHDR)header) 391 #define MmeUnprepareWaveHeader(private_handle, header) \ 392 UnprepareWaveHeader((PSOUND_DEVICE_INSTANCE)private_handle, (PWAVEHDR)header) 394 #define MmeWriteWaveHeader(private_handle, header) \ 395 WriteWaveHeader((PSOUND_DEVICE_INSTANCE)private_handle, (PWAVEHDR)header) 622 IN DWORD dwNumberOfBytesTransferred,
_Must_inspect_result_ _In_ WDFUSBDEVICE _In_opt_ WDFREQUEST _In_opt_ PWDF_REQUEST_SEND_OPTIONS _In_ PWDF_USB_CONTROL_SETUP_PACKET _In_opt_ PWDF_MEMORY_DESCRIPTOR _Out_opt_ PULONG BytesTransferred
MMFUNCTION_TABLE FunctionTable
MMRESULT MmeGetDeviceInterfaceString(IN MMDEVICE_TYPE DeviceType, IN DWORD DeviceId, IN LPWSTR Interface, IN DWORD InterfaceLength, OUT DWORD *InterfaceSize)
MMRESULT ListSoundDevice(IN MMDEVICE_TYPE DeviceType, IN PVOID Identifier OPTIONAL, OUT PSOUND_DEVICE *SoundDevice OPTIONAL)
MMRESULT(* MMQUERYDEVICEINTERFACESTRING_FUNC)(IN MMDEVICE_TYPE DeviceType, IN DWORD DeviceId, IN LPWSTR Interface, IN DWORD InterfaceLength, OUT DWORD *InterfaceSize)
VOID InitiateSoundStreaming(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance)
_In_ NDIS_ERROR_CODE ErrorCode
_In_ ULONG _In_ ULONG _In_ ULONG Length
MMRESULT(* SOUND_THREAD_REQUEST_HANDLER)(IN struct _SOUND_DEVICE_INSTANCE *SoundDeviceInstance, IN PVOID Parameter)
MMGETWAVEINCAPS_FUNC GetWaveInCapabilities
struct _SOUND_DEVICE_INSTANCE * TailInstance
struct _SOUND_DEVICE * Device
_In_ UCHAR _In_ ULONG _Out_ PUCHAR _Outptr_result_bytebuffer_ OutBufferLength PVOID * OutBuffer
MMRESULT Win32ErrorToMmResult(IN UINT ErrorCode)
MMRESULT SetSoundDeviceFunctionTable(IN PSOUND_DEVICE SoundDevice, IN PMMFUNCTION_TABLE FunctionTable)
MMRESULT CallSoundThread(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, IN SOUND_THREAD_REQUEST_HANDLER RequestHandler, IN PVOID Parameter OPTIONAL)
UINT GetDigitCount(IN UINT Number)
IN BOOLEAN OUT PSTR Buffer
MMRESULT GetSoundDeviceIdentifier(IN PSOUND_DEVICE SoundDevice, OUT PVOID *Identifier)
MMRESULT SetWaveDeviceFormat(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, IN DWORD DeviceId, IN LPWAVEFORMATEX Format, IN DWORD FormatSize)
MMRESULT StopStreaming(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance)
DWORD_PTR ClientCallbackInstanceData
MMRESULT WriteFileEx_Committer(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, IN PVOID OffsetPtr, IN DWORD Length, IN PSOUND_OVERLAPPED Overlap, IN LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine)
MMRESETSTREAM_FUNC ResetStream
struct _SOUND_DEVICE SOUND_DEVICE
MMRESULT TranslateInternalMmResult(IN MMRESULT Result)
MMRESULT(* MMGETPOS_FUNC)(IN struct _SOUND_DEVICE_INSTANCE *SoundDeviceInstance, IN MMTIME *Time)
IN PVOID IN PVOID IN USHORT IN USHORT Size
VOID CleanupEntrypointMutexes(VOID)
MMRESULT(* MMRESETSTREAM_FUNC)(IN struct _SOUND_DEVICE_INSTANCE *SoundDeviceInstance, IN MMDEVICE_TYPE DeviceType, IN BOOLEAN bStartReset)
MMRESULT QueryWaveDeviceFormatSupport(IN PSOUND_DEVICE SoundDevice, IN LPWAVEFORMATEX Format, IN DWORD FormatSize)
MMRESULT GetSoundDevice(IN MMDEVICE_TYPE DeviceType, IN DWORD DeviceIndex, OUT PSOUND_DEVICE *Device)
MMRESULT CreateSoundThread(OUT PSOUND_THREAD *Thread)
struct _SOUND_DEVICE_INSTANCE * SoundDeviceInstance
struct _SOUND_THREAD * Thread
#define DEFINE_GETCAPS_FUNCTYPE(func_typename, caps_type)
MMRESULT SetSoundDeviceInstanceMmeData(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, IN HDRVR MmeHandle, IN DWORD_PTR ClientCallback, IN DWORD_PTR ClientCallbackData, IN DWORD Flags)
MMRESULT MmeGetSoundDeviceCapabilities(IN MMDEVICE_TYPE DeviceType, IN DWORD DeviceId, IN PVOID Capabilities, IN DWORD CapabilitiesSize)
struct _SOUND_DEVICE_INSTANCE * PSOUND_DEVICE_INSTANCE
MMRESULT DestroySoundThread(IN PSOUND_THREAD Thread)
VOID NotifyMmeClient(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, IN UINT Message, IN DWORD_PTR Parameter)
WAVE_COMMIT_FUNC CommitWaveBuffer
MMRESULT UnprepareWaveHeader(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, IN PWAVEHDR Header)
MMRESULT GetSoundDeviceFunctionTable(IN PSOUND_DEVICE SoundDevice, OUT PMMFUNCTION_TABLE *FunctionTable)
struct _MMFUNCTION_TABLE MMFUNCTION_TABLE
MMWAVEQUERYFORMATSUPPORT_FUNC QueryWaveFormatSupport
SOUND_THREAD_REQUEST_HANDLER Handler
MMRESULT OpenKernelSoundDeviceByName(IN PWSTR DevicePath, IN BOOLEAN ReadOnly, OUT PHANDLE Handle)
struct _SOUND_DEVICE_INSTANCE::@3416 WinMM
_Must_inspect_result_ typedef _Out_ PHIDP_CAPS Capabilities
MMGETCAPS_FUNC GetCapabilities
VOID DoWaveStreaming(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance)
VOID AcquireEntrypointMutex(IN MMDEVICE_TYPE DeviceType)
MMRESULT(* MMOPEN_FUNC)(IN struct _SOUND_DEVICE *SoundDevice, OUT PVOID *Handle)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
MMRESULT CreateSoundDeviceInstance(IN PSOUND_DEVICE SoundDevice, OUT PSOUND_DEVICE_INSTANCE *SoundDeviceInstance)
struct _WAVEHDR_EXTENSION WAVEHDR_EXTENSION
MMRESULT(* MMWAVEQUERYFORMATSUPPORT_FUNC)(IN struct _SOUND_DEVICE *Device, IN PWAVEFORMATEX WaveFormat, IN DWORD WaveFormatSize)
BOOLEAN IsValidSoundDeviceInstance(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance)
ULONG GetSoundDeviceCount(IN MMDEVICE_TYPE DeviceType)
MMRESULT PrepareWaveHeader(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, IN PWAVEHDR Header)
struct _SOUND_THREAD * PSOUND_THREAD
MMRESULT(* MMMIXERQUERY_FUNC)(IN struct _SOUND_DEVICE_INSTANCE *SoundDeviceInstance, IN DWORD DeviceId, IN UINT uMsg, IN LPVOID Parameter, IN DWORD Flags)
struct _SOUND_DEVICE_INSTANCE * HeadInstance
struct _SOUND_OVERLAPPED * PSOUND_OVERLAPPED
MMRESULT EnqueueWaveHeader(PSOUND_DEVICE_INSTANCE SoundDeviceInstance, IN PVOID Parameter)
MMRESULT DestroyAllSoundDeviceInstances(IN PSOUND_DEVICE SoundDevice)
_Must_inspect_result_ _In_ ULONG Flags
struct _SOUND_DEVICE * PSOUND_DEVICE
MMRESULT SyncOverlappedDeviceIoControl(IN HANDLE SoundDeviceInstance, IN DWORD IoControlCode, IN LPVOID InBuffer, IN DWORD InBufferSize, OUT LPVOID OutBuffer, IN DWORD OutBufferSize, OUT LPDWORD BytesTransferred OPTIONAL)
MMRESULT MmeGetPosition(IN MMDEVICE_TYPE DeviceType, IN DWORD DeviceId, IN DWORD_PTR PrivateHandle, IN MMTIME *Time, IN DWORD Size)
MMRESULT WriteWaveHeader(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, IN PWAVEHDR Header)
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
struct _WAVEHDR_EXTENSION * PWAVEHDR_EXTENSION
MMGETWAVEOUTCAPS_FUNC GetWaveOutCapabilities
struct _SOUND_THREAD::@3414 Events
MMRESULT MmeCloseDevice(IN DWORD_PTR PrivateHandle)
UINT GetMemoryAllocationCount(VOID)
struct _SOUND_DEVICE * Next
MMRESULT DestroySoundDeviceInstance(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance)
MMGETMIDIOUTCAPS_FUNC GetMidiOutCapabilities
_In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
struct _SOUND_DEVICE_INSTANCE * SoundDeviceInstance
struct _SOUND_THREAD SOUND_THREAD
MMRESULT CommitWaveHeaderToKernelDevice(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, IN PWAVEHDR Header, IN WAVE_COMMIT_FUNC CommitFunction)
VOID CALLBACK CompleteIO(IN DWORD dwErrorCode, IN DWORD dwNumberOfBytesTransferred, IN LPOVERLAPPED lpOverlapped)
VOID UnlistAllSoundDevices(VOID)
_Must_inspect_result_ _In_ WDFDEVICE Device
_In_opt_ PENTER_STATE_SYSTEM_HANDLER _In_opt_ PVOID _In_ LONG _In_opt_ LONG volatile * Number
MMRESULT(* MMWAVESETFORMAT_FUNC)(IN struct _SOUND_DEVICE_INSTANCE *Instance, IN DWORD DeviceId, IN PWAVEFORMATEX WaveFormat, IN DWORD WaveFormatSize)
void(CALLBACK * LPOVERLAPPED_COMPLETION_ROUTINE)(DWORD, DWORD, LPOVERLAPPED)
MMMIXERQUERY_FUNC QueryMixerInfo
MMGETMIDIINCAPS_FUNC GetMidiInCapabilities
struct _SOUND_DEVICE_INSTANCE SOUND_DEVICE_INSTANCE
MMRESULT MmeOpenDevice(IN MMDEVICE_TYPE DeviceType, IN UINT DeviceId, IN LPWAVEOPENDESC OpenParameters, IN DWORD Flags, OUT DWORD_PTR *PrivateHandle)
LPOVERLAPPED_COMPLETION_ROUTINE OriginalCompletionRoutine
PVOID AllocateMemory(IN UINT Size)
MMRESULT MmeSetState(IN DWORD_PTR PrivateHandle, IN BOOL bStart)
WAVEFORMATEX WaveFormatEx
MMQUERYDEVICEINTERFACESTRING_FUNC GetDeviceInterfaceString
BOOLEAN IsValidSoundDevice(IN PSOUND_DEVICE SoundDevice)
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED lpOverlapped
IN PVOID IN PVOID IN USHORT IN USHORT IN PINTERFACE Interface
MMRESULT(* MMBUFFER_FUNC)(IN struct _SOUND_DEVICE_INSTANCE *SoundDeviceInstance, IN PVOID Buffer, IN DWORD Length)
MMRESULT GetSoundDeviceType(IN PSOUND_DEVICE SoundDevice, OUT PMMDEVICE_TYPE DeviceType)
MMRESULT CloseKernelSoundDevice(IN HANDLE Handle)
MMRESULT UnlistSoundDevices(IN MMDEVICE_TYPE DeviceType)
_In_ WDFREQUEST _In_opt_ PFN_WDF_REQUEST_COMPLETION_ROUTINE CompletionRoutine
MMRESULT InitEntrypointMutexes(VOID)
VOID FreeMemory(IN PVOID Pointer)
MMRESULT UnlistSoundDevice(IN MMDEVICE_TYPE DeviceType, IN PSOUND_DEVICE SoundDevice)
MMRESULT(* MMSETSTATE_FUNC)(IN struct _SOUND_DEVICE_INSTANCE *SoundDeviceInstance, IN BOOL bStart)
MMRESULT(* MMCLOSE_FUNC)(IN struct _SOUND_DEVICE_INSTANCE *SoundDeviceInstance, IN PVOID Handle)
struct _SOUND_OVERLAPPED SOUND_OVERLAPPED
struct _SOUND_DEVICE_INSTANCE * Next
MMRESULT(* MMWAVEHEADER_FUNC)(IN struct _SOUND_DEVICE_INSTANCE *SoundDeviceInstance, IN PWAVEHDR WaveHeader)
VOID CompleteWaveHeader(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, IN PWAVEHDR Header)
VOID ReleaseEntrypointMutex(IN MMDEVICE_TYPE DeviceType)
MMRESULT OpenKernelSoundDevice(IN PSOUND_DEVICE SoundDevice, IN BOOLEAN ReadOnly, OUT PHANDLE Handle)
MMRESULT(* WAVE_COMMIT_FUNC)(IN struct _SOUND_DEVICE_INSTANCE *SoundDeviceInstance, IN PVOID OffsetPtr, IN DWORD Bytes, IN PSOUND_OVERLAPPED Overlap, IN LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine)
static WLX_DISPATCH_VERSION_1_4 FunctionTable
MMRESULT GetSoundDeviceFromInstance(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, OUT PSOUND_DEVICE *SoundDevice)
struct _MMFUNCTION_TABLE * PMMFUNCTION_TABLE
MMRESULT GetSoundDeviceInstanceHandle(IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, OUT PVOID *Handle)
MMRESULT MmeResetWavePlayback(IN DWORD_PTR PrivateHandle)
MMWAVESETFORMAT_FUNC SetWaveFormat
static PLARGE_INTEGER Time
MMRESULT GetSoundDeviceCapabilities(IN PSOUND_DEVICE SoundDevice, IN DWORD DeviceId, OUT PVOID Capabilities, IN DWORD CapabilitiesSize)
PULONG MinorVersion OPTIONAL