123 lines
3.1 KiB
C++
123 lines
3.1 KiB
C++
/*
|
|
* Copyright (C) 2002-2003 The DOSBox Team
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
|
|
#include "dosbox.h"
|
|
#include "setup.h"
|
|
|
|
Bit8u MIDI_evt_len[256] = {
|
|
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x00
|
|
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x10
|
|
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x20
|
|
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x30
|
|
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x40
|
|
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x50
|
|
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x60
|
|
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0x70
|
|
|
|
3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3, // 0x80
|
|
3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3, // 0x90
|
|
3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3, // 0xa0
|
|
3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3, // 0xb0
|
|
|
|
2,2,2,2, 2,2,2,2, 2,2,2,2, 2,2,2,2, // 0xc0
|
|
2,2,2,2, 2,2,2,2, 2,2,2,2, 2,2,2,2, // 0xd0
|
|
|
|
3,3,3,3, 3,3,3,3, 3,3,3,3, 3,3,3,3, // 0xe0
|
|
|
|
0,2,3,2, 0,0,1,1, 1,0,1,1, 1,0,1,1 // 0xf0
|
|
};
|
|
|
|
#define SYSEX_SIZE 1024
|
|
|
|
#if defined (WIN32)
|
|
|
|
#include "midi_win32.h"
|
|
|
|
#elif defined (UNIX) && !defined(__BEOS__)
|
|
|
|
#include "midi_oss.h"
|
|
|
|
#else /* Fall back to no device playing */
|
|
|
|
static void MIDI_PlayMsg(Bit32u msg) {}
|
|
static void MIDI_PlaySysex(Bit8u * sysex,Bitu len) {};
|
|
static bool MIDI_StartUp(void) { return false;}
|
|
|
|
#endif
|
|
|
|
|
|
static struct {
|
|
Bitu status;
|
|
Bitu cmd_len;
|
|
Bitu cmd_pos;
|
|
|
|
Bit32u cmd_msg;
|
|
Bit8u data[4];
|
|
struct {
|
|
Bit8u buf[SYSEX_SIZE];
|
|
Bitu used;
|
|
bool active;
|
|
} sysex;
|
|
bool available;
|
|
} midi;
|
|
|
|
|
|
void MIDI_RawOutByte(Bit8u data) {
|
|
/* Test for a new status byte */
|
|
if (midi.sysex.active && !(data&0x80)) {
|
|
if (midi.sysex.used<(SYSEX_SIZE-1)) midi.sysex.buf[midi.sysex.used++]=data;
|
|
return;
|
|
} else if (data&0x80) {
|
|
if (midi.sysex.active) {
|
|
/* Play a sysex message */
|
|
midi.sysex.buf[midi.sysex.used++]=0xf7;
|
|
MIDI_PlaySysex(midi.sysex.buf,midi.sysex.used);
|
|
LOG(0,"Sysex message size %d",midi.sysex.used);
|
|
midi.sysex.active=false;
|
|
if (data==0xf7) return;
|
|
}
|
|
midi.status=data;
|
|
midi.cmd_pos=0;
|
|
midi.cmd_msg=0;
|
|
if (midi.status==0xf0) {
|
|
midi.sysex.active=true;
|
|
midi.sysex.buf[0]=0xf0;
|
|
midi.sysex.used=1;
|
|
return;
|
|
}
|
|
midi.cmd_len=MIDI_evt_len[data];
|
|
}
|
|
midi.cmd_msg|=data << (8 * midi.cmd_pos);
|
|
midi.cmd_pos++;
|
|
if (midi.cmd_pos >= midi.cmd_len) {
|
|
MIDI_PlayMsg(midi.cmd_msg);
|
|
midi.cmd_msg=midi.status;
|
|
midi.cmd_pos=1;
|
|
}
|
|
}
|
|
|
|
bool MIDI_Available(void) {
|
|
return midi.available;
|
|
}
|
|
|
|
|
|
void MIDI_Init(Section * sect) {
|
|
midi.available=MIDI_StartUp();
|
|
}
|
|
|