diff options
author | R. Belmont <rb6502@users.noreply.github.com> | 2013-01-14 03:10:52 +0000 |
---|---|---|
committer | R. Belmont <rb6502@users.noreply.github.com> | 2013-01-14 03:10:52 +0000 |
commit | 520a27efd50bb0993e9f6558247775ecddc06ee3 (patch) | |
tree | 7634632b1342014338db54172eab3dd4318ff3f3 /src/osd/portmedia | |
parent | 075c97a0c686bbf6a77f8c08b87be94064ec3869 (diff) |
First pass on MIDI out support [R. Belmont]
Diffstat (limited to 'src/osd/portmedia')
-rw-r--r-- | src/osd/portmedia/pmmidi.c | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/src/osd/portmedia/pmmidi.c b/src/osd/portmedia/pmmidi.c index 9669d761ba4..390b113c99b 100644 --- a/src/osd/portmedia/pmmidi.c +++ b/src/osd/portmedia/pmmidi.c @@ -16,7 +16,8 @@ struct osd_midi_device PortMidiStream *pmStream; PmEvent rx_evBuf[20]; // up to 20 events #endif - UINT8 xmit_in[3]; // Pm_Messages mean we can at most have 3 residue bytes + UINT8 xmit_in[4]; // Pm_Messages mean we can at most have 3 residue bytes + int xmit_cnt; }; void osd_list_midi_devices(void) @@ -234,6 +235,60 @@ int osd_read_midi_channel(osd_midi_device *dev, UINT8 *pOut) #endif } +void osd_write_midi_channel(osd_midi_device *dev, UINT8 data) +{ + #ifndef DISABLE_MIDI + int bytes_needed = 0; + + dev->xmit_in[dev->xmit_cnt++] = data; + + // are we there yet? + switch ((dev->xmit_in[0]>>4) & 0xf) + { + case 0xc: // 2-byte messages + case 0xd: + bytes_needed = 2; + break; + + case 0xf: // system common + switch (dev->xmit_in[0] & 0xf) + { + case 0: // System Exclusive + printf("No SEx please!\n"); + break; + + case 7: // End of System Exclusive + bytes_needed = 1; + break; + + case 2: // song pos + case 3: // song select + bytes_needed = 3; + break; + + default: // all other defined Fx messages are 1 byte + bytes_needed = 1; + break; + } + break; + + default: + bytes_needed = 3; + break; + } + + if (dev->xmit_cnt == bytes_needed) + { + PmEvent ev; + ev.message = Pm_Message(dev->xmit_in[0], dev->xmit_in[1], dev->xmit_in[2]); + ev.timestamp = 0; // use the current time + Pm_Write(dev->pmStream, &ev, 1); + dev->xmit_cnt = 0; + } + + #endif +} + void osd_init_midi(void) { #ifndef DISABLE_MIDI |