foxygit / doom Log in
commit 997d2ee86ef77422ce7ddd08859bd5a4aef66145
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Wed Mar 4 22:07:27 2009 +0000
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Wed Mar 4 22:07:27 2009 +0000

    Add initial stub for OPL backend.

    Subversion-branch: /branches/opl-branch
    Subversion-revision: 1447
---
 src/Makefile.am  |   2 +
 src/i_oplmusic.c | 214 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/i_sdlmusic.c |   2 -
 src/s_sound.c    |   2 +
 4 files changed, 218 insertions(+), 2 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am
index 63ddc98f..66909dd1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -155,6 +155,7 @@ FEATURE_SOUND_SOURCE_FILES =               \
 i_pcsound.c                                \
 i_sdlsound.c                               \
 i_sdlmusic.c                               \
+i_oplmusic.c                               \
 mus2mid.c            mus2mid.h

 SOURCE_FILES = $(MAIN_SOURCE_FILES)                \
@@ -172,6 +173,7 @@ endif
 chocolate_doom_LDADD =                               \
                        ../textscreen/libtextscreen.a \
                        ../pcsound/libpcsound.a       \
+                       ../opl/libopl.a               \
                        @LDFLAGS@                     \
                        @SDLMIXER_LIBS@               \
                        @SDLNET_LIBS@
diff --git a/src/i_oplmusic.c b/src/i_oplmusic.c
new file mode 100644
index 00000000..ee909193
--- /dev/null
+++ b/src/i_oplmusic.c
@@ -0,0 +1,214 @@
+// Emacs style mode select   -*- C++ -*-
+//-----------------------------------------------------------------------------
+//
+// Copyright(C) 1993-1996 Id Software, Inc.
+// Copyright(C) 2005 Simon Howard
+//
+// 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., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA.
+//
+// DESCRIPTION:
+//	System interface for music.
+//
+//-----------------------------------------------------------------------------
+
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "doomdef.h"
+#include "memio.h"
+#include "mus2mid.h"
+
+#include "deh_main.h"
+#include "m_misc.h"
+#include "s_sound.h"
+#include "w_wad.h"
+#include "z_zone.h"
+
+#define MAXMIDLENGTH (96 * 1024)
+
+static boolean music_initialised = false;
+
+//static boolean musicpaused = false;
+static int current_music_volume;
+
+// Shutdown music
+
+static void I_OPL_ShutdownMusic(void)
+{
+}
+
+// Initialise music subsystem
+
+static boolean I_OPL_InitMusic(void)
+{
+    music_initialised = true;
+
+    return true;
+}
+
+// Set music volume (0 - 127)
+
+static void I_OPL_SetMusicVolume(int volume)
+{
+    // Internal state variable.
+    current_music_volume = volume;
+}
+
+// Start playing a mid
+
+static void I_OPL_PlaySong(void *handle, int looping)
+{
+    if (!music_initialised)
+    {
+        return;
+    }
+}
+
+static void I_OPL_PauseSong(void)
+{
+    if (!music_initialised)
+    {
+        return;
+    }
+}
+
+static void I_OPL_ResumeSong(void)
+{
+    if (!music_initialised)
+    {
+        return;
+    }
+}
+
+static void I_OPL_StopSong(void)
+{
+    if (!music_initialised)
+    {
+        return;
+    }
+}
+
+static void I_OPL_UnRegisterSong(void *handle)
+{
+    if (!music_initialised)
+    {
+        return;
+    }
+}
+
+// Determine whether memory block is a .mid file
+
+static boolean IsMid(byte *mem, int len)
+{
+    return len > 4 && !memcmp(mem, "MThd", 4);
+}
+
+static boolean ConvertMus(byte *musdata, int len, char *filename)
+{
+    MEMFILE *instream;
+    MEMFILE *outstream;
+    void *outbuf;
+    size_t outbuf_len;
+    int result;
+
+    instream = mem_fopen_read(musdata, len);
+    outstream = mem_fopen_write();
+
+    result = mus2mid(instream, outstream);
+
+    if (result == 0)
+    {
+        mem_get_buf(outstream, &outbuf, &outbuf_len);
+
+        M_WriteFile(filename, outbuf, outbuf_len);
+    }
+
+    mem_fclose(instream);
+    mem_fclose(outstream);
+
+    return result;
+}
+
+static void *I_OPL_RegisterSong(void *data, int len)
+{
+    char *filename;
+
+    if (!music_initialised)
+    {
+        return NULL;
+    }
+
+    // MUS files begin with "MUS"
+    // Reject anything which doesnt have this signature
+
+    filename = M_TempFile("doom.mid");
+
+    if (IsMid(data, len) && len < MAXMIDLENGTH)
+    {
+        M_WriteFile(filename, data, len);
+    }
+    else
+    {
+	// Assume a MUS file and try to convert
+
+        ConvertMus(data, len, filename);
+    }
+
+    // ....
+
+    // remove file now
+
+    remove(filename);
+
+    Z_Free(filename);
+
+    return NULL;
+}
+
+// Is the song playing?
+static boolean I_OPL_MusicIsPlaying(void)
+{
+    if (!music_initialised)
+    {
+        return false;
+    }
+
+    return false;
+}
+
+static snddevice_t music_opl_devices[] =
+{
+    SNDDEVICE_ADLIB,
+    SNDDEVICE_SB,
+};
+
+music_module_t music_opl_module =
+{
+    music_opl_devices,
+    arrlen(music_opl_devices),
+    I_OPL_InitMusic,
+    I_OPL_ShutdownMusic,
+    I_OPL_SetMusicVolume,
+    I_OPL_PauseSong,
+    I_OPL_ResumeSong,
+    I_OPL_RegisterSong,
+    I_OPL_UnRegisterSong,
+    I_OPL_PlaySong,
+    I_OPL_StopSong,
+    I_OPL_MusicIsPlaying,
+};
+
diff --git a/src/i_sdlmusic.c b/src/i_sdlmusic.c
index 313e2a58..c1ab340b 100644
--- a/src/i_sdlmusic.c
+++ b/src/i_sdlmusic.c
@@ -324,8 +324,6 @@ static boolean I_SDL_MusicIsPlaying(void)

 static snddevice_t music_sdl_devices[] =
 {
-    SNDDEVICE_ADLIB,
-    SNDDEVICE_SB,
     SNDDEVICE_PAS,
     SNDDEVICE_GUS,
     SNDDEVICE_WAVEBLASTER,
diff --git a/src/s_sound.c b/src/s_sound.c
index 70fa75f3..f038e9cd 100644
--- a/src/s_sound.c
+++ b/src/s_sound.c
@@ -136,6 +136,7 @@ int snd_sfxdevice = SNDDEVICE_SB;
 extern sound_module_t sound_sdl_module;
 extern sound_module_t sound_pcsound_module;
 extern music_module_t music_sdl_module;
+extern music_module_t music_opl_module;

 // Compiled-in sound modules:

@@ -154,6 +155,7 @@ static music_module_t *music_modules[] =
 {
 #ifdef FEATURE_SOUND
     &music_sdl_module,
+    &music_opl_module,
 #endif
     NULL,
 };