mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-10 23:02:03 +00:00
- added stripped down SNDINFO parser so that the music related settings can be specified.
This commit is contained in:
parent
cee5891409
commit
0f2c4f7760
3 changed files with 211 additions and 1 deletions
|
@ -812,7 +812,7 @@ set (PCH_SOURCES
|
|||
common/music/i_soundfont.cpp
|
||||
common/music/music_config.cpp
|
||||
common/music/music_midi_base.cpp
|
||||
common/music/musicstream.cpp
|
||||
common/music/s_advsound.cpp
|
||||
common/music/backend/oalsound.cpp
|
||||
common/music/backend/i_sound.cpp
|
||||
|
||||
|
|
|
@ -62,6 +62,7 @@
|
|||
|
||||
void I_InitSoundFonts();
|
||||
void S_SetStreamVolume(float);
|
||||
void S_ParseSndInfo();
|
||||
|
||||
EXTERN_CVAR (Int, snd_samplerate)
|
||||
EXTERN_CVAR (Int, snd_mididevice)
|
||||
|
@ -241,6 +242,7 @@ void Mus_Init(void)
|
|||
{
|
||||
I_InitSound();
|
||||
I_InitSoundFonts();
|
||||
S_ParseSndInfo();
|
||||
|
||||
mus_volume.Callback ();
|
||||
|
||||
|
|
208
source/common/music/s_advsound.cpp
Normal file
208
source/common/music/s_advsound.cpp
Normal file
|
@ -0,0 +1,208 @@
|
|||
/*
|
||||
** s_advsound.cpp
|
||||
** Routines for managing SNDINFO lumps and ambient sounds
|
||||
** Thid is a stripped down version only handling the music related settings.
|
||||
**
|
||||
**---------------------------------------------------------------------------
|
||||
** Copyright 1998-2008 Randy Heit
|
||||
** All rights reserved.
|
||||
**
|
||||
** Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions
|
||||
** are met:
|
||||
**
|
||||
** 1. Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** 2. Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in the
|
||||
** documentation and/or other materials provided with the distribution.
|
||||
** 3. The name of the author may not be used to endorse or promote products
|
||||
** derived from this software without specific prior written permission.
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
**---------------------------------------------------------------------------
|
||||
**
|
||||
*/
|
||||
|
||||
// HEADER FILES ------------------------------------------------------------
|
||||
|
||||
#include "templates.h"
|
||||
#include "c_dispatch.h"
|
||||
#include "filesystem.h"
|
||||
#include "v_text.h"
|
||||
#include "s_music.h"
|
||||
#include "sc_man.h"
|
||||
#include "mididevices/mididevice.h"
|
||||
|
||||
// MACROS ------------------------------------------------------------------
|
||||
|
||||
enum SICommands
|
||||
{
|
||||
SI_MusicVolume,
|
||||
SI_MidiDevice,
|
||||
SI_MusicAlias,
|
||||
};
|
||||
|
||||
|
||||
// This specifies whether Timidity or Windows playback is preferred for a certain song (only useful for Windows.)
|
||||
extern MusicAliasMap MusicAliases;
|
||||
extern MidiDeviceMap MidiDevices;
|
||||
extern MusicVolumeMap MusicVolumes;
|
||||
|
||||
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
|
||||
|
||||
extern bool IsFloat (const char *str);
|
||||
|
||||
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
|
||||
|
||||
// PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
|
||||
|
||||
static void S_AddSNDINFO (int lumpnum);
|
||||
|
||||
|
||||
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
||||
|
||||
static const char *SICommandStrings[] =
|
||||
{
|
||||
"$musicvolume",
|
||||
"$mididevice",
|
||||
"$musicalias",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
// CODE --------------------------------------------------------------------
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// S_ParseSndInfo
|
||||
//
|
||||
// Parses all loaded SNDINFO lumps.
|
||||
// Also registers Blood SFX files and Strife's voices.
|
||||
//==========================================================================
|
||||
|
||||
void S_ParseSndInfo ()
|
||||
{
|
||||
int lump, lastlump = 0;
|
||||
|
||||
while ((lump = fileSystem.Iterate("demolition/mussetting.txt", &lastlump)) >= 0)
|
||||
{
|
||||
S_AddSNDINFO (lump);
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// S_AddSNDINFO
|
||||
//
|
||||
// Reads a SNDINFO and does what it says.
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
static void S_AddSNDINFO (int lump)
|
||||
{
|
||||
bool skipToEndIf;
|
||||
TArray<uint32_t> list;
|
||||
|
||||
FScanner sc(lump);
|
||||
skipToEndIf = false;
|
||||
|
||||
while (sc.GetString ())
|
||||
{
|
||||
if (skipToEndIf)
|
||||
{
|
||||
if (sc.Compare ("$endif"))
|
||||
{
|
||||
skipToEndIf = false;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (sc.String[0] == '$')
|
||||
{ // Got a command
|
||||
switch (sc.MatchString (SICommandStrings))
|
||||
{
|
||||
case SI_MusicVolume: {
|
||||
sc.MustGetString();
|
||||
FName musname (sc.String);
|
||||
sc.MustGetFloat();
|
||||
MusicVolumes[musname] = sc.Float;
|
||||
}
|
||||
break;
|
||||
|
||||
case SI_MusicAlias: {
|
||||
sc.MustGetString();
|
||||
int lump = fileSystem.FindFile(sc.String);
|
||||
if (lump < 0)
|
||||
lump = fileSystem.FindFile(FStringf("music/%s", sc.String));
|
||||
if (lump >= 0)
|
||||
{
|
||||
// do not set the alias if a later WAD defines its own music of this name
|
||||
int file = fileSystem.GetFileContainer(lump);
|
||||
int sndifile = fileSystem.GetFileContainer(sc.LumpNum);
|
||||
if (file > sndifile)
|
||||
{
|
||||
sc.MustGetString();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
FName alias = sc.String;
|
||||
sc.MustGetString();
|
||||
FName mapped = sc.String;
|
||||
|
||||
// only set the alias if the lump it maps to exists.
|
||||
if (mapped == NAME_None || fileSystem.FindFile(sc.String) >= 0)
|
||||
{
|
||||
MusicAliases[alias] = mapped;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SI_MidiDevice: {
|
||||
sc.MustGetString();
|
||||
FName nm = sc.String;
|
||||
FScanner::SavedPos save = sc.SavePos();
|
||||
|
||||
sc.SetCMode(true);
|
||||
sc.MustGetString();
|
||||
MidiDeviceSetting devset;
|
||||
if (sc.Compare("timidity")) devset.device = MDEV_TIMIDITY;
|
||||
else if (sc.Compare("fmod") || sc.Compare("sndsys")) devset.device = MDEV_SNDSYS;
|
||||
else if (sc.Compare("standard")) devset.device = MDEV_MMAPI;
|
||||
else if (sc.Compare("opl")) devset.device = MDEV_OPL;
|
||||
else if (sc.Compare("default")) devset.device = MDEV_DEFAULT;
|
||||
else if (sc.Compare("fluidsynth")) devset.device = MDEV_FLUIDSYNTH;
|
||||
else sc.ScriptError("Unknown MIDI device %s\n", sc.String);
|
||||
|
||||
if (sc.CheckString(","))
|
||||
{
|
||||
sc.SetCMode(false);
|
||||
sc.MustGetString();
|
||||
devset.args = sc.String;
|
||||
}
|
||||
else
|
||||
{
|
||||
// This does not really do what one might expect, because the next token has already been parsed and can be a '$'.
|
||||
// So in order to continue parsing without C-Mode, we need to reset and parse the last token again.
|
||||
sc.SetCMode(false);
|
||||
sc.RestorePos(save);
|
||||
sc.MustGetString();
|
||||
}
|
||||
MidiDevices[nm] = devset;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in a new issue