implement GetDeviceCapabilities and GetDeviceCount for midMessage
Modified: trunk/reactos/lib/mmdrv/midi.c
Modified: trunk/reactos/lib/mmdrv/wave.c

Modified: trunk/reactos/lib/mmdrv/midi.c
--- trunk/reactos/lib/mmdrv/midi.c	2005-11-20 18:54:55 UTC (rev 19382)
+++ trunk/reactos/lib/mmdrv/midi.c	2005-11-20 19:28:28 UTC (rev 19383)
@@ -17,7 +17,43 @@
 
 // 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 {
     struct tag_MIDIALLOC *Next;         // Chain of devices
     UINT                DeviceNumber;   // Number of device
@@ -54,7 +90,7 @@
     HANDLE              AuxEvent2;      // Aux thread caller waits on this
     DWORD               AuxReturnCode;  // Return code from Aux task
     DWORD               dwFlags;        // Open flags
-//    PLOCALMIDIDATA      Mid;            // Extra midi input structures
+    PLOCALMIDIDATA      Mid;            // Extra midi input structures
     int                 l;              // Helper global for modMidiLength
 
 } MIDIALLOC, *PMIDIALLOC;
@@ -79,13 +115,24 @@
             break;
         
         case MidiInDevice :
-            // TODO
+            pClient = (PMIDIALLOC) HeapAlloc(Heap, 0, sizeof(MIDIALLOC) + sizeof(LOCALMIDIDATA));
+			if ( pClient ) memset(pClient, 0, sizeof(MIDIALLOC) + sizeof(LOCALMIDIDATA));
             break;
     };
     
     if ( !pClient )
         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->dwCallback = ((LPMIDIOPENDESC)Param1)->dwCallback;
     pClient->dwInstance = ((LPMIDIOPENDESC)Param1)->dwInstance;
@@ -108,11 +155,34 @@
         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;
     pUserHandle = (PMIDIALLOC*) User;
     *pUserHandle = pClient;
     
-        // callback    
+    // callback    
+
     return MMSYSERR_NOERROR;
 }
 
@@ -183,11 +253,11 @@
     switch (dwMessage) {
         case MIDM_GETNUMDEVS:
             DPRINT("MIDM_GETNUMDEVS");
-            return 0;
+            return GetDeviceCount(MidiInDevice);
 
         case MIDM_GETDEVCAPS:
             DPRINT("MIDM_GETDEVCAPS");
-            return MMSYSERR_NOERROR;
+            return GetDeviceCapabilities(dwId, MidiInDevice, (LPBYTE)dwParam1, (DWORD)dwParam2);
 
         case MIDM_OPEN:
             DPRINT("MIDM_OPEN");

Modified: trunk/reactos/lib/mmdrv/wave.c
--- trunk/reactos/lib/mmdrv/wave.c	2005-11-20 18:54:55 UTC (rev 19382)
+++ trunk/reactos/lib/mmdrv/wave.c	2005-11-20 19:28:28 UTC (rev 19383)
@@ -51,7 +51,7 @@
                   &BytesReturned, NULL) ? MMSYSERR_NOERROR : TranslateStatus();
 	}
 
-	else if (DeviceType == MidiOutDevice)
+	else if ((DeviceType == MidiInDevice) || (DeviceType == MidiOutDevice))
 	{
 	    Result = DeviceIoControl(DeviceHandle, IOCTL_MIDI_GET_CAPABILITIES,
                             NULL, 0, (LPVOID)pCaps, Size,