mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 12:55:43 +00:00
implement GetDeviceCapabilities and GetDeviceCount for midMessage
svn path=/trunk/; revision=19383
This commit is contained in:
parent
096266737b
commit
5488776a17
2 changed files with 77 additions and 7 deletions
|
@ -17,6 +17,42 @@
|
||||||
|
|
||||||
// MIDI device instance information
|
// MIDI device instance information
|
||||||
//
|
//
|
||||||
|
#define LOCAL_DATA_SIZE 20
|
||||||
|
typedef struct _LOCALMIDIHDR {
|
||||||
|
OVERLAPPED Ovl;
|
||||||
|
DWORD BytesReturned;
|
||||||
|
struct _LOCALMIDIHDR *lpNext;
|
||||||
|
BOOL Done;
|
||||||
|
PVOID pClient;
|
||||||
|
// MIDI_DD_INPUT_DATA MidiData;
|
||||||
|
BYTE ExtraData[LOCAL_DATA_SIZE - sizeof(ULONG)];
|
||||||
|
|
||||||
|
} LOCALMIDIHDR, *PLOCALMIDIHDR;
|
||||||
|
|
||||||
|
#define LOCAL_MIDI_BUFFERS 8
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
|
||||||
|
BOOL fMidiInStarted;
|
||||||
|
DWORD dwMsg;
|
||||||
|
DWORD dwCurData;
|
||||||
|
BYTE status;
|
||||||
|
BOOLEAN fSysex;
|
||||||
|
BOOLEAN Bad;
|
||||||
|
BYTE bBytesLeft;
|
||||||
|
BYTE bBytePos;
|
||||||
|
DWORD dwCurTime;
|
||||||
|
DWORD dwMsgTime;
|
||||||
|
|
||||||
|
|
||||||
|
PLOCALMIDIHDR DeviceQueue;
|
||||||
|
|
||||||
|
LOCALMIDIHDR
|
||||||
|
Bufs[LOCAL_MIDI_BUFFERS];
|
||||||
|
|
||||||
|
|
||||||
|
} LOCALMIDIDATA, *PLOCALMIDIDATA;
|
||||||
|
|
||||||
|
|
||||||
typedef struct tag_MIDIALLOC {
|
typedef struct tag_MIDIALLOC {
|
||||||
struct tag_MIDIALLOC *Next; // Chain of devices
|
struct tag_MIDIALLOC *Next; // Chain of devices
|
||||||
|
@ -54,7 +90,7 @@ typedef struct tag_MIDIALLOC {
|
||||||
HANDLE AuxEvent2; // Aux thread caller waits on this
|
HANDLE AuxEvent2; // Aux thread caller waits on this
|
||||||
DWORD AuxReturnCode; // Return code from Aux task
|
DWORD AuxReturnCode; // Return code from Aux task
|
||||||
DWORD dwFlags; // Open flags
|
DWORD dwFlags; // Open flags
|
||||||
// PLOCALMIDIDATA Mid; // Extra midi input structures
|
PLOCALMIDIDATA Mid; // Extra midi input structures
|
||||||
int l; // Helper global for modMidiLength
|
int l; // Helper global for modMidiLength
|
||||||
|
|
||||||
} MIDIALLOC, *PMIDIALLOC;
|
} MIDIALLOC, *PMIDIALLOC;
|
||||||
|
@ -79,13 +115,24 @@ static DWORD OpenMidiDevice(UINT DeviceType, DWORD ID, DWORD User, DWORD Param1,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MidiInDevice :
|
case MidiInDevice :
|
||||||
// TODO
|
pClient = (PMIDIALLOC) HeapAlloc(Heap, 0, sizeof(MIDIALLOC) + sizeof(LOCALMIDIDATA));
|
||||||
|
if ( pClient ) memset(pClient, 0, sizeof(MIDIALLOC) + sizeof(LOCALMIDIDATA));
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
if ( !pClient )
|
if ( !pClient )
|
||||||
return MMSYSERR_NOMEM;
|
return MMSYSERR_NOMEM;
|
||||||
|
|
||||||
|
if (DeviceType == MidiInDevice)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
pClient->Mid = (PLOCALMIDIDATA)(pClient + 1);
|
||||||
|
for (i = 0 ;i < LOCAL_MIDI_BUFFERS ; i++)
|
||||||
|
{
|
||||||
|
pClient->Mid->Bufs[i].pClient = pClient;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pClient->DeviceType = DeviceType;
|
pClient->DeviceType = DeviceType;
|
||||||
pClient->dwCallback = ((LPMIDIOPENDESC)Param1)->dwCallback;
|
pClient->dwCallback = ((LPMIDIOPENDESC)Param1)->dwCallback;
|
||||||
pClient->dwInstance = ((LPMIDIOPENDESC)Param1)->dwInstance;
|
pClient->dwInstance = ((LPMIDIOPENDESC)Param1)->dwInstance;
|
||||||
|
@ -108,11 +155,34 @@ static DWORD OpenMidiDevice(UINT DeviceType, DWORD ID, DWORD User, DWORD Param1,
|
||||||
return MMSYSERR_NOMEM;
|
return MMSYSERR_NOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (DeviceType == MidiInDevice)
|
||||||
|
{
|
||||||
|
pClient->AuxEvent1 = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||||
|
if (pClient->AuxEvent1 == NULL)
|
||||||
|
{
|
||||||
|
// cleanup
|
||||||
|
return MMSYSERR_NOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
pClient->AuxEvent2 = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||||
|
if (pClient->AuxEvent2 == NULL)
|
||||||
|
{
|
||||||
|
// cleanup
|
||||||
|
return MMSYSERR_NOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TaskCreate
|
||||||
|
|
||||||
|
WaitForSingleObject(pClient->AuxEvent2, INFINITE);
|
||||||
|
}
|
||||||
|
|
||||||
PMIDIALLOC *pUserHandle;
|
PMIDIALLOC *pUserHandle;
|
||||||
pUserHandle = (PMIDIALLOC*) User;
|
pUserHandle = (PMIDIALLOC*) User;
|
||||||
*pUserHandle = pClient;
|
*pUserHandle = pClient;
|
||||||
|
|
||||||
// callback
|
// callback
|
||||||
|
|
||||||
return MMSYSERR_NOERROR;
|
return MMSYSERR_NOERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,11 +253,11 @@ APIENTRY DWORD midMessage(DWORD dwId, DWORD dwMessage, DWORD dwUser, DWORD dwPar
|
||||||
switch (dwMessage) {
|
switch (dwMessage) {
|
||||||
case MIDM_GETNUMDEVS:
|
case MIDM_GETNUMDEVS:
|
||||||
DPRINT("MIDM_GETNUMDEVS");
|
DPRINT("MIDM_GETNUMDEVS");
|
||||||
return 0;
|
return GetDeviceCount(MidiInDevice);
|
||||||
|
|
||||||
case MIDM_GETDEVCAPS:
|
case MIDM_GETDEVCAPS:
|
||||||
DPRINT("MIDM_GETDEVCAPS");
|
DPRINT("MIDM_GETDEVCAPS");
|
||||||
return MMSYSERR_NOERROR;
|
return GetDeviceCapabilities(dwId, MidiInDevice, (LPBYTE)dwParam1, (DWORD)dwParam2);
|
||||||
|
|
||||||
case MIDM_OPEN:
|
case MIDM_OPEN:
|
||||||
DPRINT("MIDM_OPEN");
|
DPRINT("MIDM_OPEN");
|
||||||
|
|
|
@ -51,7 +51,7 @@ MMRESULT GetDeviceCapabilities(DWORD ID, UINT DeviceType,
|
||||||
&BytesReturned, NULL) ? MMSYSERR_NOERROR : TranslateStatus();
|
&BytesReturned, NULL) ? MMSYSERR_NOERROR : TranslateStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (DeviceType == MidiOutDevice)
|
else if ((DeviceType == MidiInDevice) || (DeviceType == MidiOutDevice))
|
||||||
{
|
{
|
||||||
Result = DeviceIoControl(DeviceHandle, IOCTL_MIDI_GET_CAPABILITIES,
|
Result = DeviceIoControl(DeviceHandle, IOCTL_MIDI_GET_CAPABILITIES,
|
||||||
NULL, 0, (LPVOID)pCaps, Size,
|
NULL, 0, (LPVOID)pCaps, Size,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue