mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-19 16:33:50 +00:00
Moved SEQ to its own file
svn-id: r7604
This commit is contained in:
parent
4cc3a466d0
commit
61c2430a98
@ -1,185 +0,0 @@
|
||||
/* ScummVM - Scumm Interpreter
|
||||
* Copyright (C) 2001 Ludvig Strigeus
|
||||
* Copyright (C) 2001-2003 The ScummVM project
|
||||
*
|
||||
* 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 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.
|
||||
*
|
||||
* $Header$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Raw output support by Michael Pearce
|
||||
* Alsa support by Nicolas Noble <nicolas@nobis-crew.org> copied from
|
||||
* both the QuickTime support and (vkeybd http://www.alsa-project.org/~iwai/alsa.html)
|
||||
*/
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "mididrv.h"
|
||||
#include "mpu401.h"
|
||||
#include "common/engine.h" // for warning/error/debug
|
||||
#include "common/util.h" // for ARRAYSIZE
|
||||
|
||||
/* Default (empty) property method */
|
||||
uint32 MidiDriver::property(int prop, uint32 param) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* retrieve a string representation of an error code */
|
||||
const char *MidiDriver::getErrorName(int error_code) {
|
||||
static const char *const midi_errors[] = {
|
||||
"No error",
|
||||
"Cannot connect",
|
||||
"Streaming not available",
|
||||
"Device not available",
|
||||
"Driver already open"
|
||||
};
|
||||
|
||||
if ((uint) error_code >= ARRAYSIZE(midi_errors))
|
||||
return "Unknown Error";
|
||||
return midi_errors[error_code];
|
||||
}
|
||||
|
||||
#if defined(UNIX) && !defined(__BEOS__)
|
||||
#define SEQ_MIDIPUTC 5
|
||||
#define SPECIAL_CHANNEL 9
|
||||
|
||||
class MidiDriver_SEQ : public MidiDriver_MPU401 {
|
||||
public:
|
||||
MidiDriver_SEQ();
|
||||
int open();
|
||||
void close();
|
||||
void send(uint32 b);
|
||||
void sysEx(byte *msg, uint16 length);
|
||||
|
||||
private:
|
||||
bool _isOpen;
|
||||
int device, _device_num;
|
||||
};
|
||||
|
||||
MidiDriver_SEQ::MidiDriver_SEQ() {
|
||||
_isOpen = false;
|
||||
device = 0;
|
||||
_device_num = 0;
|
||||
}
|
||||
|
||||
int MidiDriver_SEQ::open() {
|
||||
if (_isOpen)
|
||||
return MERR_ALREADY_OPEN;
|
||||
_isOpen = true;
|
||||
device = 0;
|
||||
|
||||
char *device_name = getenv("SCUMMVM_MIDI");
|
||||
if (device_name != NULL) {
|
||||
device = (::open((device_name), O_RDWR, 0));
|
||||
} else {
|
||||
warning("You need to set-up the SCUMMVM_MIDI environment variable properly (see README) ");
|
||||
}
|
||||
if ((device_name == NULL) || (device < 0)) {
|
||||
if (device_name == NULL)
|
||||
warning("Opening /dev/null (no music will be heard) ");
|
||||
else
|
||||
warning("Cannot open rawmidi device %s - using /dev/null (no music will be heard) ",
|
||||
device_name);
|
||||
device = (::open(("/dev/null"), O_RDWR, 0));
|
||||
if (device < 0)
|
||||
error("Cannot open /dev/null to dump midi output");
|
||||
}
|
||||
|
||||
if (getenv("SCUMMVM_MIDIPORT"))
|
||||
_device_num = atoi(getenv("SCUMMVM_MIDIPORT"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
void MidiDriver_SEQ::close() {
|
||||
::close(device);
|
||||
_isOpen = false;
|
||||
}
|
||||
|
||||
void MidiDriver_SEQ::send(uint32 b) {
|
||||
unsigned char buf[256];
|
||||
int position = 0;
|
||||
|
||||
switch (b & 0xF0) {
|
||||
case 0x80:
|
||||
case 0x90:
|
||||
case 0xA0:
|
||||
case 0xB0:
|
||||
case 0xE0:
|
||||
buf[position++] = SEQ_MIDIPUTC;
|
||||
buf[position++] = (unsigned char)b;
|
||||
buf[position++] = _device_num;
|
||||
buf[position++] = 0;
|
||||
buf[position++] = SEQ_MIDIPUTC;
|
||||
buf[position++] = (unsigned char)((b >> 8) & 0x7F);
|
||||
buf[position++] = _device_num;
|
||||
buf[position++] = 0;
|
||||
buf[position++] = SEQ_MIDIPUTC;
|
||||
buf[position++] = (unsigned char)((b >> 16) & 0x7F);
|
||||
buf[position++] = _device_num;
|
||||
buf[position++] = 0;
|
||||
break;
|
||||
case 0xC0:
|
||||
case 0xD0:
|
||||
buf[position++] = SEQ_MIDIPUTC;
|
||||
buf[position++] = (unsigned char)b;
|
||||
buf[position++] = _device_num;
|
||||
buf[position++] = 0;
|
||||
buf[position++] = SEQ_MIDIPUTC;
|
||||
buf[position++] = (unsigned char)((b >> 8) & 0x7F);
|
||||
buf[position++] = _device_num;
|
||||
buf[position++] = 0;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Unknown : %08x\n", (int)b);
|
||||
break;
|
||||
}
|
||||
write(device, buf, position);
|
||||
}
|
||||
|
||||
void MidiDriver_SEQ::sysEx (byte *msg, uint16 length) {
|
||||
if (length > 254) {
|
||||
warning ("Cannot send SysEx block - data too large");
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned char buf [1024];
|
||||
int position = 0;
|
||||
byte *chr = msg;
|
||||
|
||||
// Should be we using EV_SYSEX instead of SEQ_MIDIPUTC?
|
||||
// I'm not sure how to send EV_SYSEX.
|
||||
buf[position++] = SEQ_MIDIPUTC;
|
||||
buf[position++] = 0xFF;
|
||||
buf[position++] = _device_num;
|
||||
buf[position++] = 0;
|
||||
for (; length; --length) {
|
||||
buf[position++] = SEQ_MIDIPUTC;
|
||||
buf[position++] = (unsigned char) *chr;
|
||||
buf[position++] = _device_num;
|
||||
buf[position++] = 0;
|
||||
}
|
||||
buf[position++] = SEQ_MIDIPUTC;
|
||||
buf[position++] = 0xF7;
|
||||
buf[position++] = _device_num;
|
||||
buf[position++] = 0;
|
||||
write (device, buf, position);
|
||||
}
|
||||
|
||||
MidiDriver *MidiDriver_SEQ_create() {
|
||||
return new MidiDriver_SEQ();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user