On Thu, Apr 12, 2012 at 12:14:27AM +0200, Alexandre Ratchov wrote: > This is to add a sndio backend for the MIDI output and stop using > the sequencer(4) interface. If you have no MIDI hardware to listen > the music on, this backend should allow soft synths (like > fluidsynth) to be used instead. > > ok? comments? >
new diff with a fix from jsg@ ok ? Index: Makefile =================================================================== RCS file: /cvs/ports/games/scummvm/Makefile,v retrieving revision 1.50 diff -u -p -r1.50 Makefile --- Makefile 20 Feb 2012 11:18:33 -0000 1.50 +++ Makefile 13 Apr 2012 08:48:34 -0000 @@ -2,6 +2,7 @@ COMMENT= graphical adventure game interpreter DISTNAME= scummvm-1.4.1 +REVISION= 1 CATEGORIES= games x11 emulators MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=scummvm/} @@ -15,7 +16,7 @@ PERMIT_PACKAGE_FTP= Yes PERMIT_DISTFILES_CDROM= Yes PERMIT_DISTFILES_FTP= Yes -WANTLIB= FLAC>=5 SDL c faad m mad>=2 pthread stdc++ theoradec z +WANTLIB= FLAC>=5 SDL c faad m mad>=2 pthread sndio stdc++ theoradec z .if ${MACHINE_ARCH} == "i386" BUILD_DEPENDS= devel/nasm @@ -29,7 +30,7 @@ LIB_DEPENDS= audio/libmad \ multimedia/libtheora CONFIGURE_STYLE=simple -CONFIGURE_ARGS+=--disable-alsa --disable-debug +CONFIGURE_ARGS+=--disable-alsa --disable-debug --disable-seq-midi --enable-sndio CONFIGURE_ENV+= CPPFLAGS="-I${LOCALBASE}/include" \ LDFLAGS="-L${LOCALBASE}/lib" USE_GROFF = Yes @@ -64,5 +65,8 @@ do-install: ${INSTALL_DATA} ${WRKSRC}/dists/scummvm.desktop \ ${PREFIX}/share/applications ${INSTALL_PROGRAM} ${WRKSRC}/scummvm ${PREFIX}/bin + +post-patch: + @cp ${FILESDIR}/sndio.cpp ${WRKSRC}/backends/midi .include <bsd.port.mk> Index: files/sndio.cpp =================================================================== RCS file: files/sndio.cpp diff -N files/sndio.cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ files/sndio.cpp 13 Apr 2012 08:48:34 -0000 @@ -0,0 +1,149 @@ +/* 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. + */ + +// Disable symbol overrides so that we can use system headers. +#define FORBIDDEN_SYMBOL_ALLOW_ALL + +#include "common/scummsys.h" + +#if defined(USE_SNDIO) + +#include "common/error.h" +#include "common/textconsole.h" +#include "common/util.h" +#include "audio/musicplugin.h" +#include "audio/mpu401.h" + +#include <sndio.h> + +//////////////////////////////////////// +// +// sndio MIDI driver +// +//////////////////////////////////////// + +class MidiDriver_Sndio : public MidiDriver_MPU401 { +public: + MidiDriver_Sndio(); + int open(); + bool isOpen() const { return hdl != NULL; } + void close(); + void send(uint32 b); + void sysEx(const byte *msg, uint16 length); + +private: + struct mio_hdl *hdl; +}; + +MidiDriver_Sndio::MidiDriver_Sndio() { + hdl = NULL; +} + +int MidiDriver_Sndio::open() { + hdl = ::mio_open(NULL, MIO_OUT, 0); + if (hdl == NULL) + warning("Could open MIDI port (no music)"); + return 0; +} + +void MidiDriver_Sndio::close() { + MidiDriver_MPU401::close(); + if (!hdl) + return; + mio_close(hdl); + hdl = NULL; +} + +void MidiDriver_Sndio::send(uint32 b) { + unsigned char buf[4]; + unsigned int len; + + if (!hdl) + return; + buf[0] = b & 0xff; + buf[1] = (b >> 8) & 0xff; + buf[2] = (b >> 16) & 0xff; + buf[3] = (b >> 24) & 0xff; + switch (buf[0] & 0xf0) { + case 0xf0: + return; + case 0xc0: + case 0xd0: + len = 2; + break; + default: + len = 3; + } + mio_write(hdl, buf, len); +} + +void MidiDriver_Sndio::sysEx(const byte *msg, uint16 length) { + if (!hdl) + return; + + unsigned char buf[266]; + + assert(length + 2 <= ARRAYSIZE(buf)); + + // Add SysEx frame + buf[0] = 0xF0; + memcpy(buf + 1, msg, length); + buf[length + 1] = 0xF7; + + mio_write(hdl, buf, length + 2); +} + + +// Plugin interface + +class SndioMusicPlugin : public MusicPluginObject { +public: + const char *getName() const { + return "Sndio"; + } + + const char *getId() const { + return "sndio"; + } + + MusicDevices getDevices() const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; +}; + +MusicDevices SndioMusicPlugin::getDevices() const { + MusicDevices devices; + devices.push_back(MusicDevice(this, "default", MT_GM)); + return devices; +} + +Common::Error SndioMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { + *mididriver = new MidiDriver_Sndio(); + + return Common::kNoError; +} + +//#if PLUGIN_ENABLED_DYNAMIC(Sndio) + //REGISTER_PLUGIN_DYNAMIC(SNDIO, PLUGIN_TYPE_MUSIC, SndioMusicPlugin); +//#else + REGISTER_PLUGIN_STATIC(SNDIO, PLUGIN_TYPE_MUSIC, SndioMusicPlugin); +//#endif + +#endif Index: patches/patch-backends_module_mk =================================================================== RCS file: patches/patch-backends_module_mk diff -N patches/patch-backends_module_mk --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-backends_module_mk 13 Apr 2012 08:48:34 -0000 @@ -0,0 +1,11 @@ +$OpenBSD$ +--- backends/module.mk.orig Wed Apr 11 09:08:02 2012 ++++ backends/module.mk Wed Apr 11 09:08:28 2012 +@@ -11,6 +11,7 @@ MODULE_OBJS := \ + midi/alsa.o \ + midi/dmedia.o \ + midi/seq.o \ ++ midi/sndio.o \ + midi/stmidi.o \ + midi/timidity.o \ + saves/savefile.o \ Index: patches/patch-base_plugins_cpp =================================================================== RCS file: patches/patch-base_plugins_cpp diff -N patches/patch-base_plugins_cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-base_plugins_cpp 13 Apr 2012 08:48:34 -0000 @@ -0,0 +1,13 @@ +$OpenBSD$ +--- base/plugins.cpp.orig Wed Apr 11 15:27:38 2012 ++++ base/plugins.cpp Wed Apr 11 15:28:37 2012 +@@ -202,6 +202,9 @@ class StaticPluginProvider : public PluginProvider { ( + #if defined(USE_SEQ_MIDI) + LINK_PLUGIN(SEQ) + #endif ++ #if defined(USE_SNDIO) ++ LINK_PLUGIN(SNDIO) ++ #endif + #if defined(__MINT__) + LINK_PLUGIN(STMIDI) + #endif Index: patches/patch-base_version_cpp =================================================================== RCS file: patches/patch-base_version_cpp diff -N patches/patch-base_version_cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-base_version_cpp 13 Apr 2012 08:48:34 -0000 @@ -0,0 +1,14 @@ +$OpenBSD$ +--- base/version.cpp.orig Wed Apr 11 15:32:53 2012 ++++ base/version.cpp Wed Apr 11 15:29:14 2012 +@@ -94,6 +94,10 @@ const char *gScummVMFeatures = "" + "SEQ " + #endif + ++#ifdef USE_SNDIO ++ "sndio " ++#endif ++ + #ifdef USE_TIMIDITY + "TiMidity " + #endif Index: patches/patch-configure =================================================================== RCS file: /cvs/ports/games/scummvm/patches/patch-configure,v retrieving revision 1.9 diff -u -p -r1.9 patch-configure --- patches/patch-configure 17 Feb 2012 06:59:41 -0000 1.9 +++ patches/patch-configure 13 Apr 2012 08:48:34 -0000 @@ -1,7 +1,36 @@ $OpenBSD: patch-configure,v 1.9 2012/02/17 06:59:41 jsg Exp $ ---- configure.orig Sun Jan 15 20:08:27 2012 -+++ configure Fri Feb 17 13:18:29 2012 -@@ -1613,21 +1613,6 @@ elif test "$have_icc" = yes ; then +--- configure.orig Sun Jan 15 10:08:27 2012 ++++ configure Wed Apr 11 19:02:04 2012 +@@ -134,6 +134,7 @@ _flac=auto + _mad=auto + _alsa=auto + _seq_midi=auto ++_sndio=auto + _timidity=auto + _zlib=auto + _sparkle=auto +@@ -879,6 +880,8 @@ for ac_option in $@; do + --disable-alsa) _alsa=no ;; + --enable-seq-midi) _seq_midi=yes ;; + --disable-seq-midi) _seq_midi=no ;; ++ --enable-sndio) _sndio=yes ;; ++ --disable-sndio) _sndio=no ;; + --enable-timidity) _timidity=yes ;; + --disable-timidity) _timidity=no ;; + --enable-vorbis) _vorbis=yes ;; +@@ -937,6 +940,11 @@ for ac_option in $@; do + ALSA_CFLAGS="-I$arg/include" + ALSA_LIBS="-L$arg/lib" + ;; ++ --with-sndio-prefix=*) ++ arg=`echo $ac_option | cut -d '=' -f 2` ++ SNDIO_CFLAGS="-I$arg/include" ++ SNDIO_LIBS="-L$arg/lib" ++ ;; + --with-ogg-prefix=*) + arg=`echo $ac_option | cut -d '=' -f 2` + OGG_CFLAGS="-I$arg/include" +@@ -1613,21 +1621,6 @@ elif test "$have_icc" = yes ; then add_line_to_config_mk 'CXX_UPDATE_DEP_FLAG = -MMD -MF "$(*D)/$(DEPDIR)/$(*F).d" -MQ "$@" -MP' fi; @@ -23,7 +52,7 @@ $OpenBSD: patch-configure,v 1.9 2012/02/ # If possible, we want to use -Wglobal-constructors # However, not all compilers support that, so check whether the active one does. echocheck "whether -Wglobal-constructors work" -@@ -3076,9 +3061,11 @@ EOF +@@ -3076,9 +3069,11 @@ EOF fi if test "$_flac" = yes ; then if test "$_vorbis" = yes ; then @@ -37,3 +66,28 @@ $OpenBSD: patch-configure,v 1.9 2012/02/ fi INCLUDES="$INCLUDES $FLAC_CFLAGS" fi +@@ -3205,6 +3200,24 @@ if test "$_seq_midi" = auto ; then + fi + define_in_config_h_if_yes "$_seq_midi" 'USE_SEQ_MIDI' + echo "$_seq_midi" ++ ++# ++# Check for sndio ++# ++echocheck "sndio" ++if test "$_sndio" = auto ; then ++ cat > $TMPC << EOF ++#include <sndio.h> ++int main(void) { struct sio_par par; sio_init(&par); return 0; } ++EOF ++ cc_check $SNDIO_CFLAGS $SNDIO_LIBS -lsndio && _sndio=yes ++fi ++if test "$_sndio" = yes ; then ++ LIBS="$LIBS $SNDIO_LIBS -lsndio" ++ INCLUDES="$INCLUDES $SNDIO_CFLAGS" ++fi ++define_in_config_h_if_yes "$_sndio" 'USE_SNDIO' ++echo "$_sndio" + + # + # Check for TiMidity(++)