Annotation of mstools/samples/midimon/callback.c, revision 1.1.1.1

1.1       root        1: /* callback.c - Contains the low-level MIDI input callback function for
                      2:  *      MIDIMon.  This module also contains the LibMain() and WEP() 
                      3:  *      DLL routines, and other functions accessed by the callback.
                      4:  *
                      5:  *      Because this module contains a low-level callback function,
                      6:  *      this entire module must reside in a FIXED code segment in a DLL.
                      7:  *      The data segment must be FIXED as well, since it accessed by
                      8:  *      the callback.
                      9:  */
                     10: 
                     11: #include <windows.h>
                     12: #include <mmsystem.h>
                     13: #include "midimon.h"
                     14: #include "circbuf.h"
                     15: #include "instdata.h"
                     16: #include "callback.h"
                     17: 
                     18: static EVENT event;
                     19:     
                     20: /* midiInputHandler - Low-level callback function to handle MIDI input.
                     21:  *      Installed by midiInOpen().  The input handler takes incoming
                     22:  *      MIDI events and places them in the circular input buffer.  It then
                     23:  *      notifies the application by posting a MM_MIDIINPUT message.
                     24:  *
                     25:  *      This function is accessed at interrupt time, so it should be as 
                     26:  *      fast and efficient as possible.  You can't make any
                     27:  *      Windows calls here, except PostMessage().  The only Multimedia
                     28:  *      Windows call you can make are timeGetSystemTime(), midiOutShortMsg().
                     29:  *      
                     30:  *
                     31:  * Param:   hMidiIn - Handle for the associated input device.
                     32:  *          wMsg - One of the MIM_***** messages.
                     33:  *          dwInstance - Points to CALLBACKINSTANCEDATA structure.
                     34:  *          dwParam1 - MIDI data.
                     35:  *          dwParam2 - Timestamp (in milliseconds)
                     36:  *
                     37:  * Return:  void
                     38:  */     
                     39: void FAR PASCAL midiInputHandler(
                     40: HMIDIIN hMidiIn, 
                     41: WORD wMsg, 
                     42: DWORD dwInstance, 
                     43: DWORD dwParam1, 
                     44: DWORD dwParam2)
                     45: {
                     46:     UNREFERENCED_PARAMETER(hMidiIn);
                     47: 
                     48:     switch(wMsg)
                     49:     {
                     50:         case MIM_OPEN:
                     51:             break;
                     52: 
                     53:         /* The only error possible is invalid MIDI data, so just pass
                     54:          * the invalid data on so we'll see it.
                     55:          */
                     56:         case MIM_ERROR:
                     57:         case MIM_DATA:
                     58:             event.dwDevice = ((LPCALLBACKINSTANCEDATA)dwInstance)->dwDevice;
                     59:             event.data = dwParam1;
                     60:             event.timestamp = dwParam2;
                     61:             
                     62:             /* Send the MIDI event to the MIDI Mapper, put it in the
                     63:              * circular input buffer, and notify the application that
                     64:              * data was received.
                     65:              */
                     66:             if(((LPCALLBACKINSTANCEDATA)dwInstance)->hMapper)
                     67:                 midiOutShortMsg( 
                     68:                             ((LPCALLBACKINSTANCEDATA)dwInstance)->hMapper, 
                     69:                               dwParam1);
                     70: 
                     71:             PutEvent(((LPCALLBACKINSTANCEDATA)dwInstance)->lpBuf,
                     72:                        (LPEVENT) &event); 
                     73: 
                     74:             PostMessage(((LPCALLBACKINSTANCEDATA)dwInstance)->hWnd,
                     75:                           MM_MIDIINPUT, 0, 0L);
                     76: 
                     77:             break;
                     78: 
                     79:         default:
                     80:             break;
                     81:     }
                     82: }
                     83: 
                     84: /* PutEvent - Puts an EVENT in a CIRCULARBUFFER.  If the buffer is full, 
                     85:  *      it sets the wError element of the CIRCULARBUFFER structure 
                     86:  *      to be non-zero.
                     87:  *
                     88:  * Params:  lpBuf - Points to the CIRCULARBUFFER.
                     89:  *          lpEvent - Points to the EVENT.
                     90:  *
                     91:  * Return:  void
                     92: */
                     93: void FAR PASCAL PutEvent(LPCIRCULARBUFFER lpBuf, LPEVENT lpEvent)
                     94: {
                     95:     /* If the buffer is full, set an error and return. 
                     96:      */
                     97:     if(lpBuf->dwCount >= lpBuf->dwSize){
                     98:         lpBuf->wError = 1;
                     99:         return;
                    100:     }
                    101:     
                    102:     /* Put the event in the buffer, bump the head pointer and the byte count.
                    103:      */
                    104:     *lpBuf->lpHead = *lpEvent;
                    105:     
                    106:     ++lpBuf->lpHead;
                    107:     ++lpBuf->dwCount;
                    108: 
                    109:     /* Wrap the head pointer, if necessary.
                    110:      */
                    111:     if(lpBuf->lpHead >= lpBuf->lpEnd)
                    112:         lpBuf->lpHead = lpBuf->lpStart;
                    113: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.