Changes in emu/mid.c [0529a19:c5b6c90] in buchla-emu
Legend:
- Unmodified
- Added
- Removed
-
emu/mid.c
r0529a19 rc5b6c90 17 17 18 18 #include <all.h> 19 #include <rtmidi/rtmidi_c.h>20 19 21 20 #define ver(...) _ver(mid_verbose, 0, __VA_ARGS__) 22 21 #define ver2(...) _ver(mid_verbose, 1, __VA_ARGS__) 23 22 #define ver3(...) _ver(mid_verbose, 2, __VA_ARGS__) 23 24 int32_t mid_verbose = 0; 24 25 25 26 #define REG_IER_ISR 0 … … 28 29 #define REG_TDR_RDR 3 29 30 30 #define BUF_SZ 12831 32 typedef struct {33 int32_t buf_hd;34 int32_t buf_tl;35 uint8_t buf[BUF_SZ];36 bool irq_r;37 bool irq_t;38 bool rdr_ok;39 uint8_t rdr;40 } state_t;41 42 static state_t state[] = {43 { .buf_hd = 0, .buf_tl = 0, .irq_r = false, .irq_t = false, .rdr_ok = false, .rdr = 0x00 },44 { .buf_hd = 0, .buf_tl = 0, .irq_r = false, .irq_t = false, .rdr_ok = false, .rdr = 0x00 }45 };46 47 int32_t mid_verbose = 0;48 49 struct RtMidiWrapper* midiin;50 51 static void xmit(int32_t un)52 {53 int32_t i = state[un].buf_tl;54 ver2("mid xmit %d %d", i, state[un].buf_hd);55 56 if (i >= state[un].buf_hd) {57 return;58 }59 60 uint8_t byte = state[un].buf[i % BUF_SZ];61 ver2("mid xmit 0x%02x", byte);62 63 state[un].rdr = byte;64 state[un].rdr_ok = true;65 state[un].irq_r = true;66 67 state[un].buf_tl = i + 1;68 69 if (state[un].buf_tl >= BUF_SZ) {70 state[un].buf_hd -= BUF_SZ;71 state[un].buf_tl -= BUF_SZ;72 ver2("mid adj %d %d", state[un].buf_tl, state[un].buf_hd);73 }74 }75 76 static void out_lk(int32_t un, uint8_t c)77 {78 int32_t i = state[un].buf_hd;79 ver2("mid out %d %d 0x%02x", state[un].buf_tl, i, c);80 81 if (i >= state[un].buf_tl + BUF_SZ) {82 err("midi port %d losing data", un);83 return;84 }85 86 state[un].buf[i % BUF_SZ] = c;87 state[un].buf_hd = i + 1;88 89 if (!state[un].irq_r && !state[un].rdr_ok) {90 xmit(un);91 }92 }93 94 static void out(int32_t un, uint8_t c)95 {96 if (SDL_LockMutex(cpu_mutex) < 0) {97 fail("SDL_LockMutex() failed: %s", SDL_GetError());98 }99 100 out_lk(un, c);101 102 if (SDL_UnlockMutex(cpu_mutex) < 0) {103 fail("SDL_UnlockMutex() failed: %s", SDL_GetError());104 }105 }106 107 static void midi_callback(double timeStamp, const unsigned char* message, void *userData) {108 ver2("Timestamp %f\n", timeStamp);109 110 for (uint8_t i = 0; i < sizeof(message); i++) {111 ver2("Message %i %u", i, (uint8_t) message[i]);112 out(0, message[i]);113 }114 }115 116 31 void mid_init(void) 117 32 { 118 33 ver("mid init"); 119 120 midiin = rtmidi_in_create_default();121 ver2("%p", midiin->ptr);122 // check if null123 uint32_t portcount = rtmidi_get_port_count(midiin);124 ver2("%d", midiin->ok);125 126 if (portcount == 0) {127 midiin = NULL;128 ver2("no midi ports\n");129 return;130 }131 132 for (uint32_t i = 0; i < portcount; i++) {133 ver2("Port %d: %s", i, rtmidi_get_port_name(midiin, i));134 }135 136 rtmidi_open_port(midiin, 0, rtmidi_get_port_name(midiin, 0));137 if(!midiin->ok) {138 fail("Failed to open Midi port");139 }140 141 rtmidi_in_set_callback(midiin, midi_callback, midiin->data);142 if(!midiin->ok) {143 fail("Failed to set Midi Callback");144 }145 34 } 146 35 147 36 void mid_quit(void) 148 37 { 149 if(midiin) {150 rtmidi_close_port(midiin);151 rtmidi_in_free(midiin);152 }153 154 38 ver("mid quit"); 155 39 } … … 158 42 { 159 43 ver3("mid exec"); 160 return state[0].irq_r || state[0].irq_t || state[1].irq_r || state[1].irq_t;44 return false; 161 45 } 162 46 … … 164 48 { 165 49 ver2("mid rd %u:%d", off, sz * 8); 166 167 if (sz != 1 || off > 7) { 168 fail("invalid mid rd %u:%d", off, sz * 8); 169 } 170 171 int32_t rg = (int32_t)(off % 4); 172 int32_t un = (int32_t)(off / 4); 173 174 uint32_t rv; 175 176 switch (rg) { 177 case REG_IER_ISR: 178 rv = (uint32_t)(0xc0 | (state[un].rdr_ok ? 0x01 : 0x00)); 179 state[un].irq_r = false; 180 state[un].irq_t = false; 181 ver2("ISR[%d] 0x%02x", un, rv); 182 break; 183 184 case REG_TDR_RDR: 185 rv = state[un].rdr; 186 state[un].rdr_ok = false; 187 ver2("RDR[%d] 0x%02x", un, rv); 188 break; 189 190 default: 191 rv = 0x00; 192 break; 193 } 194 195 if (!state[un].irq_r && !state[un].rdr_ok) { 196 xmit(un); 197 } 198 199 return rv; 50 return 0; 200 51 } 201 52
Note:
See TracChangeset
for help on using the changeset viewer.