From 5a07c3c552133c0802520ba69c3b4ae0353cee33 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sun, 30 Sep 2007 12:12:22 +0000 Subject: Patch #1804801: DMedia MIDI driver for IRIX svn-id: r29142 --- COPYRIGHT | 4 +- backends/midi/dmedia.cpp | 181 +++++++++++++++++++++++++++++++++++++++++++++++ backends/module.mk | 1 + configure | 3 +- sound/mididrv.cpp | 4 ++ sound/mididrv.h | 4 ++ 6 files changed, 194 insertions(+), 3 deletions(-) create mode 100644 backends/midi/dmedia.cpp diff --git a/COPYRIGHT b/COPYRIGHT index f4d1ce1e4f..bff52fa8eb 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -13,7 +13,6 @@ Jurgen Braam Ralph Brorsen James Brown Stuart Caie -Filippos Karapetis Jamieson Christian Marcus Comstedt Paolo Costabel @@ -84,7 +83,7 @@ Andreas Bierfert "awjb" Elio Blanca "eblanca76" David Breakey "dbreakey" Robert Buchholz "prendi" -Filippos Karapetis "thebluegr" +Rainer Canavan Mathieu Carot "yokna" Stefano Ceccherini "jackburton" Travis S Coady "theealien" @@ -116,6 +115,7 @@ Jellby "jellby" Joerg "macdrega" Matt Johnson "mattjon" Nicolas Joly "njoly" +Filippos Karapetis "thebluegr" KeithS "keithscr" Sam Kenny "sam_k" Koen Kooi "koenkooi" 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 + * 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 +#include +#include +#include + +//////////////////////////////////////// +// +// 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