mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 21:42:57 +00:00
[WDMAUD.DRV]
- Merge from audio branch - Fix build [WDMAUD_KERNEL] - Fix build - Update to new mmixer library interface svn path=/trunk/; revision=50532
This commit is contained in:
parent
c6b26fa452
commit
2b27c4f0de
5 changed files with 141 additions and 44 deletions
|
@ -800,6 +800,7 @@ WdmAudResetStreamByLegacy(
|
||||||
MMRESULT
|
MMRESULT
|
||||||
WdmAudQueryMixerInfoByLegacy(
|
WdmAudQueryMixerInfoByLegacy(
|
||||||
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||||
|
IN DWORD DeviceId,
|
||||||
IN UINT uMsg,
|
IN UINT uMsg,
|
||||||
IN LPVOID Parameter,
|
IN LPVOID Parameter,
|
||||||
IN DWORD Flags)
|
IN DWORD Flags)
|
||||||
|
@ -819,6 +820,7 @@ WdmAudQueryMixerInfoByLegacy(
|
||||||
|
|
||||||
ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
|
ZeroMemory(&DeviceInfo, sizeof(WDMAUD_DEVICE_INFO));
|
||||||
DeviceInfo.hDevice = Handle;
|
DeviceInfo.hDevice = Handle;
|
||||||
|
DeviceInfo.DeviceIndex = DeviceId;
|
||||||
DeviceInfo.DeviceType = MIXER_DEVICE_TYPE;
|
DeviceInfo.DeviceType = MIXER_DEVICE_TYPE;
|
||||||
DeviceInfo.Flags = Flags;
|
DeviceInfo.Flags = Flags;
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,18 @@
|
||||||
|
|
||||||
#include "wdmaud.h"
|
#include "wdmaud.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
KSSTREAM_HEADER Header;
|
||||||
|
HANDLE hDevice;
|
||||||
|
PSOUND_OVERLAPPED Overlap;
|
||||||
|
LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine;
|
||||||
|
DWORD IoCtl;
|
||||||
|
}IO_PACKET, *LPIO_PACKET;
|
||||||
|
|
||||||
|
BOOL MMixerLibraryInitialized = FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
PVOID Alloc(ULONG NumBytes);
|
PVOID Alloc(ULONG NumBytes);
|
||||||
MIXER_STATUS Close(HANDLE hDevice);
|
MIXER_STATUS Close(HANDLE hDevice);
|
||||||
|
@ -110,7 +122,7 @@ Free(PVOID Block)
|
||||||
VOID
|
VOID
|
||||||
Copy(PVOID Src, PVOID Dst, ULONG NumBytes)
|
Copy(PVOID Src, PVOID Dst, ULONG NumBytes)
|
||||||
{
|
{
|
||||||
CopyMemory(Src, Dst, NumBytes);
|
RtlMoveMemory(Src, Dst, NumBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
MIXER_STATUS
|
MIXER_STATUS
|
||||||
|
@ -282,7 +294,6 @@ Enum(
|
||||||
HeapFree(GetProcessHeap(), 0, DetailData);
|
HeapFree(GetProcessHeap(), 0, DetailData);
|
||||||
return MM_STATUS_NO_MEMORY;
|
return MM_STATUS_NO_MEMORY;
|
||||||
}
|
}
|
||||||
DPRINT1("DeviceName %S\n", DetailData->DevicePath);
|
|
||||||
wcscpy(*DeviceName, DetailData->DevicePath);
|
wcscpy(*DeviceName, DetailData->DevicePath);
|
||||||
HeapFree(GetProcessHeap(), 0, DetailData);
|
HeapFree(GetProcessHeap(), 0, DetailData);
|
||||||
|
|
||||||
|
@ -324,6 +335,13 @@ WdmAudInitUserModeMixer()
|
||||||
HDEVINFO DeviceHandle;
|
HDEVINFO DeviceHandle;
|
||||||
MIXER_STATUS Status;
|
MIXER_STATUS Status;
|
||||||
|
|
||||||
|
if (MMixerLibraryInitialized)
|
||||||
|
{
|
||||||
|
/* library is already initialized */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* create a device list */
|
/* create a device list */
|
||||||
DeviceHandle = SetupDiGetClassDevs(&CategoryGuid,
|
DeviceHandle = SetupDiGetClassDevs(&CategoryGuid,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -350,6 +368,9 @@ WdmAudInitUserModeMixer()
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* library is now initialized */
|
||||||
|
MMixerLibraryInitialized = TRUE;
|
||||||
|
|
||||||
/* completed successfully */
|
/* completed successfully */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -363,7 +384,7 @@ WdmAudCleanupByMMixer()
|
||||||
|
|
||||||
MMRESULT
|
MMRESULT
|
||||||
WdmAudGetMixerCapabilties(
|
WdmAudGetMixerCapabilties(
|
||||||
IN ULONG DeviceId,
|
IN ULONG DeviceId,
|
||||||
LPMIXERCAPSW Capabilities)
|
LPMIXERCAPSW Capabilities)
|
||||||
{
|
{
|
||||||
if (MMixerGetCapabilities(&MixerContext, DeviceId, Capabilities) == MM_STATUS_SUCCESS)
|
if (MMixerGetCapabilities(&MixerContext, DeviceId, Capabilities) == MM_STATUS_SUCCESS)
|
||||||
|
@ -375,10 +396,11 @@ WdmAudGetMixerCapabilties(
|
||||||
MMRESULT
|
MMRESULT
|
||||||
WdmAudGetLineInfo(
|
WdmAudGetLineInfo(
|
||||||
IN HANDLE hMixer,
|
IN HANDLE hMixer,
|
||||||
|
IN DWORD MixerId,
|
||||||
IN LPMIXERLINEW MixLine,
|
IN LPMIXERLINEW MixLine,
|
||||||
IN ULONG Flags)
|
IN ULONG Flags)
|
||||||
{
|
{
|
||||||
if (MMixerGetLineInfo(&MixerContext, hMixer, Flags, MixLine) == MM_STATUS_SUCCESS)
|
if (MMixerGetLineInfo(&MixerContext, hMixer, MixerId, Flags, MixLine) == MM_STATUS_SUCCESS)
|
||||||
return MMSYSERR_NOERROR;
|
return MMSYSERR_NOERROR;
|
||||||
|
|
||||||
return MMSYSERR_ERROR;
|
return MMSYSERR_ERROR;
|
||||||
|
@ -387,10 +409,11 @@ WdmAudGetLineInfo(
|
||||||
MMRESULT
|
MMRESULT
|
||||||
WdmAudGetLineControls(
|
WdmAudGetLineControls(
|
||||||
IN HANDLE hMixer,
|
IN HANDLE hMixer,
|
||||||
|
IN DWORD MixerId,
|
||||||
IN LPMIXERLINECONTROLSW MixControls,
|
IN LPMIXERLINECONTROLSW MixControls,
|
||||||
IN ULONG Flags)
|
IN ULONG Flags)
|
||||||
{
|
{
|
||||||
if (MMixerGetLineControls(&MixerContext, hMixer, Flags, MixControls) == MM_STATUS_SUCCESS)
|
if (MMixerGetLineControls(&MixerContext, hMixer, MixerId, Flags, MixControls) == MM_STATUS_SUCCESS)
|
||||||
return MMSYSERR_NOERROR;
|
return MMSYSERR_NOERROR;
|
||||||
|
|
||||||
return MMSYSERR_ERROR;
|
return MMSYSERR_ERROR;
|
||||||
|
@ -399,10 +422,11 @@ WdmAudGetLineControls(
|
||||||
MMRESULT
|
MMRESULT
|
||||||
WdmAudSetControlDetails(
|
WdmAudSetControlDetails(
|
||||||
IN HANDLE hMixer,
|
IN HANDLE hMixer,
|
||||||
|
IN DWORD MixerId,
|
||||||
IN LPMIXERCONTROLDETAILS MixDetails,
|
IN LPMIXERCONTROLDETAILS MixDetails,
|
||||||
IN ULONG Flags)
|
IN ULONG Flags)
|
||||||
{
|
{
|
||||||
if (MMixerSetControlDetails(&MixerContext, hMixer, Flags, MixDetails) == MM_STATUS_SUCCESS)
|
if (MMixerSetControlDetails(&MixerContext, hMixer, MixerId, Flags, MixDetails) == MM_STATUS_SUCCESS)
|
||||||
return MMSYSERR_NOERROR;
|
return MMSYSERR_NOERROR;
|
||||||
|
|
||||||
return MMSYSERR_ERROR;
|
return MMSYSERR_ERROR;
|
||||||
|
@ -412,10 +436,11 @@ WdmAudSetControlDetails(
|
||||||
MMRESULT
|
MMRESULT
|
||||||
WdmAudGetControlDetails(
|
WdmAudGetControlDetails(
|
||||||
IN HANDLE hMixer,
|
IN HANDLE hMixer,
|
||||||
|
IN DWORD MixerId,
|
||||||
IN LPMIXERCONTROLDETAILS MixDetails,
|
IN LPMIXERCONTROLDETAILS MixDetails,
|
||||||
IN ULONG Flags)
|
IN ULONG Flags)
|
||||||
{
|
{
|
||||||
if (MMixerGetControlDetails(&MixerContext, hMixer, Flags, MixDetails) == MM_STATUS_SUCCESS)
|
if (MMixerGetControlDetails(&MixerContext, hMixer, MixerId, Flags, MixDetails) == MM_STATUS_SUCCESS)
|
||||||
return MMSYSERR_NOERROR;
|
return MMSYSERR_NOERROR;
|
||||||
|
|
||||||
return MMSYSERR_ERROR;
|
return MMSYSERR_ERROR;
|
||||||
|
@ -589,6 +614,7 @@ WdmAudGetNumWdmDevsByMMixer(
|
||||||
MMRESULT
|
MMRESULT
|
||||||
WdmAudQueryMixerInfoByMMixer(
|
WdmAudQueryMixerInfoByMMixer(
|
||||||
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||||
|
IN DWORD MixerId,
|
||||||
IN UINT uMsg,
|
IN UINT uMsg,
|
||||||
IN LPVOID Parameter,
|
IN LPVOID Parameter,
|
||||||
IN DWORD Flags)
|
IN DWORD Flags)
|
||||||
|
@ -596,6 +622,7 @@ WdmAudQueryMixerInfoByMMixer(
|
||||||
LPMIXERLINEW MixLine;
|
LPMIXERLINEW MixLine;
|
||||||
LPMIXERLINECONTROLSW MixControls;
|
LPMIXERLINECONTROLSW MixControls;
|
||||||
LPMIXERCONTROLDETAILS MixDetails;
|
LPMIXERCONTROLDETAILS MixDetails;
|
||||||
|
HANDLE hMixer = NULL;
|
||||||
|
|
||||||
MixLine = (LPMIXERLINEW)Parameter;
|
MixLine = (LPMIXERLINEW)Parameter;
|
||||||
MixControls = (LPMIXERLINECONTROLSW)Parameter;
|
MixControls = (LPMIXERLINECONTROLSW)Parameter;
|
||||||
|
@ -603,19 +630,23 @@ WdmAudQueryMixerInfoByMMixer(
|
||||||
|
|
||||||
/* FIXME param checks */
|
/* FIXME param checks */
|
||||||
|
|
||||||
|
if (SoundDeviceInstance)
|
||||||
|
{
|
||||||
|
hMixer = SoundDeviceInstance->Handle;
|
||||||
|
}
|
||||||
|
|
||||||
switch(uMsg)
|
switch(uMsg)
|
||||||
{
|
{
|
||||||
case MXDM_GETLINEINFO:
|
case MXDM_GETLINEINFO:
|
||||||
return WdmAudGetLineInfo(SoundDeviceInstance->Handle, MixLine, Flags);
|
return WdmAudGetLineInfo(hMixer, MixerId, MixLine, Flags);
|
||||||
case MXDM_GETLINECONTROLS:
|
case MXDM_GETLINECONTROLS:
|
||||||
return WdmAudGetLineControls(SoundDeviceInstance->Handle, MixControls, Flags);
|
return WdmAudGetLineControls(hMixer, MixerId, MixControls, Flags);
|
||||||
case MXDM_SETCONTROLDETAILS:
|
case MXDM_SETCONTROLDETAILS:
|
||||||
return WdmAudSetControlDetails(SoundDeviceInstance->Handle, MixDetails, Flags);
|
return WdmAudSetControlDetails(hMixer, MixerId, MixDetails, Flags);
|
||||||
break;
|
|
||||||
case MXDM_GETCONTROLDETAILS:
|
case MXDM_GETCONTROLDETAILS:
|
||||||
return WdmAudGetControlDetails(SoundDeviceInstance->Handle, MixDetails, Flags);
|
return WdmAudGetControlDetails(hMixer, MixerId, MixDetails, Flags);
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
|
DPRINT1("MixerId %lu, uMsg %lu, Parameter %p, Flags %lu\n", MixerId, uMsg, Parameter, Flags);
|
||||||
SND_ASSERT(0);
|
SND_ASSERT(0);
|
||||||
return MMSYSERR_NOTSUPPORTED;
|
return MMSYSERR_NOTSUPPORTED;
|
||||||
}
|
}
|
||||||
|
@ -633,6 +664,25 @@ WdmAudGetDeviceInterfaceStringByMMixer(
|
||||||
return MMSYSERR_NOTSUPPORTED;
|
return MMSYSERR_NOTSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
CALLBACK
|
||||||
|
MixerEventCallback(
|
||||||
|
IN PVOID MixerEventContext,
|
||||||
|
IN HANDLE hMixer,
|
||||||
|
IN ULONG NotificationType,
|
||||||
|
IN ULONG Value)
|
||||||
|
{
|
||||||
|
PSOUND_DEVICE_INSTANCE Instance = (PSOUND_DEVICE_INSTANCE)MixerEventContext;
|
||||||
|
|
||||||
|
DriverCallback(Instance->WinMM.ClientCallback,
|
||||||
|
HIWORD(Instance->WinMM.Flags),
|
||||||
|
Instance->WinMM.Handle,
|
||||||
|
NotificationType,
|
||||||
|
Instance->WinMM.ClientCallbackInstanceData,
|
||||||
|
(DWORD_PTR)Value,
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
|
||||||
MMRESULT
|
MMRESULT
|
||||||
WdmAudSetMixerDeviceFormatByMMixer(
|
WdmAudSetMixerDeviceFormatByMMixer(
|
||||||
IN PSOUND_DEVICE_INSTANCE Instance,
|
IN PSOUND_DEVICE_INSTANCE Instance,
|
||||||
|
@ -640,11 +690,7 @@ WdmAudSetMixerDeviceFormatByMMixer(
|
||||||
IN PWAVEFORMATEX WaveFormat,
|
IN PWAVEFORMATEX WaveFormat,
|
||||||
IN DWORD WaveFormatSize)
|
IN DWORD WaveFormatSize)
|
||||||
{
|
{
|
||||||
Instance->hNotifyEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
|
if (MMixerOpen(&MixerContext, DeviceId, (PVOID)Instance, MixerEventCallback, &Instance->Handle) == MM_STATUS_SUCCESS)
|
||||||
if ( ! Instance->hNotifyEvent )
|
|
||||||
return MMSYSERR_NOMEM;
|
|
||||||
|
|
||||||
if (MMixerOpen(&MixerContext, DeviceId, Instance->hNotifyEvent, NULL /* FIXME */, &Instance->Handle) == MM_STATUS_SUCCESS)
|
|
||||||
return MMSYSERR_NOERROR;
|
return MMSYSERR_NOERROR;
|
||||||
|
|
||||||
return MMSYSERR_BADDEVICEID;
|
return MMSYSERR_BADDEVICEID;
|
||||||
|
@ -706,7 +752,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -719,6 +777,29 @@ WdmAudGetWavePositionByMMixer(
|
||||||
return MMSYSERR_NOTSUPPORTED;
|
return MMSYSERR_NOTSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DWORD
|
||||||
|
WINAPI
|
||||||
|
IoStreamingThread(
|
||||||
|
LPVOID lpParameter)
|
||||||
|
{
|
||||||
|
DWORD Length;
|
||||||
|
MMRESULT Result;
|
||||||
|
LPIO_PACKET Packet = (LPIO_PACKET)lpParameter;
|
||||||
|
|
||||||
|
Result = SyncOverlappedDeviceIoControl(Packet->hDevice,
|
||||||
|
Packet->IoCtl,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
&Packet->Header,
|
||||||
|
sizeof(KSSTREAM_HEADER),
|
||||||
|
&Length);
|
||||||
|
|
||||||
|
Packet->CompletionRoutine(ERROR_SUCCESS, Packet->Header.DataUsed, (LPOVERLAPPED)Packet->Overlap);
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, Packet);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
MMRESULT
|
MMRESULT
|
||||||
WdmAudCommitWaveBufferByMMixer(
|
WdmAudCommitWaveBufferByMMixer(
|
||||||
IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
|
IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
|
||||||
|
@ -727,10 +808,11 @@ WdmAudCommitWaveBufferByMMixer(
|
||||||
IN PSOUND_OVERLAPPED Overlap,
|
IN PSOUND_OVERLAPPED Overlap,
|
||||||
IN LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine)
|
IN LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine)
|
||||||
{
|
{
|
||||||
KSSTREAM_HEADER Packet;
|
|
||||||
PSOUND_DEVICE SoundDevice;
|
PSOUND_DEVICE SoundDevice;
|
||||||
MMDEVICE_TYPE DeviceType;
|
MMDEVICE_TYPE DeviceType;
|
||||||
MMRESULT Result;
|
MMRESULT Result;
|
||||||
|
LPIO_PACKET Packet;
|
||||||
|
HANDLE hThread;
|
||||||
|
|
||||||
Result = GetSoundDeviceFromInstance(SoundDeviceInstance, &SoundDevice);
|
Result = GetSoundDeviceFromInstance(SoundDeviceInstance, &SoundDevice);
|
||||||
|
|
||||||
|
@ -742,31 +824,37 @@ WdmAudCommitWaveBufferByMMixer(
|
||||||
Result = GetSoundDeviceType(SoundDevice, &DeviceType);
|
Result = GetSoundDeviceType(SoundDevice, &DeviceType);
|
||||||
SND_ASSERT( Result == MMSYSERR_NOERROR );
|
SND_ASSERT( Result == MMSYSERR_NOERROR );
|
||||||
|
|
||||||
|
Packet = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IO_PACKET));
|
||||||
|
if ( ! Packet )
|
||||||
|
{
|
||||||
|
/* no memory */
|
||||||
|
return MMSYSERR_NOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
/* setup stream packet */
|
/* setup stream packet */
|
||||||
ZeroMemory(&Packet, sizeof(KSSTREAM_HEADER));
|
Packet->Header.Size = sizeof(KSSTREAM_HEADER);
|
||||||
Packet.Size = sizeof(KSSTREAM_HEADER);
|
Packet->Header.PresentationTime.Numerator = 1;
|
||||||
Packet.PresentationTime.Numerator = 1;
|
Packet->Header.PresentationTime.Denominator = 1;
|
||||||
Packet.PresentationTime.Denominator = 1;
|
Packet->Header.Data = OffsetPtr;
|
||||||
Packet.Data = OffsetPtr;
|
Packet->Header.FrameExtent = Length;
|
||||||
Packet.FrameExtent = Length;
|
Packet->hDevice = SoundDeviceInstance->Handle;
|
||||||
|
Packet->Overlap = Overlap;
|
||||||
|
Packet->CompletionRoutine = CompletionRoutine;
|
||||||
|
Packet->IoCtl = (DeviceType == WAVE_OUT_DEVICE_TYPE ? IOCTL_KS_WRITE_STREAM : IOCTL_KS_READ_STREAM);
|
||||||
|
|
||||||
if (DeviceType == WAVE_OUT_DEVICE_TYPE)
|
if (DeviceType == WAVE_OUT_DEVICE_TYPE)
|
||||||
{
|
{
|
||||||
Packet.DataUsed = Length;
|
Packet->Header.DataUsed = Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result = SyncOverlappedDeviceIoControl(SoundDeviceInstance->Handle,
|
hThread = CreateThread(NULL, 0, IoStreamingThread, (LPVOID)Packet, 0, NULL);
|
||||||
IOCTL_KS_WRITE_STREAM,
|
if (hThread == NULL)
|
||||||
NULL,
|
{
|
||||||
0,
|
/* error */
|
||||||
&Packet,
|
return MMSYSERR_ERROR;
|
||||||
sizeof(KSSTREAM_HEADER),
|
}
|
||||||
&Length);
|
|
||||||
|
|
||||||
/* HACK:
|
CloseHandle(hThread);
|
||||||
* don't call completion routine directly
|
|
||||||
*/
|
|
||||||
CompletionRoutine(ERROR_SUCCESS, Length, (LPOVERLAPPED)Overlap);
|
|
||||||
|
|
||||||
return MMSYSERR_NOERROR;
|
return MMSYSERR_NOERROR;
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,24 +70,28 @@ WdmAudCloseSoundDeviceByMMixer(
|
||||||
MMRESULT
|
MMRESULT
|
||||||
WdmAudGetLineInfo(
|
WdmAudGetLineInfo(
|
||||||
IN HANDLE hMixer,
|
IN HANDLE hMixer,
|
||||||
|
IN DWORD MixerId,
|
||||||
IN LPMIXERLINEW MixLine,
|
IN LPMIXERLINEW MixLine,
|
||||||
IN ULONG Flags);
|
IN ULONG Flags);
|
||||||
|
|
||||||
MMRESULT
|
MMRESULT
|
||||||
WdmAudGetLineControls(
|
WdmAudGetLineControls(
|
||||||
IN HANDLE hMixer,
|
IN HANDLE hMixer,
|
||||||
|
IN DWORD MixerId,
|
||||||
IN LPMIXERLINECONTROLSW MixControls,
|
IN LPMIXERLINECONTROLSW MixControls,
|
||||||
IN ULONG Flags);
|
IN ULONG Flags);
|
||||||
|
|
||||||
MMRESULT
|
MMRESULT
|
||||||
WdmAudSetControlDetails(
|
WdmAudSetControlDetails(
|
||||||
IN HANDLE hMixer,
|
IN HANDLE hMixer,
|
||||||
|
IN DWORD MixerId,
|
||||||
IN LPMIXERCONTROLDETAILS MixDetails,
|
IN LPMIXERCONTROLDETAILS MixDetails,
|
||||||
IN ULONG Flags);
|
IN ULONG Flags);
|
||||||
|
|
||||||
MMRESULT
|
MMRESULT
|
||||||
WdmAudGetControlDetails(
|
WdmAudGetControlDetails(
|
||||||
IN HANDLE hMixer,
|
IN HANDLE hMixer,
|
||||||
|
IN DWORD MixerId,
|
||||||
IN LPMIXERCONTROLDETAILS MixDetails,
|
IN LPMIXERCONTROLDETAILS MixDetails,
|
||||||
IN ULONG Flags);
|
IN ULONG Flags);
|
||||||
|
|
||||||
|
@ -116,6 +120,7 @@ WdmAudSetMixerDeviceFormatByMMixer(
|
||||||
MMRESULT
|
MMRESULT
|
||||||
WdmAudQueryMixerInfoByMMixer(
|
WdmAudQueryMixerInfoByMMixer(
|
||||||
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||||
|
IN DWORD DeviceId,
|
||||||
IN UINT uMsg,
|
IN UINT uMsg,
|
||||||
IN LPVOID Parameter,
|
IN LPVOID Parameter,
|
||||||
IN DWORD Flags);
|
IN DWORD Flags);
|
||||||
|
@ -185,6 +190,7 @@ WdmAudSetMixerDeviceFormatByLegacy(
|
||||||
MMRESULT
|
MMRESULT
|
||||||
WdmAudQueryMixerInfoByLegacy(
|
WdmAudQueryMixerInfoByLegacy(
|
||||||
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||||
|
IN DWORD DeviceId,
|
||||||
IN UINT uMsg,
|
IN UINT uMsg,
|
||||||
IN LPVOID Parameter,
|
IN LPVOID Parameter,
|
||||||
IN DWORD Flags);
|
IN DWORD Flags);
|
||||||
|
|
|
@ -319,6 +319,7 @@ FreeEventData(IN PVOID EventData)
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
CALLBACK
|
||||||
EventCallback(
|
EventCallback(
|
||||||
IN PVOID MixerEventContext,
|
IN PVOID MixerEventContext,
|
||||||
IN HANDLE hMixer,
|
IN HANDLE hMixer,
|
||||||
|
@ -474,7 +475,7 @@ WdmAudGetControlDetails(
|
||||||
DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
|
DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
|
||||||
|
|
||||||
/* query mmixer library */
|
/* query mmixer library */
|
||||||
Status = MMixerGetControlDetails(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixDetails);
|
Status = MMixerGetControlDetails(&MixerContext, DeviceInfo->hDevice, DeviceInfo->DeviceIndex, DeviceInfo->Flags, &DeviceInfo->u.MixDetails);
|
||||||
|
|
||||||
if (Status == MM_STATUS_SUCCESS)
|
if (Status == MM_STATUS_SUCCESS)
|
||||||
return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
|
return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
|
||||||
|
@ -496,7 +497,7 @@ WdmAudGetLineInfo(
|
||||||
DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
|
DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
|
||||||
|
|
||||||
/* query mixer library */
|
/* query mixer library */
|
||||||
Status = MMixerGetLineInfo(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixLine);
|
Status = MMixerGetLineInfo(&MixerContext, DeviceInfo->hDevice, DeviceInfo->DeviceIndex, DeviceInfo->Flags, &DeviceInfo->u.MixLine);
|
||||||
|
|
||||||
if (Status == MM_STATUS_SUCCESS)
|
if (Status == MM_STATUS_SUCCESS)
|
||||||
return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
|
return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
|
||||||
|
@ -518,7 +519,7 @@ WdmAudGetLineControls(
|
||||||
DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
|
DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
|
||||||
|
|
||||||
/* query mixer library */
|
/* query mixer library */
|
||||||
Status = MMixerGetLineControls(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixControls);
|
Status = MMixerGetLineControls(&MixerContext, DeviceInfo->hDevice, DeviceInfo->DeviceIndex, DeviceInfo->Flags, &DeviceInfo->u.MixControls);
|
||||||
|
|
||||||
if (Status == MM_STATUS_SUCCESS)
|
if (Status == MM_STATUS_SUCCESS)
|
||||||
return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
|
return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
|
||||||
|
@ -542,7 +543,7 @@ WdmAudSetControlDetails(
|
||||||
DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
|
DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER;
|
||||||
|
|
||||||
/* query mixer library */
|
/* query mixer library */
|
||||||
Status = MMixerSetControlDetails(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixDetails);
|
Status = MMixerSetControlDetails(&MixerContext, DeviceInfo->hDevice, DeviceInfo->DeviceIndex, DeviceInfo->Flags, &DeviceInfo->u.MixDetails);
|
||||||
|
|
||||||
if (Status == MM_STATUS_SUCCESS)
|
if (Status == MM_STATUS_SUCCESS)
|
||||||
return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
|
return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
|
||||||
|
|
|
@ -135,7 +135,7 @@
|
||||||
{ \
|
{ \
|
||||||
if ( ! (parameter_condition) ) \
|
if ( ! (parameter_condition) ) \
|
||||||
{ \
|
{ \
|
||||||
SND_ERR(L"FAILED parameter check: %hS\n", #parameter_condition); \
|
SND_ERR(L"FAILED parameter check: %hS at File %S Line %lu\n", #parameter_condition, __FILE__, __LINE__); \
|
||||||
return MMSYSERR_INVALPARAM; \
|
return MMSYSERR_INVALPARAM; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
@ -199,11 +199,11 @@ typedef MMRESULT (*WAVE_COMMIT_FUNC)(
|
||||||
|
|
||||||
typedef MMRESULT (*MMMIXERQUERY_FUNC) (
|
typedef MMRESULT (*MMMIXERQUERY_FUNC) (
|
||||||
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
IN struct _SOUND_DEVICE_INSTANCE* SoundDeviceInstance,
|
||||||
|
IN DWORD DeviceId,
|
||||||
IN UINT uMsg,
|
IN UINT uMsg,
|
||||||
IN LPVOID Parameter,
|
IN LPVOID Parameter,
|
||||||
IN DWORD Flags);
|
IN DWORD Flags);
|
||||||
|
|
||||||
|
|
||||||
typedef MMRESULT (*MMWAVEQUERYFORMATSUPPORT_FUNC)(
|
typedef MMRESULT (*MMWAVEQUERYFORMATSUPPORT_FUNC)(
|
||||||
IN struct _SOUND_DEVICE* Device,
|
IN struct _SOUND_DEVICE* Device,
|
||||||
IN PWAVEFORMATEX WaveFormat,
|
IN PWAVEFORMATEX WaveFormat,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue