OSEC

Neohapsis is currently accepting applications for employment. For more information, please visit our website www.neohapsis.com or email hr@neohapsis.com
Re: games/scummvm: use sndio for midi

From: Alexandre Ratchov (alexcaoua.org)
Date: Fri Apr 13 2012 - 03:49:40 CDT


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(++)