ref: f26e260bbd9b31fafd7bbac1995e4538670cc214
parent: 1445d6595a19e1b46658beefe276840d01ac9c17
author: Simon Howard <[email protected]>
date: Sun Sep 7 20:23:46 EDT 2008
Split off some of the s_sound.c code into i_sound.c and reimplement the old low-level sound API as a thin wrapper around the module system. Decouple the low-level code from the high-level code. Subversion-branch: /branches/raven-branch Subversion-revision: 1212
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -35,6 +35,7 @@
i_joystick.c i_joystick.h \
i_scale.c i_scale.h \
i_swap.h \
+i_sound.c i_sound.h \
i_system.c i_system.h \
i_timer.c i_timer.h \
i_video.c i_video.h \
--- a/src/doom/sounds.h
+++ b/src/doom/sounds.h
@@ -28,68 +28,7 @@
#ifndef __SOUNDS__
#define __SOUNDS__
-
-//
-// SoundFX struct.
-//
-typedef struct sfxinfo_struct sfxinfo_t;
-
-struct sfxinfo_struct
-{
- // up to 6-character name
- char* name;
-
- // Sfx singularity (only one at a time)
- int singularity;
-
- // Sfx priority
- int priority;
-
- // referenced sound if a link
- sfxinfo_t* link;
-
- // pitch if a link
- int pitch;
-
- // volume if a link
- int volume;
-
- // sound data
- void* data;
-
- // this is checked every second to see if sound
- // can be thrown out (if 0, then decrement, if -1,
- // then throw out, if > 0, then it is in use)
- int usefulness;
-
- // lump number of sfx
- int lumpnum;
-};
-
-
-
-
-//
-// MusicInfo struct.
-//
-typedef struct
-{
- // up to 6-character name
- char* name;
-
- // lump number of music
- int lumpnum;
-
- // music data
- void* data;
-
- // music handle once registered
- void *handle;
-
-} musicinfo_t;
-
-
-
+#include "i_sound.h"
// the complete set of sound effects
extern sfxinfo_t S_sfx[];
--- a/src/i_pcsound.c
+++ b/src/i_pcsound.c
@@ -28,8 +28,7 @@
#include "doomtype.h"
#include "deh_str.h"
-#include "s_sound.h"
-#include "sounds.h"
+#include "i_sound.h"
#include "w_wad.h"
#include "z_zone.h"
@@ -102,7 +101,7 @@
SDL_UnlockMutex(sound_lock);
}
-static boolean CachePCSLump(int sound_id)
+static boolean CachePCSLump(sfxinfo_t *sfxinfo)
{
int lumplen;
int headerlen;
@@ -117,8 +116,8 @@
// Load from WAD
- current_sound_lump = W_CacheLumpNum(S_sfx[sound_id].lumpnum, PU_STATIC);
- lumplen = W_LumpLength(S_sfx[sound_id].lumpnum);
+ current_sound_lump = W_CacheLumpNum(sfxinfo->lumpnum, PU_STATIC);
+ lumplen = W_LumpLength(sfxinfo->lumpnum);
// Read header
@@ -138,12 +137,12 @@
current_sound_remaining = headerlen;
current_sound_pos = current_sound_lump + 4;
- current_sound_lump_num = S_sfx[sound_id].lumpnum;
+ current_sound_lump_num = sfxinfo->lumpnum;
return true;
}
-static int I_PCS_StartSound(int id,
+static int I_PCS_StartSound(sfxinfo_t *sfxinfo,
int channel,
int vol,
int sep)
@@ -155,6 +154,7 @@
return -1;
}
+/* TODO
// These PC speaker sounds are not played - this can be seen in the
// Heretic source code, where there are remnants of this left over
// from Doom.
@@ -164,6 +164,7 @@
{
return -1;
}
+ */
if (SDL_LockMutex(sound_lock) < 0)
{
@@ -170,7 +171,7 @@
return -1;
}
- result = CachePCSLump(id);
+ result = CachePCSLump(sfxinfo);
if (result)
{
--- a/src/i_sdlmusic.c
+++ b/src/i_sdlmusic.c
@@ -154,7 +154,7 @@
// Start playing a mid
-static void I_SDL_PlaySong(void *handle, int looping)
+static void I_SDL_PlaySong(void *handle, boolean looping)
{
Mix_Music *music = (Mix_Music *) handle;
int loops;
--- a/src/i_sdlsound.c
+++ b/src/i_sdlsound.c
@@ -40,8 +40,8 @@
#include "deh_str.h"
#include "i_system.h"
-#include "s_sound.h"
#include "m_argv.h"
+#include "sounds.h"
#include "w_wad.h"
#include "z_zone.h"
@@ -53,7 +53,7 @@
static boolean sound_initialised = false;
static Mix_Chunk sound_chunks[NUMSFX];
-static int channels_playing[NUM_CHANNELS];
+static sfxinfo_t *channels_playing[NUM_CHANNELS];
static int mixer_freq;
static Uint16 mixer_format;
@@ -70,25 +70,27 @@
static void ReleaseSoundOnChannel(int channel)
{
int i;
- int id = channels_playing[channel];
+ sfxinfo_t *sfxinfo = channels_playing[channel];
+ int id;
- if (!id)
+ if (sfxinfo == NULL)
{
return;
}
- channels_playing[channel] = sfx_None;
+ channels_playing[channel] = NULL;
for (i=0; i<NUM_CHANNELS; ++i)
{
// Playing on this channel? if so, don't release.
- if (channels_playing[i] == id)
+ if (channels_playing[i] == sfxinfo)
return;
}
// Not used on any channel, and can be safely released
-
+ // TODO
+ id = sfxinfo - S_sfx;
Z_ChangeTag(sound_chunks[id].abuf, PU_CACHE);
}
@@ -351,7 +353,7 @@
// Load and convert a sound effect
// Returns true if successful
-static boolean CacheSFX(int sound)
+static boolean CacheSFX(sfxinfo_t *sfxinfo)
{
int lumpnum;
unsigned int lumplen;
@@ -358,11 +360,12 @@
int samplerate;
int clipped;
unsigned int length;
+ int sound_id;
byte *data;
// need to load the sound
- lumpnum = S_sfx[sound].lumpnum;
+ lumpnum = sfxinfo->lumpnum;
data = W_CacheLumpNum(lumpnum, PU_STATIC);
lumplen = W_LumpLength(lumpnum);
@@ -393,19 +396,20 @@
// DWF 2008-02-10: sound_chunks[sound].alen and abuf are determined
// by ExpandSoundData.
- sound_chunks[sound].allocated = 1;
- sound_chunks[sound].volume = MIX_MAX_VOLUME;
+ sound_id = sfxinfo - S_sfx;
+ sound_chunks[sound_id].allocated = 1;
+ sound_chunks[sound_id].volume = MIX_MAX_VOLUME;
clipped = ExpandSoundData(data + 8,
samplerate,
length,
- &sound_chunks[sound]);
+ &sound_chunks[sound_id]);
if (clipped)
{
fprintf(stderr, "Sound %d: clipped %u samples (%0.2f %%)\n",
- sound, clipped,
- 400.0 * clipped / sound_chunks[sound].alen);
+ sound_id, clipped,
+ 400.0 * clipped / sound_chunks[sound_id].alen);
}
// don't need the original lump any more
@@ -440,7 +444,7 @@
if (S_sfx[i].lumpnum != -1)
{
- CacheSFX(i);
+ CacheSFX(&S_sfx[i]);
if (sound_chunks[i].abuf != NULL)
{
@@ -454,11 +458,15 @@
#endif
-static Mix_Chunk *GetSFXChunk(int sound_id)
+static Mix_Chunk *GetSFXChunk(sfxinfo_t *sfxinfo)
{
+ int sound_id;
+
+ sound_id = sfxinfo - S_sfx;
+
if (sound_chunks[sound_id].abuf == NULL)
{
- if (!CacheSFX(sound_id))
+ if (!CacheSFX(sfxinfo))
return NULL;
}
else
@@ -515,7 +523,7 @@
// is set, but currently not used by mixing.
//
-static int I_SDL_StartSound(int id, int channel, int vol, int sep)
+static int I_SDL_StartSound(sfxinfo_t *sfxinfo, int channel, int vol, int sep)
{
Mix_Chunk *chunk;
@@ -531,7 +539,7 @@
// Get the sound data
- chunk = GetSFXChunk(id);
+ chunk = GetSFXChunk(sfxinfo);
if (chunk == NULL)
{
@@ -542,7 +550,7 @@
Mix_PlayChannelTimed(channel, chunk, 0, -1);
- channels_playing[channel] = id;
+ channels_playing[channel] = sfxinfo;
// set separation, etc.
--- /dev/null
+++ b/src/i_sound.c
@@ -1,0 +1,358 @@
+// 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: none
+//
+//-----------------------------------------------------------------------------
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "config.h"
+#include "doomfeatures.h"
+#include "doomtype.h"
+
+#include "i_sound.h"
+#include "i_video.h"
+#include "m_argv.h"
+
+// Disable music on OSX by default; there are problems with SDL_mixer.
+
+#ifndef __APPLE__
+#define DEFAULT_MUSIC_DEVICE SNDDEVICE_SB
+#else
+#define DEFAULT_MUSIC_DEVICE SNDDEVICE_NONE
+#endif
+
+// Low-level sound and music modules we are using
+
+static sound_module_t *sound_module;
+static music_module_t *music_module;
+
+int snd_musicdevice = DEFAULT_MUSIC_DEVICE;
+int snd_sfxdevice = SNDDEVICE_SB;
+
+// Sound modules
+
+extern sound_module_t sound_sdl_module;
+extern sound_module_t sound_pcsound_module;
+extern music_module_t music_sdl_module;
+
+// Compiled-in sound modules:
+
+static sound_module_t *sound_modules[] =
+{
+#ifdef FEATURE_SOUND
+ &sound_sdl_module,
+ &sound_pcsound_module,
+#endif
+ NULL,
+};
+
+// Compiled-in music modules:
+
+static music_module_t *music_modules[] =
+{
+#ifdef FEATURE_SOUND
+ &music_sdl_module,
+#endif
+ NULL,
+};
+
+// Check if a sound device is in the given list of devices
+
+static boolean SndDeviceInList(snddevice_t device, snddevice_t *list,
+ int len)
+{
+ int i;
+
+ for (i=0; i<len; ++i)
+ {
+ if (device == list[i])
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// Find and initialise a sound_module_t appropriate for the setting
+// in snd_sfxdevice.
+
+static void InitSfxModule(void)
+{
+ int i;
+
+ sound_module = NULL;
+
+ for (i=0; sound_modules[i] != NULL; ++i)
+ {
+ // Is the sfx device in the list of devices supported by
+ // this module?
+
+ if (SndDeviceInList(snd_sfxdevice,
+ sound_modules[i]->sound_devices,
+ sound_modules[i]->num_sound_devices))
+ {
+ // Initialise the module
+
+ if (sound_modules[i]->Init())
+ {
+ sound_module = sound_modules[i];
+ return;
+ }
+ }
+ }
+}
+
+// Initialise music according to snd_musicdevice.
+
+static void InitMusicModule(void)
+{
+ int i;
+
+ music_module = NULL;
+
+ for (i=0; music_modules[i] != NULL; ++i)
+ {
+ // Is the music device in the list of devices supported
+ // by this module?
+
+ if (SndDeviceInList(snd_musicdevice,
+ music_modules[i]->sound_devices,
+ music_modules[i]->num_sound_devices))
+ {
+ // Initialise the module
+
+ if (music_modules[i]->Init())
+ {
+ music_module = music_modules[i];
+ return;
+ }
+ }
+ }
+}
+
+//
+// Initializes sound stuff, including volume
+// Sets channels, SFX and music volume,
+// allocates channel buffer, sets S_sfx lookup.
+//
+
+void I_InitSound(void)
+{
+ boolean nosound, nosfx, nomusic;
+
+ //!
+ // @vanilla
+ //
+ // Disable all sound output.
+ //
+
+ nosound = M_CheckParm("-nosound") > 0;
+
+ //!
+ // @vanilla
+ //
+ // Disable sound effects.
+ //
+
+ nosfx = M_CheckParm("-nosfx") > 0;
+
+ //!
+ // @vanilla
+ //
+ // Disable music.
+ //
+
+ nomusic = M_CheckParm("-nomusic") > 0;
+
+ // Initialise the sound and music subsystems.
+
+ if (!nosound && !screensaver_mode)
+ {
+ if (!nosfx)
+ {
+ InitSfxModule();
+ }
+
+ if (!nomusic)
+ {
+ InitMusicModule();
+ }
+ }
+}
+
+void I_ShutdownSound(void)
+{
+ if (sound_module != NULL)
+ {
+ sound_module->Shutdown();
+ }
+
+ if (music_module != NULL)
+ {
+ music_module->Shutdown();
+ }
+}
+
+int I_GetSfxLumpNum(sfxinfo_t *sfxinfo)
+{
+ if (sound_module != NULL)
+ {
+ return sound_module->GetSfxLumpNum(sfxinfo);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+void I_UpdateSound(void)
+{
+ if (sound_module != NULL)
+ {
+ sound_module->Update();
+ }
+}
+
+void I_UpdateSoundParams(int channel, int vol, int sep)
+{
+ if (sound_module != NULL)
+ {
+ sound_module->UpdateSoundParams(channel, vol, sep);
+ }
+}
+
+int I_StartSound(sfxinfo_t *sfxinfo, int channel, int vol, int sep)
+{
+ if (sound_module != NULL)
+ {
+ return sound_module->StartSound(sfxinfo, channel, vol, sep);
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+void I_StopSound(int channel)
+{
+ if (sound_module != NULL)
+ {
+ sound_module->StopSound(channel);
+ }
+}
+
+boolean I_SoundIsPlaying(int channel)
+{
+ if (sound_module != NULL)
+ {
+ return sound_module->SoundIsPlaying(channel);
+ }
+ else
+ {
+ return false;
+ }
+}
+
+void I_InitMusic(void)
+{
+}
+
+void I_ShutdownMusic(void)
+{
+
+}
+
+void I_SetMusicVolume(int volume)
+{
+ if (music_module != NULL)
+ {
+ music_module->SetMusicVolume(volume);
+ }
+}
+
+void I_PauseSong(void)
+{
+ if (music_module != NULL)
+ {
+ music_module->PauseMusic();
+ }
+}
+
+void I_ResumeSong(void)
+{
+ if (music_module != NULL)
+ {
+ music_module->ResumeMusic();
+ }
+}
+
+void *I_RegisterSong(void *data, int len)
+{
+ if (music_module != NULL)
+ {
+ return music_module->RegisterSong(data, len);
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+void I_UnRegisterSong(void *handle)
+{
+ if (music_module != NULL)
+ {
+ music_module->UnRegisterSong(handle);
+ }
+}
+
+void I_PlaySong(void *handle, boolean looping)
+{
+ if (music_module != NULL)
+ {
+ music_module->PlaySong(handle, looping);
+ }
+}
+
+void I_StopSong(void)
+{
+ if (music_module != NULL)
+ {
+ music_module->StopSong();
+ }
+}
+
+boolean I_MusicIsPlaying(void)
+{
+ if (music_module != NULL)
+ {
+ return music_module->MusicIsPlaying();
+ }
+ else
+ {
+ return false;
+ }
+}
+
--- /dev/null
+++ b/src/i_sound.h
@@ -1,0 +1,225 @@
+// 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:
+// The not so system specific sound interface.
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __I_SOUND__
+#define __I_SOUND__
+
+#include "doomtype.h"
+
+
+//
+// SoundFX struct.
+//
+typedef struct sfxinfo_struct sfxinfo_t;
+
+struct sfxinfo_struct
+{
+ // up to 6-character name
+ char *name;
+
+ // Sfx singularity (only one at a time)
+ int singularity;
+
+ // Sfx priority
+ int priority;
+
+ // referenced sound if a link
+ sfxinfo_t *link;
+
+ // pitch if a link
+ int pitch;
+
+ // volume if a link
+ int volume;
+
+ // sound data
+ void *data;
+
+ // this is checked every second to see if sound
+ // can be thrown out (if 0, then decrement, if -1,
+ // then throw out, if > 0, then it is in use)
+ int usefulness;
+
+ // lump number of sfx
+ int lumpnum;
+};
+
+//
+// MusicInfo struct.
+//
+typedef struct
+{
+ // up to 6-character name
+ char *name;
+
+ // lump number of music
+ int lumpnum;
+
+ // music data
+ void *data;
+
+ // music handle once registered
+ void *handle;
+
+} musicinfo_t;
+
+typedef enum
+{
+ SNDDEVICE_NONE = 0,
+ SNDDEVICE_PCSPEAKER = 1,
+ SNDDEVICE_ADLIB = 2,
+ SNDDEVICE_SB = 3,
+ SNDDEVICE_PAS = 4,
+ SNDDEVICE_GUS = 5,
+ SNDDEVICE_WAVEBLASTER = 6,
+ SNDDEVICE_SOUNDCANVAS = 7,
+ SNDDEVICE_GENMIDI = 8,
+ SNDDEVICE_AWE32 = 9,
+} snddevice_t;
+
+// Interface for sound modules
+
+typedef struct
+{
+ // List of sound devices that this sound module is used for.
+
+ snddevice_t *sound_devices;
+ int num_sound_devices;
+
+ // Initialise sound module
+ // Returns true if successfully initialised
+
+ boolean (*Init)(void);
+
+ // Shutdown sound module
+
+ void (*Shutdown)(void);
+
+ // Returns the lump index of the given sound.
+
+ int (*GetSfxLumpNum)(sfxinfo_t *sfxinfo);
+
+ // Called periodically to update the subsystem.
+
+ void (*Update)(void);
+
+ // Update the sound settings on the given channel.
+
+ void (*UpdateSoundParams)(int channel, int vol, int sep);
+
+ // Start a sound on a given channel. Returns the channel id
+ // or -1 on failure.
+
+ int (*StartSound)(sfxinfo_t *sfxinfo, int channel, int vol, int sep);
+
+ // Stop the sound playing on the given channel.
+
+ void (*StopSound)(int channel);
+
+ // Query if a sound is playing on the given channel
+
+ boolean (*SoundIsPlaying)(int channel);
+
+} sound_module_t;
+
+void I_InitSound(void);
+void I_ShutdownSound(void);
+int I_GetSfxLumpNum(sfxinfo_t *sfxinfo);
+void I_UpdateSound(void);
+void I_UpdateSoundParams(int channel, int vol, int sep);
+int I_StartSound(sfxinfo_t *sfxinfo, int channel, int vol, int sep);
+void I_StopSound(int channel);
+boolean I_SoundIsPlaying(int channel);
+
+// Interface for music modules
+
+typedef struct
+{
+ // List of sound devices that this music module is used for.
+
+ snddevice_t *sound_devices;
+ int num_sound_devices;
+
+ // Initialise the music subsystem
+
+ boolean (*Init)(void);
+
+ // Shutdown the music subsystem
+
+ void (*Shutdown)(void);
+
+ // Set music volume - range 0-127
+
+ void (*SetMusicVolume)(int volume);
+
+ // Pause music
+
+ void (*PauseMusic)(void);
+
+ // Un-pause music
+
+ void (*ResumeMusic)(void);
+
+ // Register a song handle from data
+ // Returns a handle that can be used to play the song
+
+ void *(*RegisterSong)(void *data, int len);
+
+ // Un-register (free) song data
+
+ void (*UnRegisterSong)(void *handle);
+
+ // Play the song
+
+ void (*PlaySong)(void *handle, boolean looping);
+
+ // Stop playing the current song.
+
+ void (*StopSong)(void);
+
+ // Query if music is playing.
+
+ boolean (*MusicIsPlaying)(void);
+} music_module_t;
+
+void I_InitMusic(void);
+void I_ShutdownMusic(void);
+void I_SetMusicVolume(int volume);
+void I_PauseSong(void);
+void I_ResumeSong(void);
+void *I_RegisterSong(void *data, int len);
+void I_UnRegisterSong(void *handle);
+void I_PlaySong(void *handle, boolean looping);
+void I_StopSong(void);
+boolean I_MusicIsPlaying(void);
+
+extern int snd_sfxdevice;
+extern int snd_musicdevice;
+extern int snd_samplerate;
+
+#endif
+
--- a/src/s_sound.c
+++ b/src/s_sound.c
@@ -26,6 +26,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include "i_sound.h"
#include "i_system.h"
#include "doomfeatures.h"
@@ -69,14 +70,6 @@
#define NORM_PRIORITY 64
#define NORM_SEP 128
-// Disable music on OSX by default; there are problems with SDL_mixer.
-
-#ifndef __APPLE__
-#define DEFAULT_MUSIC_DEVICE SNDDEVICE_SB
-#else
-#define DEFAULT_MUSIC_DEVICE SNDDEVICE_NONE
-#endif
-
typedef struct
{
// sound information (if null, channel avail.)
@@ -90,11 +83,6 @@
} channel_t;
-// Low-level sound and music modules we are using
-
-static sound_module_t *sound_module;
-static music_module_t *music_module;
-
// The set of channels available
static channel_t *channels;
@@ -128,111 +116,6 @@
int numChannels = 8;
-int snd_musicdevice = DEFAULT_MUSIC_DEVICE;
-int snd_sfxdevice = SNDDEVICE_SB;
-
-// Sound modules
-
-extern sound_module_t sound_sdl_module;
-extern sound_module_t sound_pcsound_module;
-extern music_module_t music_sdl_module;
-
-// Compiled-in sound modules:
-
-static sound_module_t *sound_modules[] =
-{
-#ifdef FEATURE_SOUND
- &sound_sdl_module,
- &sound_pcsound_module,
-#endif
- NULL,
-};
-
-// Compiled-in music modules:
-
-static music_module_t *music_modules[] =
-{
-#ifdef FEATURE_SOUND
- &music_sdl_module,
-#endif
- NULL,
-};
-
-// Check if a sound device is in the given list of devices
-
-static boolean SndDeviceInList(snddevice_t device, snddevice_t *list,
- int len)
-{
- int i;
-
- for (i=0; i<len; ++i)
- {
- if (device == list[i])
- {
- return true;
- }
- }
-
- return false;
-}
-
-// Find and initialise a sound_module_t appropriate for the setting
-// in snd_sfxdevice.
-
-static void InitSfxModule(void)
-{
- int i;
-
- sound_module = NULL;
-
- for (i=0; sound_modules[i] != NULL; ++i)
- {
- // Is the sfx device in the list of devices supported by
- // this module?
-
- if (SndDeviceInList(snd_sfxdevice,
- sound_modules[i]->sound_devices,
- sound_modules[i]->num_sound_devices))
- {
- // Initialise the module
-
- if (sound_modules[i]->Init())
- {
- sound_module = sound_modules[i];
- return;
- }
- }
- }
-}
-
-// Initialise music according to snd_musicdevice.
-
-static void InitMusicModule(void)
-{
- int i;
-
- music_module = NULL;
-
- for (i=0; music_modules[i] != NULL; ++i)
- {
- // Is the music device in the list of devices supported
- // by this module?
-
- if (SndDeviceInList(snd_musicdevice,
- music_modules[i]->sound_devices,
- music_modules[i]->num_sound_devices))
- {
- // Initialise the module
-
- if (music_modules[i]->Init())
- {
- music_module = music_modules[i];
- return;
- }
- }
- }
-}
-
//
// Initializes sound stuff, including volume
// Sets channels, SFX and music volume,
@@ -241,48 +124,11 @@
void S_Init(int sfxVolume, int musicVolume)
{
- boolean nosound, nosfx, nomusic;
int i;
- //!
- // @vanilla
- //
- // Disable all sound output.
- //
+ I_InitSound();
+ I_InitMusic();
- nosound = M_CheckParm("-nosound") > 0;
-
- //!
- // @vanilla
- //
- // Disable sound effects.
- //
-
- nosfx = M_CheckParm("-nosfx") > 0;
-
- //!
- // @vanilla
- //
- // Disable music.
- //
-
- nomusic = M_CheckParm("-nomusic") > 0;
-
- // Initialise the sound and music subsystems.
-
- if (!nosound && !screensaver_mode)
- {
- if (!nosfx)
- {
- InitSfxModule();
- }
-
- if (!nomusic)
- {
- InitMusicModule();
- }
- }
-
S_SetSfxVolume(sfxVolume);
S_SetMusicVolume(musicVolume);
@@ -309,15 +155,8 @@
void S_Shutdown(void)
{
- if (sound_module != NULL)
- {
- sound_module->Shutdown();
- }
-
- if (music_module != NULL)
- {
- music_module->Shutdown();
- }
+ I_ShutdownSound();
+ I_ShutdownMusic();
}
static void S_StopChannel(int cnum)
@@ -331,12 +170,9 @@
{
// stop the sound playing
- if (sound_module != NULL)
+ if (I_SoundIsPlaying(c->handle))
{
- if (sound_module->SoundIsPlaying(c->handle))
- {
- sound_module->StopSound(c->handle);
- }
+ I_StopSound(c->handle);
}
// check to see if other channels are playing the sound
@@ -647,23 +483,12 @@
sfx->usefulness = 1;
}
- if (sound_module != NULL)
+ if (sfx->lumpnum < 0)
{
- // Get lumpnum if necessary
-
- if (sfx->lumpnum < 0)
- {
- sfx->lumpnum = sound_module->GetSfxLumpNum(sfx);
- }
-
- // Assigns the handle to one of the channels in the
- // mix/output buffer.
-
- channels[cnum].handle = sound_module->StartSound(sfx_id,
- cnum,
- volume,
- sep);
+ sfx->lumpnum = I_GetSfxLumpNum(sfx);
}
+
+ channels[cnum].handle = I_StartSound(sfx, cnum, volume, sep);
}
//
@@ -674,10 +499,7 @@
{
if (mus_playing && !mus_paused)
{
- if (music_module != NULL)
- {
- music_module->PauseMusic();
- }
+ I_PauseSong();
mus_paused = true;
}
}
@@ -686,10 +508,7 @@
{
if (mus_playing && mus_paused)
{
- if (music_module != NULL)
- {
- music_module->ResumeMusic();
- }
+ I_ResumeSong();
mus_paused = false;
}
}
@@ -714,7 +533,7 @@
if (c->sfxinfo)
{
- if (sound_module != NULL && sound_module->SoundIsPlaying(c->handle))
+ if (I_SoundIsPlaying(c->handle))
{
// initialize parameters
volume = snd_SfxVolume;
@@ -749,7 +568,7 @@
}
else
{
- sound_module->UpdateSoundParams(c->handle, volume, sep);
+ I_UpdateSoundParams(c->handle, volume, sep);
}
}
}
@@ -771,10 +590,7 @@
volume);
}
- if (music_module != NULL)
- {
- music_module->SetMusicVolume(volume);
- }
+ I_SetMusicVolume(volume);
}
void S_SetSfxVolume(int volume)
@@ -826,33 +642,18 @@
music->lumpnum = W_GetNumForName(namebuf);
}
- if (music_module != NULL)
- {
- // Load & register it
+ music->data = W_CacheLumpNum(music->lumpnum, PU_STATIC);
- music->data = W_CacheLumpNum(music->lumpnum, PU_STATIC);
- handle = music_module->RegisterSong(music->data,
- W_LumpLength(music->lumpnum));
- music->handle = handle;
+ handle = I_RegisterSong(music->data, W_LumpLength(music->lumpnum));
+ music->handle = handle;
+ I_PlaySong(handle, looping);
- // Play it
-
- music_module->PlaySong(handle, looping);
- }
-
mus_playing = music;
}
boolean S_MusicPlaying(void)
{
- if (music_module != NULL)
- {
- return music_module->MusicIsPlaying();
- }
- else
- {
- return false;
- }
+ return I_MusicIsPlaying();
}
void S_StopMusic(void)
@@ -859,20 +660,15 @@
{
if (mus_playing)
{
- if (music_module != NULL)
+ if (mus_paused)
{
- if (mus_paused)
- {
- music_module->ResumeMusic();
- }
-
- music_module->StopSong();
- music_module->UnRegisterSong(mus_playing->handle);
- W_ReleaseLumpNum(mus_playing->lumpnum);
-
- mus_playing->data = NULL;
+ I_ResumeSong();
}
+ I_StopSong();
+ I_UnRegisterSong(mus_playing->handle);
+ W_ReleaseLumpNum(mus_playing->lumpnum);
+ mus_playing->data = NULL;
mus_playing = NULL;
}
}
--- a/src/s_sound.h
+++ b/src/s_sound.h
@@ -31,120 +31,6 @@
#include "p_mobj.h"
#include "sounds.h"
-typedef enum
-{
- SNDDEVICE_NONE = 0,
- SNDDEVICE_PCSPEAKER = 1,
- SNDDEVICE_ADLIB = 2,
- SNDDEVICE_SB = 3,
- SNDDEVICE_PAS = 4,
- SNDDEVICE_GUS = 5,
- SNDDEVICE_WAVEBLASTER = 6,
- SNDDEVICE_SOUNDCANVAS = 7,
- SNDDEVICE_GENMIDI = 8,
- SNDDEVICE_AWE32 = 9,
-} snddevice_t;
-
-// Interface for sound modules
-
-typedef struct
-{
- // List of sound devices that this sound module is used for.
-
- snddevice_t *sound_devices;
- int num_sound_devices;
-
- // Initialise sound module
- // Returns true if successfully initialised
-
- boolean (*Init)(void);
-
- // Shutdown sound module
-
- void (*Shutdown)(void);
-
- // Returns the lump index of the given sound.
-
- int (*GetSfxLumpNum)(sfxinfo_t *sfxinfo);
-
- // Called periodically to update the subsystem.
-
- void (*Update)(void);
-
- // Update the sound settings on the given channel.
-
- void (*UpdateSoundParams)(int channel, int vol, int sep);
-
- // Start a sound on a given channel. Returns the channel id
- // or -1 on failure.
-
- int (*StartSound)(int id, int channel, int vol, int sep);
-
- // Stop the sound playing on the given channel.
-
- void (*StopSound)(int channel);
-
- // Query if a sound is playing on the given channel
-
- boolean (*SoundIsPlaying)(int channel);
-
-} sound_module_t;
-
-// Interface for music modules
-
-typedef struct
-{
- // List of sound devices that this music module is used for.
-
- snddevice_t *sound_devices;
- int num_sound_devices;
-
- // Initialise the music subsystem
-
- boolean (*Init)(void);
-
- // Shutdown the music subsystem
-
- void (*Shutdown)(void);
-
- // Set music volume - range 0-127
-
- void (*SetMusicVolume)(int volume);
-
- // Pause music
-
- void (*PauseMusic)(void);
-
- // Un-pause music
-
- void (*ResumeMusic)(void);
-
- // Register a song handle from data
- // Returns a handle that can be used to play the song
-
- void *(*RegisterSong)(void *data, int len);
-
- // Un-register (free) song data
-
- void (*UnRegisterSong)(void *handle);
-
- // Play the song
-
- void (*PlaySong)(void *handle, int looping);
-
- // Stop playing the current song.
-
- void (*StopSong)(void);
-
- // Query if music is playing.
-
- boolean (*MusicIsPlaying)(void);
-} music_module_t;
-
-extern int snd_sfxdevice;
-extern int snd_musicdevice;
-extern int snd_samplerate;
-
//
// Initializes sound stuff, including volume
// Sets channels, SFX and music volume,