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