diff options
author | Max Horn | 2007-09-30 12:12:22 +0000 |
---|---|---|
committer | Max Horn | 2007-09-30 12:12:22 +0000 |
commit | 5a07c3c552133c0802520ba69c3b4ae0353cee33 (patch) | |
tree | 88e61a255c6f25ca3b81901a0fe035bff51b6bc8 /backends/midi/dmedia.cpp | |
parent | 341a392de29bd1f881e0051d98f67caf9f21b98a (diff) | |
download | scummvm-rg350-5a07c3c552133c0802520ba69c3b4ae0353cee33.tar.gz scummvm-rg350-5a07c3c552133c0802520ba69c3b4ae0353cee33.tar.bz2 scummvm-rg350-5a07c3c552133c0802520ba69c3b4ae0353cee33.zip |
Patch #1804801: DMedia MIDI driver for IRIX
svn-id: r29142
Diffstat (limited to 'backends/midi/dmedia.cpp')
-rw-r--r-- | backends/midi/dmedia.cpp | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/backends/midi/dmedia.cpp b/backends/midi/dmedia.cpp new file mode 100644 index 0000000000..f11a17b653 --- /dev/null +++ b/backends/midi/dmedia.cpp @@ -0,0 +1,181 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL: + * $Id: dmedia.cpp + */ + +/* + * IRIX dmedia support by Rainer Canavan <scumm@canavan.de> + * some code liberated from seq.cpp and coremidi.cpp + */ + +#if defined(IRIX) + +#include "common/stdafx.h" +#include "sound/mpu401.h" +#include "common/util.h" + +#include <dmedia/midi.h> +#include <sys/types.h> +#include <bstring.h> +#include <unistd.h> + +//////////////////////////////////////// +// +// IRIX dmedia midi driver +// +//////////////////////////////////////// + +#define SEQ_MIDIPUTC 5 + +class MidiDriver_DMEDIA : public MidiDriver_MPU401 { +public: + MidiDriver_DMEDIA(); + int open(); + void close(); + void send(uint32 b); + void sysEx(const byte *msg, uint16 length); + +private: + bool _isOpen; + int _deviceNum; + char *_midiportName; + MDport _midiPort; + int _fd; +}; + +MidiDriver_DMEDIA::MidiDriver_DMEDIA() { + _isOpen = false; + _deviceNum = 0; + _midiportName = NULL; +} + +int MidiDriver_DMEDIA::open() { + int numinterfaces; + + if (_isOpen) + return MERR_ALREADY_OPEN; + _isOpen = true; + + warning("dmedia init"); + numinterfaces = mdInit(); + if (numinterfaces <= 0) { + fprintf(stderr,"No MIDI interfaces configured.\n"); + perror("Cannot initialize libmd for sound output"); + return -1; + } + + if (getenv("SCUMMVM_MIDIPORT")) { + _deviceNum = atoi(getenv("SCUMMVM_MIDIPORT")); + _midiportName = mdGetName(_deviceNum); + } + else + { + _midiportName = mdGetName(0); + warning("SCUMMVM_MIDIPORT environment variable not set, using Port %s", _midiportName); + _deviceNum = 0; + } + + _midiPort = mdOpenOutPort(_midiportName); + if (!_midiPort) { + warning("Failed to open MIDI interface %s", _midiportName); + return -1; + } + + _fd = mdGetFd(_midiPort); + if (!_fd) { + warning("Failed to aquire filehandle for MIDI port %s", _midiportName); + mdClosePort(_midiPort); + return -1; + } + + mdSetStampMode(_midiPort, MD_NOSTAMP); /* don't use Timestamps */ + + return 0; +} + +void MidiDriver_DMEDIA::close() { + mdClosePort(_midiPort); + _isOpen = false; + _deviceNum = 0; + _midiportName = NULL; +} + +void MidiDriver_DMEDIA::send(uint32 b) { + MDevent event; + byte status_byte = (b & 0x000000FF); + byte first_byte = (b & 0x0000FF00) >> 8; + byte second_byte = (b & 0x00FF0000) >> 16; + + + event.sysexmsg = NULL; + event.msg[0] = status_byte; + event.msg[1] = first_byte; + event.msg[2] = second_byte; + + switch (status_byte & 0xF0) { + case 0x80: // Note Off + case 0x90: // Note On + case 0xA0: // Polyphonic Aftertouch + case 0xB0: // Controller Change + case 0xE0: // Pitch Bending + event.msglen = 3; + break; + case 0xC0: // Programm Change + case 0xD0: // Monophonic Aftertouch + event.msglen = 2; + break; + default: + warning("DMediaMIDI driver encountered unsupported status byte: 0x%02x", status_byte); + event.msglen = 3; + break; + } + if (mdSend(_midiPort, &event, 1) != 1) { + warning("failed sending MIDI event (dump follows...)"); + warning("MIDI Event (len=%u):", event.msglen); + for (int i=0; i<event.msglen; i++) warning("%02x ",(int)event.msg[i]); + } +} + +void MidiDriver_DMEDIA::sysEx (const byte *msg, uint16 length) { + MDevent event; + char buf [1024]; + + assert(length + 2 <= 256); + + memcpy(buf, msg, length); + buf[length] = MD_EOX; + event.sysexmsg = buf; + event.msglen = length; + event.msg[0] = MD_SYSEX; + event.msg[1] = 0; + event.msg[2] = 0; + + if (mdSend(_midiPort, &event, 1) != 1) { + fprintf(stderr,"failed sending MIDI SYSEX event (dump follows...)\n"); + } +} + +MidiDriver *MidiDriver_DMEDIA_create() { + return new MidiDriver_DMEDIA(); +} + +#endif |