diff options
-rw-r--r-- | COPYRIGHT | 4 | ||||
-rw-r--r-- | backends/midi/dmedia.cpp | 181 | ||||
-rw-r--r-- | backends/module.mk | 1 | ||||
-rwxr-xr-x | configure | 3 | ||||
-rw-r--r-- | sound/mididrv.cpp | 4 | ||||
-rw-r--r-- | sound/mididrv.h | 4 |
6 files changed, 194 insertions, 3 deletions
@@ -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 <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 diff --git a/backends/module.mk b/backends/module.mk index 1eaeb953a9..c5edbe6161 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -9,6 +9,7 @@ MODULE_OBJS := \ midi/morphos.o \ midi/quicktime.o \ midi/seq.o \ + midi/dmedia.o \ midi/windows.o \ plugins/dc/dc-provider.o \ plugins/posix/posix-provider.o \ @@ -833,7 +833,8 @@ else DEFINES="$DEFINES -DUNIX -DSYSTEM_NOT_SUPPORTING_D_TYPE" ;; irix*) - DEFINES="$DEFINES -DUNIX -DSYSTEM_NOT_SUPPORTING_D_TYPE" + DEFINES="$DEFINES -DUNIX -DIRIX -DSYSTEM_NOT_SUPPORTING_D_TYPE" + LIBS="$LIBS -lmd " _ranlib=: ;; darwin*) diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index 09a72366f6..aa1f4bf2af 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -48,6 +48,7 @@ static const MidiDriverDescription s_musicDrivers[] = { #if defined(UNIX) && !defined(__BEOS__) && !defined(MACOSX) && !defined(__MAEMO__) {"seq", "SEQ", MD_SEQ, MDT_MIDI}, + {"dmedia", "DMedia", MD_DMEDIA, MDT_MIDI}, #endif #if defined(MACOSX) @@ -247,6 +248,9 @@ MidiDriver *MidiDriver::createMidi(int midiDriver) { #if defined(UNIX) && !defined(__BEOS__) && !defined(MACOSX) && !defined(__MAEMO__) case MD_SEQ: return MidiDriver_SEQ_create(); #endif +#if defined(IRIX) + case MD_DMEDIA: return MidiDriver_DMEDIA_create(); +#endif #if defined(MACOSX) case MD_QTMUSIC: return MidiDriver_QT_create(); case MD_COREAUDIO: return MidiDriver_CORE_create(); diff --git a/sound/mididrv.h b/sound/mididrv.h index 120b931170..6a18b441cc 100644 --- a/sound/mididrv.h +++ b/sound/mididrv.h @@ -67,6 +67,9 @@ enum MidiDriverType { // MorphOS MD_ETUDE, + // IRIX + MD_DMEDIA, + // MIDI softsynths MD_FLUIDSYNTH, MD_MT32, @@ -273,6 +276,7 @@ extern MidiDriver *MidiDriver_CORE_create(); extern MidiDriver *MidiDriver_CoreMIDI_create(); extern MidiDriver *MidiDriver_ETUDE_create(); extern MidiDriver *MidiDriver_ALSA_create(); +extern MidiDriver *MidiDriver_DMEDIA_create(); extern MidiDriver *MidiDriver_YM2612_create(Audio::Mixer *mixer); #ifdef USE_FLUIDSYNTH extern MidiDriver *MidiDriver_FluidSynth_create(Audio::Mixer *mixer); |