shithub: choc

Download patch

ref: 997d2ee86ef77422ce7ddd08859bd5a4aef66145
parent: 4422bbf9815ec42402d0235845a8fd33afd792b2
author: Simon Howard <fraggle@gmail.com>
date: Wed Mar 4 17:07:27 EST 2009

Add initial stub for OPL backend.

Subversion-branch: /branches/opl-branch
Subversion-revision: 1447

--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -155,6 +155,7 @@
 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 @@
 chocolate_doom_LDADD =                               \
                        ../textscreen/libtextscreen.a \
                        ../pcsound/libpcsound.a       \
+                       ../opl/libopl.a               \
                        @LDFLAGS@                     \
                        @SDLMIXER_LIBS@               \
                        @SDLNET_LIBS@
--- /dev/null
+++ b/src/i_oplmusic.c
@@ -1,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,
+};
+
--- a/src/i_sdlmusic.c
+++ b/src/i_sdlmusic.c
@@ -324,8 +324,6 @@
 
 static snddevice_t music_sdl_devices[] =
 {
-    SNDDEVICE_ADLIB,
-    SNDDEVICE_SB,
     SNDDEVICE_PAS,
     SNDDEVICE_GUS,
     SNDDEVICE_WAVEBLASTER,
--- a/src/s_sound.c
+++ b/src/s_sound.c
@@ -136,6 +136,7 @@
 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 @@
 {
 #ifdef FEATURE_SOUND
     &music_sdl_module,
+    &music_opl_module,
 #endif
     NULL,
 };