From bf60481a6bb73bcf4b88300dbbd60fbfc33fd5a4 Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Sun, 20 Nov 2005 17:52:53 +0000 Subject: [PATCH] auxMessage implement GetDeviceCapabilities GetDeviceCount modMessage implement GetDeviceCapabilities svn path=/trunk/; revision=19381 --- reactos/lib/mmdrv/auxil.c | 16 ++++++++++++---- reactos/lib/mmdrv/midi.c | 3 ++- reactos/lib/mmdrv/mmddk.h | 2 ++ reactos/lib/mmdrv/mmdef.h | 7 +++++++ reactos/lib/mmdrv/utils.c | 6 +++++- reactos/lib/mmdrv/wave.c | 28 ++++++++++++++++++++++------ reactos/lib/mmdrv/wave.h | 3 +++ 7 files changed, 53 insertions(+), 12 deletions(-) diff --git a/reactos/lib/mmdrv/auxil.c b/reactos/lib/mmdrv/auxil.c index 4bbcc522eef..df981198ea1 100644 --- a/reactos/lib/mmdrv/auxil.c +++ b/reactos/lib/mmdrv/auxil.c @@ -9,13 +9,14 @@ * UPDATE HISTORY: * Mar 16, 2004: Created skeleton implementation */ - #include "mmdrv.h" +#include "wave.h" + #define NDEBUG #include -APIENTRY DWORD auxMessage(UINT uDevice, +APIENTRY DWORD auxMessage(UINT dwId, UINT uMessage, DWORD dwUser, DWORD dwParam1, @@ -28,14 +29,21 @@ APIENTRY DWORD auxMessage(UINT uDevice, switch (uMessage) { case AUXDM_GETDEVCAPS: - return 0; + DPRINT("AUXDM_GETDEVCAPS"); + return GetDeviceCapabilities(dwId, AuxDevice, (LPBYTE)dwParam1, (DWORD)dwParam2); + case AUXDM_GETNUMDEVS: - return 0; + DPRINT("AUXDM_GETNUMDEVS"); + return GetDeviceCount(AuxDevice); + case AUXDM_GETVOLUME: return 0; + case AUXDM_SETVOLUME: return 0; } return MMSYSERR_NOERROR; } + + diff --git a/reactos/lib/mmdrv/midi.c b/reactos/lib/mmdrv/midi.c index c4e22bb65c8..4e5be6ade41 100644 --- a/reactos/lib/mmdrv/midi.c +++ b/reactos/lib/mmdrv/midi.c @@ -10,6 +10,7 @@ */ #include "mmdrv.h" +#include "wave.h" #define NDEBUG #include @@ -233,7 +234,7 @@ APIENTRY DWORD modMessage(DWORD ID, DWORD Message, DWORD User, DWORD Param1, DWO case MODM_GETDEVCAPS: DPRINT("MODM_GETDEVCAPS"); - return MMSYSERR_NOTSUPPORTED; + return GetDeviceCapabilities(ID, MidiOutDevice, (LPBYTE)Param1, (DWORD)Param2); case MODM_OPEN : return OpenMidiDevice(MidiOutDevice, ID, User, Param1, Param2); diff --git a/reactos/lib/mmdrv/mmddk.h b/reactos/lib/mmdrv/mmddk.h index 80050cf55cd..ce8c9ade52a 100644 --- a/reactos/lib/mmdrv/mmddk.h +++ b/reactos/lib/mmdrv/mmddk.h @@ -29,6 +29,8 @@ #include #include + + #define MAX_MIDIINDRV (16) /* For now I'm making 16 the maximum number of midi devices one can * have. This should be more than enough for everybody. But as a purist, diff --git a/reactos/lib/mmdrv/mmdef.h b/reactos/lib/mmdrv/mmdef.h index 29f2569404f..acc842ed0b2 100644 --- a/reactos/lib/mmdrv/mmdef.h +++ b/reactos/lib/mmdrv/mmdef.h @@ -52,6 +52,7 @@ #define IOCTL_SOUND_BASE FILE_DEVICE_SOUND #define IOCTL_WAVE_BASE 0x0000 #define IOCTL_MIDI_BASE 0x0080 +#define IOCTL_AUX_BASE 0x0100 // Wave device driver IOCTLs @@ -84,4 +85,10 @@ #define IOCTL_MIDI_CACHE_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0008, METHOD_BUFFERED, FILE_WRITE_ACCESS) #define IOCTL_MIDI_CACHE_DRUM_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS) +// AUX device driver IOCTLs +#define IOCTL_AUX_GET_CAPABILITIES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_AUX_BASE + 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_AUX_SET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_AUX_BASE + 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_AUX_GET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_AUX_BASE + 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_SOUND_GET_CHANGED_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_AUX_BASE + 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS) + #endif diff --git a/reactos/lib/mmdrv/utils.c b/reactos/lib/mmdrv/utils.c index e97fc004a10..3cdabacf0aa 100644 --- a/reactos/lib/mmdrv/utils.c +++ b/reactos/lib/mmdrv/utils.c @@ -82,8 +82,12 @@ MMRESULT OpenDevice(UINT DeviceType, DWORD ID, PHANDLE pDeviceHandle, case MidiInDevice : wsprintf(DeviceName, L"\\\\.%ls%d", MIDI_IN_DEVICE_NAME_U + strlen("\\Device"), ID); break; + case AuxDevice : + wsprintf(DeviceName, L"\\\\.%ls%d", AUX_DEVICE_NAME_U + strlen("\\Device"), ID); + break; default : // Aux - wsprintf(DeviceName, L"\\\\.%ls%d", AUX_DEVICE_NAME_U + strlen("\\Device"), ID); + DPRINT("No Auido Device Found"); + return MMSYSERR_BADDEVICEID; /* Maybe we should change error code */ }; DPRINT("Attempting to open %S\n", DeviceName); diff --git a/reactos/lib/mmdrv/wave.c b/reactos/lib/mmdrv/wave.c index ed690a2a5d1..e7c3c1613d4 100644 --- a/reactos/lib/mmdrv/wave.c +++ b/reactos/lib/mmdrv/wave.c @@ -23,13 +23,9 @@ * ============================ */ -static MMRESULT GetDeviceCapabilities(DWORD ID, UINT DeviceType, +MMRESULT GetDeviceCapabilities(DWORD ID, UINT DeviceType, LPBYTE pCaps, DWORD Size) { - // FIXME: Implement :) -// return sndGetData(DeviceType, id, dwSize, lpCaps, -// IOCTL_WAVE_GET_CAPABILITIES); - HANDLE DeviceHandle = NULL; MMRESULT Result = MMSYSERR_NOERROR; DWORD BytesReturned = 0; @@ -46,11 +42,31 @@ static MMRESULT GetDeviceCapabilities(DWORD ID, UINT DeviceType, // Setting the overlapped parameter (last) to null means we // wait until the operation completes. // + - Result = DeviceIoControl(DeviceHandle, IOCTL_WAVE_GET_CAPABILITIES, + if (DeviceType == WaveOutDevice) + { + Result = DeviceIoControl(DeviceHandle, IOCTL_WAVE_GET_CAPABILITIES, NULL, 0, (LPVOID)pCaps, Size, &BytesReturned, NULL) ? MMSYSERR_NOERROR : TranslateStatus(); + } + else if (DeviceType == MidiOutDevice) + { + Result = DeviceIoControl(DeviceHandle, IOCTL_MIDI_GET_CAPABILITIES, + NULL, 0, (LPVOID)pCaps, Size, + &BytesReturned, NULL) ? MMSYSERR_NOERROR : TranslateStatus(); + } + + else if (DeviceType == AuxDevice) + { + Result = DeviceIoControl(DeviceHandle, IOCTL_AUX_GET_CAPABILITIES, + NULL, 0, (LPVOID)pCaps, Size, + &BytesReturned, NULL) ? MMSYSERR_NOERROR : TranslateStatus(); + } + + + // Close the handle and return the result code // CloseHandle(DeviceHandle); diff --git a/reactos/lib/mmdrv/wave.h b/reactos/lib/mmdrv/wave.h index 97f9d9ad82b..56aa5b6f0e2 100644 --- a/reactos/lib/mmdrv/wave.h +++ b/reactos/lib/mmdrv/wave.h @@ -78,3 +78,6 @@ typedef struct tag_WAVEALLOC { HANDLE ThreadHandle; // Handle for thread termination ONLY MMRESULT AuxReturnCode; // Return code from Aux task }WAVEALLOC, *PWAVEALLOC; + +MMRESULT GetDeviceCapabilities(DWORD ID, UINT DeviceType, + LPBYTE pCaps, DWORD Size);