1 2 /* 3 * Diverse Bristol audio routines. 4 * Copyright (c) by Nick Copeland <nickycopeland@hotmail.com> 1996,2012 5 * 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 3 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, see <http://www.gnu.org/licenses/>. 19 * 20 */ 21 22 /* 23 * Some structures for device management. These are for the library internal, 24 * and not for anybody using the API. If you want to use the midi library, use 25 * bristolmdidiapi.h 26 * 27 * This controls messages on any given midi channel, handles that have been 28 * opened for any channel, and global control structures. 29 */ 30 31 #ifndef _BRISTOL_MIDI_H 32 #define _BRISTOL_MIDI_H 33 34 #include "bristol.h" 35 #include "bristolaudio.h" 36 37 #if (BRISTOL_HAS_ALSA == 1) 38 #include <alsa/asoundlib.h> 39 #include <alsa/seq.h> 40 #endif /* BRISTOL_HAS_ALSA */ 41 42 #include "bristolmidiapi.h" 43 44 #define BRISTOL_SOCKNAME "/tmp/.bristol" 45 46 #define BRISTOL_PERMMASK 0x00f 47 #define BRISTOL_CONNMASK 0xff0 48 49 /* 50 * Relogging flags 51 */ 52 #define BRISTOL_LOG_TERMINATE -1 53 #define BRISTOL_LOG_BRISTOL 0 54 #define BRISTOL_LOG_BRIGHTON 1 55 #define BRISTOL_LOG_DAEMON 2 56 #define BRISTOL_LOG_SYSLOG 3 57 #define BRISTOL_LOG_CONSOLE 4 58 #define BRISTOL_LOG_DISYNTHEGRATE 5 59 60 /* 61 * Global limits 62 */ 63 #define BRISTOL_MIDI_DEVCOUNT 32 64 #define BRISTOL_MIDI_HANDLES 32 65 #define BRISTOL_MIDI_CHCOUNT 64 66 #define BRISTOL_MIDI_BUFSIZE 64 67 68 /* 69 * Control flags 70 #define BRISTOL_ALSA_RAWMIDI 1 71 #define BRISTOL_OSS_RAWMIDI 2 72 #define BRISTOL_ALSA_SEQ 3 73 */ 74 75 #define BRISTOL_MIDI_TERMINATE 0x80000000 76 #define BRISTOL_MIDI_INITTED 0x40000000 77 #define BRISTOL_MIDI_FORWARD 0x20000000 78 #define BRISTOL_MIDI_FHOLD 0x10000000 79 #define BRISTOL_MIDI_GO 0x08000000 80 #define BRISTOL_BMIDI_DEBUG 0x04000000 81 82 /* 83 * Channel state flags 84 */ 85 #define BRISTOL_CHANSTATE_WAIT 0 86 #define BRISTOL_CHANSTATE_WAIT_1 1 87 #define BRISTOL_CHANSTATE_WAIT_2 2 88 #define BRISTOL_CHANSTATE_WAIT_3 3 89 90 typedef struct BristolMidiChannel { 91 int channel; 92 int handle; 93 int command; 94 int state; 95 int count; /* Of current number of bytes for this command */ 96 } bristolMidiChannel; 97 98 typedef struct BristolMidiHandle { 99 int handle; 100 int state; 101 int channel; 102 int dev; 103 unsigned int flags; 104 int messagemask; 105 int (*callback)(); 106 void *param; 107 } bristolMidiHandle; 108 109 #if (BRISTOL_HAS_ALSA == 1) 110 typedef struct BristolALSADev { 111 snd_rawmidi_t *handle; /* ALSA driver handle */ 112 // snd_seq_t *seq_handle; 113 } bristolALSADev; 114 115 typedef struct BristolSeqDev { 116 snd_seq_t *handle; /* ALSA driver handle */ 117 } bristolSeqDev; 118 #endif /* BRISTOL_HAS_ALSA */ 119 120 typedef struct BristolMidiDev { 121 char name[64]; 122 int state; 123 unsigned int flags; 124 int fd; 125 int lastchan; 126 int lastcommand; 127 int lastcommstate; 128 unsigned int sequence; 129 int handleCount; /* numberof handles using this dev */ 130 struct { 131 int count; 132 bristolMsg *bm; 133 } sysex; 134 union { 135 #if (BRISTOL_HAS_ALSA == 1) 136 bristolALSADev alsa; /* ALSA driver handle */ 137 bristolSeqDev seq; /* ALSA sequencer driver handle */ 138 #endif 139 /* 140 * And descriptor types for any other dev libraries. 141 */ 142 } driver; 143 unsigned char buffer[BRISTOL_MIDI_BUFSIZE * 2]; 144 int bufcount; 145 int bufindex; 146 bristolMidiChannel I_channel[BRISTOL_MIDI_CHANNELS]; 147 bristolMidiChannel O_channel[BRISTOL_MIDI_CHANNELS]; 148 bristolMidiMsg msg; 149 } bristolMidiDev; 150 151 typedef struct BristolMidiMain { 152 unsigned int flags; 153 unsigned int SysID; 154 bristolMidiDev dev[BRISTOL_MIDI_DEVCOUNT]; 155 bristolMidiHandle handle[BRISTOL_MIDI_HANDLES]; 156 int (*msgforwarder)(); 157 /* int GM2values[128][16]; // Values all controllers by channel */ 158 /* int mapping[128][16]; // default midi conntroller mapping table. */ 159 } bristolMidiMain; 160 161 extern int bristolGetMidiFD(int); 162 extern int bristolMidiDevRead(int, bristolMidiMsg *); 163 extern int bristolMidiTCPRead(bristolMidiMsg *); 164 extern void bristolMidiPost(bristolMidiMsg *); 165 extern int bristolMidiSendNRP(int, int, int, int); 166 extern int bristolMidiSendRP(int, int, int, int); 167 extern int bristolMidiSendMsg(int, int, int, int, int); 168 extern int bristolMidiSendKeyMsg(int, int, int, int, int); 169 170 extern int bristolMidiControl(int, int, int, int, int); 171 172 extern int bristolMidiOption(int, int, int); 173 extern void bristolMidiRegisterForwarder(int (*)()); 174 175 176 extern char *getBristolCache(char *); 177 extern void resetBristolCache(); 178 #define NO_INTERPOLATE 0x01 179 extern int bristolGetMap(char *, char *, float *, int, int); 180 extern int bristolGetFreqMap(char *, char *, fTab *, int, int, int); 181 182 extern int bristolParseScala(char *, float *); 183 184 extern pthread_t bristolOpenStdio(int); 185 186 extern void bristolMidiValueMappingTable(u_char [128][128], int [128], char *); 187 extern void bristolMidiToGM2(int [128], int [128], u_char [128][128], bristolMidiMsg *); 188 extern int bristolMidiRawToMsg(unsigned char *, int, int, int, bristolMidiMsg *); 189 extern int midiMsgHandler(bristolMidiMsg *, audioMain *); 190 191 extern int buildCurrentTable(Baudio *, float); 192 193 #endif /* _BRISTOL_MIDI_H */ 194 195