Previous 199869 Revisions Next

r20707 Sunday 3rd February, 2013 at 20:39:03 UTC by R. Belmont
MIDI: enable transmission of SysEx messages [R. Belmont]
[src/osd/portmedia]pmmidi.c

trunk/src/osd/portmedia/pmmidi.c
r20706r20707
1212
1313static const int RX_EVENT_BUF_SIZE = 512;
1414
15#define MIDI_SYSEX   0xf0
16#define MIDI_EOX   0xf7
17
1518struct osd_midi_device
1619{
1720   #ifndef DISABLE_MIDI
r20706r20707
242245{
243246   #ifndef DISABLE_MIDI
244247   int bytes_needed = 0;
248   PmEvent ev;
249   ev.timestamp = 0;   // use the current time
245250
246   // skip sysex data
247   if (dev->last_status == 0xf0)
251   // handle sysex
252   if (dev->last_status == MIDI_SYSEX)
248253   {
249      if (data != 0xf7)
254//      printf("sysex: %02x (%d)\n", data, dev->xmit_cnt);
255
256      // if we get a status that isn't sysex, assume it's system common
257      if ((data & 0x80) && (data != MIDI_EOX))
250258      {
259//         printf("common during sysex!\n");
260         ev.message = Pm_Message(data, 0, 0);
261         Pm_Write(dev->pmStream, &ev, 1);
251262         return;
252263      }
253      else
264
265      dev->xmit_in[dev->xmit_cnt++] = data;
266
267      // if EOX or 4 bytes filled, transmit 4 bytes
268      if ((dev->xmit_cnt == 4) || (data == MIDI_EOX))
254269      {
255         dev->last_status = 0xf7;
256         return;
270         ev.message = dev->xmit_in[0] | (dev->xmit_in[1]<<8) | (dev->xmit_in[2]<<16) | (dev->xmit_in[3]<<24);
271         Pm_Write(dev->pmStream, &ev, 1);
272         dev->xmit_in[0] = dev->xmit_in[1] = dev->xmit_in[2] = dev->xmit_in[3] = 0;
273         dev->xmit_cnt = 0;
274
275//         printf("SysEx packet: %08x\n", ev.message);
276
277         // if this is EOX, kill the running status
278         if (data == MIDI_EOX)
279         {
280            dev->last_status = 0;
281         }
257282      }
283
284      return;
258285   }
259286
287   // handle running status
260288   if ((dev->xmit_cnt == 0) && (data & 0x80))
261289   {
262290      dev->last_status = data;
r20706r20707
272300      dev->xmit_in[dev->xmit_cnt++] = data;
273301   }
274302
275   if ((dev->xmit_cnt == 1) && (dev->xmit_in[0] == 0xf0))
303   if ((dev->xmit_cnt == 1) && (dev->xmit_in[0] == MIDI_SYSEX))
276304   {
277      dev->xmit_cnt = 0;
278      dev->last_status = 0xf0;
305//      printf("Start SysEx!\n");
306      dev->last_status = MIDI_SYSEX;
279307      return;
280308   }
281309
r20706r20707
290318      case 0xf:   // system common
291319         switch (dev->xmit_in[0] & 0xf)
292320         {
293            case 0:   // System Exclusive
294               printf("No SEx please!\n");
321            case 0:   // System Exclusive is handled above
295322               break;
296323
297324            case 7:   // End of System Exclusive
r20706r20707
316343
317344   if (dev->xmit_cnt == bytes_needed)
318345   {
319      PmEvent ev;
320346      ev.message = Pm_Message(dev->xmit_in[0], dev->xmit_in[1], dev->xmit_in[2]);
321      ev.timestamp = 0;   // use the current time
322347      Pm_Write(dev->pmStream, &ev, 1);
323348      dev->xmit_cnt = 0;
324349   }

Previous 199869 Revisions Next


© 1997-2024 The MAME Team