MusicKit  0.0.0
midi_driver.h
00001 /*
00002   $Id$
00003   Defined In: The MusicKit
00004 
00005   Description: MIDI driver typedefs, defines, and functions
00006   Original Author: David Jaffe
00007 
00008   Copyright (c) 1988-1992, NeXT Computer, Inc.
00009   Portions Copyright (c) 1994 NeXT Computer, Inc. and reproduced under license from NeXT
00010   Portions Copyright (c) 1994 Stanford University
00011 */
00012 /*
00013 Modification history:
00014 
00015   $Log$
00016   Revision 1.1  1999/11/17 17:57:14  leigh
00017   Initial revision
00018 
00019   Revision 1.2  1999/07/29 01:26:06  leigh
00020   Added Win32 compatibility, CVS logs, SBs changes
00021 
00022 */
00023 #ifndef _MD_
00024 #define _MD_
00025 
00026 #import <mach/kern_return.h>
00027 #import <mach/message.h>
00028 #import <mach/port.h>
00029 #import <mach/boolean.h>
00030 
00031 #define MD_NAME @"Mididriver"  /* Name of driver (append unit number to use) */
00032 
00033 /* Each event consists of a byte and a time stamp. */
00034 typedef struct {
00035     int time;             /* Absolute time in quanta */
00036     unsigned char byte;   /* The byte */
00037 } MDRawEvent;
00038 
00039 /* MD_MAX_EVENT is the maximum number of events that can be
00040  * sent to or received from the driver in a single package. 
00041  */
00042 #define MD_MAX_EVENT 100
00043    
00044 /* MD_MAX_MSG_SIZE is the maximum size of the message you
00045  * can receive from the driver. 
00046  */
00047 #define MD_MAX_MSG_SIZE 1024  // More than enough
00048 
00049 /* Clock modes */
00050 #define MD_CLOCK_MODE_INTERNAL 0
00051 #define MD_CLOCK_MODE_MTC_SYNC 1
00052 
00053 /* error codes */
00054 #define MD_ERROR_BUSY 100
00055 #define MD_ERROR_NOT_OWNER 101
00056 #define MD_ERROR_QUEUE_FULL 102
00057 #define MD_ERROR_BAD_MODE 103
00058 #define MD_ERROR_UNIT_UNAVAILABLE 104
00059 #define MD_ERROR_ILLEGAL_OPERATION 105
00060 #define MD_ERROR_UNKNOWN_ERROR 106
00061 
00062 /* exception codes */
00063 #define MD_EXCEPTION_MTC_STOPPED 1
00064 #define MD_EXCEPTION_MTC_STARTED_FORWARD 2
00065 #define MD_EXCEPTION_MTC_STARTED_REVERSE 3
00066 
00067 /* Defines for system ignores. */
00068 #define MD_IGNORE_CLOCK  0x0100
00069 #define MD_IGNORE_START  0x0400
00070 #define MD_IGNORE_CONTINUE       0x0800
00071 #define MD_IGNORE_STOP   0x1000
00072 #define MD_IGNORE_ACTIVE         0x4000
00073 #define MD_IGNORE_RESET  0x8000
00074 #define MD_IGNORE_REAL_TIME    0xdd00  /* All of the above */
00075 
00076 #define MD_PORT_A_UNIT 0
00077 #define MD_PORT_B_UNIT 1
00078 
00079 /* Reply function types. */
00080 typedef void (*MDDataReplyFunction)
00081     (port_t replyPort, short unit, MDRawEvent *events, unsigned int count);
00082 typedef void (*MDAlarmReplyFunction)
00083     (port_t replyPort, int requestedTime, int actualTime);
00084 typedef void (*MDExceptionReplyFunction)
00085     (port_t replyPort, int exception);
00086 typedef void (*MDQueueReplyFunction)
00087     (port_t replyPort, short unit);
00088 
00089 /* Struct for passing reply functions to midi_driver library. */
00090 typedef struct _MDReplyFunctions {
00091     MDDataReplyFunction dataReply;
00092     MDAlarmReplyFunction alarmReply;
00093     MDExceptionReplyFunction exceptionReply;
00094     MDQueueReplyFunction queueReply;
00095 } MDReplyFunctions;
00096 
00097 /******* Managing ownership of the driver ********/
00098 extern kern_return_t 
00099     MDBecomeOwner(port_t driver, port_t owner);
00100 extern kern_return_t 
00101     MDReleaseOwnership(port_t driver, port_t owner);
00102 
00103 /*** Claiming a particular serial port (ownership of driver required) *****/
00104 extern kern_return_t 
00105     MDClaimUnit(port_t driver, port_t owner, short unit);
00106 extern kern_return_t 
00107     MDReleaseUnit(port_t driver, port_t owner, short unit);
00108 
00109 /******** Controlling the clock ****************/
00110 extern kern_return_t 
00111     MDSetClockMode(port_t driver, port_t owner, short synchUnit, int mode);
00112 extern kern_return_t 
00113     MDSetClockQuantum(port_t driver, port_t owner, int microseconds);
00114 extern kern_return_t 
00115     MDSetClockTime(port_t driver, port_t owner, int time);
00116 extern kern_return_t 
00117     MDGetClockTime(port_t driver, port_t owner, int *time);
00118 extern kern_return_t 
00119     MDGetMTCTime(port_t driver, port_t owner, short *format, short *hours, short *minutes, short *seconds, short *frames);
00120 extern kern_return_t 
00121     MDStartClock(port_t driver, port_t owner);
00122 extern kern_return_t 
00123     MDStopClock(port_t driver, port_t owner);
00124 
00125 /****************** Requesting asynchronous messages *******************/
00126 extern kern_return_t 
00127     MDRequestData(port_t driver, port_t owner, short unit, port_t replyPort);
00128 extern kern_return_t 
00129     MDRequestAlarm(port_t driver, port_t owner, port_t replyPort, int time);
00130 extern kern_return_t 
00131     MDRequestExceptions(port_t driver, port_t owner, port_t exceptionPort);
00132 extern kern_return_t 
00133     MDRequestQueueNotification(port_t driver, port_t owner, short unit, port_t notificationPort, int size);
00134 
00135 /****************** Receiving asynchronous messages *******************/
00136 extern kern_return_t 
00137     MDAwaitReply(port_t ports, MDReplyFunctions *funcs, int timeout);
00138 
00139 #define MD_NO_TIMEOUT (-1)
00140 
00141 extern kern_return_t 
00142     MDHandleReply(msg_header_t *msg,MDReplyFunctions *funcs);
00143 
00144 /****************** Writing MD data to the driver *********************/
00145 extern kern_return_t 
00146     MDSendData(port_t driver, port_t owner, short unit, MDRawEvent *data, unsigned int count);
00147 extern kern_return_t 
00148     MDGetAvailableQueueSize(port_t driver, port_t owner, short unit, int *size);
00149 extern kern_return_t 
00150     MDClearQueue(port_t driver, port_t owner, short unit);
00151 extern kern_return_t 
00152     MDFlushQueue(port_t device_port, port_name_t owner_port, short unit);
00153 extern kern_return_t 
00154     MIDIDownloadDLSInstruments(unsigned int *patches, int patchCount);
00155 extern char **MIDIGetAvailableDrivers(unsigned int *selectedDriver);
00156 
00157 /********************* Controling how incoming data is formated ***********/
00158 extern kern_return_t 
00159     MDFilterMessage(port_t driver, port_t owner, short unit, unsigned char statusByte, boolean_t filterIt);
00160 extern kern_return_t 
00161     MDParseInput(port_t driver, port_t owner, short unit, boolean_t parseIt);
00162 
00163 /* This will be obsolete soon: */
00164 extern kern_return_t 
00165     MDSetSystemIgnores(port_t driver, port_t owner, short unit, unsigned int ignoreBits);
00166 
00167 /*
00168  * Originally from <MusicKit/midi_driver_compatability.h
00169  *      Author: David Jaffe
00170  *      CCRMA, Stanford University, 1994.
00171  *
00172  *      This file provides compatability between the Music Kit
00173  *      Intel MIDI driver and the NeXT hardware driver.  If you
00174  *      want your software to run on both architectures, include
00175  *      this file before <mididriver/midi_driver.h> or anything else
00176  *      that includes <mididriver/midi_driver.h>.
00177  *
00178  *      31/12/98 Actually, now we only use the mididriver versions
00179  *      for NeXT hardware, and all other architectures use DriverKit
00180  *      MusicKit MIDI drivers.
00181  */
00182 
00183 #if !m68k
00184 /* These macros make the musickit functions and macros look like those in libdsp. */
00185 #define MIDIRawEvent                       MDRawEvent
00186 #define MIDI_MAX_EVENT                     MD_MAX_EVENT
00187 #define MIDI_MAX_MSG_SIZE                  MD_MAX_MSG_SIZE
00188 #define MIDI_CLOCK_MODE_INTERNAL           MD_CLOCK_MODE_INTERNAL
00189 #define MIDI_CLOCK_MODE_MTC_SYNC           MD_CLOCK_MODE_MTC_SYNC
00190 #define MIDI_ERROR_BUSY                    MD_ERROR_BUSY
00191 #define MIDI_ERROR_NOT_OWNER               MD_ERROR_NOT_OWNER
00192 #define MIDI_ERROR_QUEUE_FULL              MD_ERROR_QUEUE_FULL
00193 #define MIDI_ERROR_BAD_MODE                MD_ERROR_BAD_MODE
00194 #define MIDI_ERROR_UNIT_UNAVAILABLE        MD_ERROR_UNIT_UNAVAILABLE
00195 #define MIDI_ERROR_ILLEGAL_OPERATION       MD_ERROR_ILLEGAL_OPERATION
00196 #define MIDI_ERROR_UNKNOWN_ERROR           MD_ERROR_UNKNOWN_ERROR
00197 #define MIDI_EXCEPTION_MTC_STOPPED         MD_EXCEPTION_MTC_STOPPED
00198 #define MIDI_EXCEPTION_MTC_STARTED_FORWARD MD_EXCEPTION_MTC_STARTED_FORWARD
00199 #define MIDI_EXCEPTION_MTC_STARTED_REVERSE MD_EXCEPTION_MTC_STARTED_REVERSE
00200 #define MIDI_PORT_A_UNIT                   MD_PORT_A_UNIT
00201 #define MIDI_PORT_B_UNIT                   MD_PORT_B_UNIT
00202 #define MIDI_IGNORE_CLOCK                  MD_IGNORE_CLOCK
00203 #define MIDI_IGNORE_START                  MD_IGNORE_START
00204 #define MIDI_IGNORE_CONTINUE               MD_IGNORE_CONTINUE
00205 #define MIDI_IGNORE_STOP                   MD_IGNORE_STOP
00206 #define MIDI_IGNORE_ACTIVE                 MD_IGNORE_ACTIVE
00207 #define MIDI_IGNORE_RESET                  MD_IGNORE_RESET
00208 #define MIDI_IGNORE_REAL_TIME              MD_IGNORE_REAL_TIME
00209 #define MIDIDataReplyFunction              MDDataReplyFunction
00210 #define MIDIAlarmReplyFunction             MDAlarmReplyFunction
00211 #define MIDIExceptionReplyFunction         MDExceptionReplyFunction
00212 #define MIDIQueueReplyFunction             MDQueueReplyFunction
00213 #define MIDIReplyFunctions                 MDReplyFunctions
00214 #define MIDIBecomeOwner                    MDBecomeOwner
00215 #define MIDIReleaseOwnership               MDReleaseOwnership
00216 #define MIDIClaimUnit                      MDClaimUnit
00217 #define MIDIReleaseUnit                    MDReleaseUnit
00218 #define MIDISetClockMode                   MDSetClockMode
00219 #define MIDISetClockQuantum                MDSetClockQuantum
00220 #define MIDISetClockTime                   MDSetClockTime
00221 #define MIDIGetClockTime                   MDGetClockTime
00222 #define MIDIGetMTCTime                     MDGetMTCTime
00223 #define MIDIStartClock                     MDStartClock
00224 #define MIDIStopClock                      MDStopClock
00225 #define MIDISetSystemIgnores               MDSetSystemIgnores
00226 #define MIDIRequestData                    MDRequestData
00227 #define MIDIRequestAlarm                   MDRequestAlarm
00228 #define MIDIRequestExceptions              MDRequestExceptions
00229 #define MIDIRequestQueueNotification       MDRequestQueueNotification
00230 #define MIDIAwaitReply                     MDAwaitReply
00231 #define MIDI_NO_TIMEOUT                    MD_NO_TIMEOUT
00232 #define MIDIHandleReply                    MDHandleReply
00233 #define MIDISendData                       MDSendData
00234 #define MIDIGetAvailableQueueSize          MDGetAvailableQueueSize
00235 #define MIDIClearQueue                     MDClearQueue
00236 #define MIDIFlushQueue                     MDFlushQueue
00237 #define MIDIFilterMessage                  MDFilterMessage
00238 #define MIDIParseInput                     MDParseInput
00239 #endif // !m68K compatability
00240 
00241 #endif _MD_
00242