- fixed most issues with newly added music files

This commit is contained in:
Christoph Oelckers 2019-11-11 01:01:18 +01:00
parent ae06d19008
commit f6a9bb770d
9 changed files with 78 additions and 71 deletions

View file

@ -64,6 +64,7 @@ enum
//CVAR_IGNORE = 16384,// do not send cvar across the network/inaccesible from ACS (dummy mod cvar) //CVAR_IGNORE = 16384,// do not send cvar across the network/inaccesible from ACS (dummy mod cvar)
//CVAR_CHEAT = 32768,// can be set only when sv_cheats is enabled //CVAR_CHEAT = 32768,// can be set only when sv_cheats is enabled
//CVAR_UNSAFECONTEXT = 65536,// cvar value came from unsafe context //CVAR_UNSAFECONTEXT = 65536,// cvar value came from unsafe context
CVAR_VIRTUAL = 0x20000, //do not invoke the callback recursively so it can
CVAR_FRONTEND_BLOOD = 0x10000000, // To mark frontend specific CVARs, so that the other ones can disable them. CVAR_FRONTEND_BLOOD = 0x10000000, // To mark frontend specific CVARs, so that the other ones can disable them.
CVAR_FRONTEND_EDUKE = 0x20000000, CVAR_FRONTEND_EDUKE = 0x20000000,
CVAR_FRONTEND_DUKELIKE = 0x30000000, CVAR_FRONTEND_DUKELIKE = 0x30000000,
@ -107,7 +108,15 @@ public:
FBaseCVar (const char *name, uint32_t flags, void (*callback)(FBaseCVar &), const char *descr); FBaseCVar (const char *name, uint32_t flags, void (*callback)(FBaseCVar &), const char *descr);
virtual ~FBaseCVar (); virtual ~FBaseCVar ();
inline void Callback () { if (m_Callback) m_Callback (*this); } inline void Callback ()
{
if (m_Callback && !inCallback)
{
inCallback = !!(Flags & CVAR_VIRTUAL); // Virtual CVARs never invoke the callback recursively, giving it a chance to manipulate the value without side effects.
m_Callback(*this);
inCallback = false;
}
}
inline const char *GetName () const { return VarName.GetChars(); } inline const char *GetName () const { return VarName.GetChars(); }
inline uint32_t GetFlags () const { return Flags; } inline uint32_t GetFlags () const { return Flags; }

View file

@ -21,6 +21,7 @@
#include "c_console.h" #include "c_console.h"
#include "c_dispatch.h" #include "c_dispatch.h"
#include "i_specialpaths.h" #include "i_specialpaths.h"
#include "z_music.h"
#ifndef NETCODE_DISABLE #ifndef NETCODE_DISABLE
#include "enet.h" #include "enet.h"
#endif #endif
@ -234,7 +235,7 @@ int GameMain()
{ {
// Set up the console before anything else so that it can receive text. // Set up the console before anything else so that it can receive text.
C_InitConsole(1024, 768, true); C_InitConsole(1024, 768, true);
FStringf logpath("logfile %sdemolition.log", M_GetDocumentsPath()); FStringf logpath("logfile %sdemolition.log", M_GetDocumentsPath().GetChars());
C_DoCommand(logpath); C_DoCommand(logpath);
#ifndef NETCODE_DISABLE #ifndef NETCODE_DISABLE
@ -368,7 +369,6 @@ int CONFIG_Init()
currentGame.Truncate(currentGame.IndexOf(".")); currentGame.Truncate(currentGame.IndexOf("."));
CheckFrontend(g_gameType); CheckFrontend(g_gameType);
int index = 0;
InitFileSystem(usedgroups); InitFileSystem(usedgroups);
CONTROL_ClearAssignments(); CONTROL_ClearAssignments();
@ -388,6 +388,7 @@ int CONFIG_Init()
} }
V_InitFonts(); V_InitFonts();
buttonMap.SetGameAliases(); buttonMap.SetGameAliases();
Mus_Init();

View file

@ -40,10 +40,11 @@
#include <zlib.h> #include <zlib.h>
#include "m_argv.h" #include "m_argv.h"
#include "filesystrem.h" #include "filesystem.h"
#include "c_dispatch.h" #include "c_dispatch.h"
#include "templates.h" #include "templates.h"
#include "stats.h" #include "stats.h"
#include "cmdlib.h"
#include "c_cvars.h" #include "c_cvars.h"
#include "c_console.h" #include "c_console.h"
#include "v_text.h" #include "v_text.h"
@ -58,6 +59,7 @@
void I_InitSoundFonts(); void I_InitSoundFonts();
void S_SetStreamVolume(float);
EXTERN_CVAR (Int, snd_samplerate) EXTERN_CVAR (Int, snd_samplerate)
EXTERN_CVAR (Int, snd_mididevice) EXTERN_CVAR (Int, snd_mididevice)
@ -118,12 +120,8 @@ CUSTOM_CVARD(Int, mus_volume, 255, CVAR_ARCHIVE|CVAR_GLOBALCONFIG, "controls mus
{ {
// Set general music volume. // Set general music volume.
ChangeMusicSetting(ZMusic::snd_musicvolume, nullptr, self / 255.f); ChangeMusicSetting(ZMusic::snd_musicvolume, nullptr, self / 255.f);
/* todo: Alter the active music stream's volume S_SetStreamVolume(clamp<float>(self * relative_volume, 0, 1));
if (GSnd != nullptr)
{
GSnd->SetMusicVolume(clamp<float>(self * relative_volume, 0, 1));
}
*/
// For music not implemented through the digital sound system, // For music not implemented through the digital sound system,
// let them know about the change. // let them know about the change.
if (mus_playing.handle != nullptr) if (mus_playing.handle != nullptr)
@ -216,13 +214,13 @@ static void SetupGenMidi()
{ {
// The OPL renderer should not care about where this comes from. // The OPL renderer should not care about where this comes from.
// Note: No I_Error here - this needs to be consistent with the rest of the music code. // Note: No I_Error here - this needs to be consistent with the rest of the music code.
auto lump = fileSystem.FindFile("demolition/genmidi.txt"); auto lump = fileSystem.FindFile("demolition/genmidi.dat");
if (lump < 0) if (lump < 0)
{ {
Printf("No GENMIDI lump found. OPL playback not available."); Printf("No GENMIDI lump found. OPL playback not available.");
return; return;
} }
auto data = Wads.OpenLumpReader(lump); auto data = fileSystem.OpenFileReader(lump);
auto genmidi = data.Read(); auto genmidi = data.Read();
if (genmidi.Size() < 8 + 175 * 36 || memcmp(genmidi.Data(), "#OPL_II#", 8)) return; if (genmidi.Size() < 8 + 175 * 36 || memcmp(genmidi.Data(), "#OPL_II#", 8)) return;
@ -235,7 +233,7 @@ static void SetupGenMidi()
// //
//========================================================================== //==========================================================================
void I_InitMusic (void) void Mus_Init(void)
{ {
I_InitSoundFonts(); I_InitSoundFonts();
@ -333,7 +331,7 @@ static MIDISource *GetMIDISource(const char *fn)
return nullptr; return nullptr;
} }
auto wlump = fileSystem.OpenFile(lump); auto wlump = fileSystem.OpenFileReader(lump);
uint32_t id[32 / 4]; uint32_t id[32 / 4];

View file

@ -313,7 +313,7 @@ FLumpPatchSetReader::FLumpPatchSetReader(const char *filename)
FileReader FLumpPatchSetReader::OpenMainConfigFile() FileReader FLumpPatchSetReader::OpenMainConfigFile()
{ {
return Wads.ReopenLumpReader(mLumpIndex); return fileSystem.ReopenFileReader(mLumpIndex);
} }
FileReader FLumpPatchSetReader::OpenFile(const char *name) FileReader FLumpPatchSetReader::OpenFile(const char *name)
@ -323,7 +323,7 @@ FileReader FLumpPatchSetReader::OpenFile(const char *name)
path = mBasePath + name; path = mBasePath + name;
auto index = fileSystem.FindFile(path); auto index = fileSystem.FindFile(path);
if (index < 0) return FileReader(); if (index < 0) return FileReader();
return Wads.ReopenLumpReader(index); return fileSystem.ReopenFileReader(index);
} }
//========================================================================== //==========================================================================

View file

@ -58,18 +58,40 @@
#include "zstring.h" #include "zstring.h"
#include "name.h" #include "name.h"
#include "s_music.h" #include "s_music.h"
#include "i_music.h"
#include "printf.h" #include "printf.h"
#include "files.h" #include "files.h"
#include "filesystem.h" #include "filesystem.h"
#include "cmdlib.h" #include "cmdlib.h"
#include "gamecvars.h" #include "gamecvars.h"
#include "c_dispatch.h"
#include "gamecontrol.h"
#include "filereadermusicinterface.h" #include "filereadermusicinterface.h"
MusPlayingInfo mus_playing; MusPlayingInfo mus_playing;
MusicAliasMap MusicAliases; MusicAliasMap MusicAliases;
MidiDeviceMap MidiDevices; MidiDeviceMap MidiDevices;
MusicVolumeMap MusicVolumes;
bool MusicPaused;
void S_CreateStream()
{
}
void S_PauseStream(bool pause)
{
}
void S_StopStream()
{
}
void S_SetStreamVolume(float vol)
{
}
//========================================================================== //==========================================================================
// //
// starts playing this song // starts playing this song
@ -88,7 +110,7 @@ static void S_StartMusicPlaying(MusInfo* song, bool loop, float rel_vol, int sub
ZMusic_Start(song, subsong, loop); ZMusic_Start(song, subsong, loop);
// Notify the sound system of the changed relative volume // Notify the sound system of the changed relative volume
snd_musicvolume.Callback(); mus_volume.Callback();
} }
@ -142,48 +164,12 @@ void S_UpdateMusic ()
// to attempt to reconnect to broken net streams and to advance the // to attempt to reconnect to broken net streams and to advance the
// playlist when the current song finishes. // playlist when the current song finishes.
if (!ZMusic_IsPlaying(mus_playing.handle)) if (!ZMusic_IsPlaying(mus_playing.handle))
{
if (PlayList.GetNumSongs())
{
PlayList.Advance();
S_ActivatePlayList(false);
}
else
{ {
S_StopMusic(true); S_StopMusic(true);
} }
} }
}
} }
//==========================================================================
//
// S_Start
//
// Per level startup code. Kills playing sounds at start of level
// and starts new music.
//==========================================================================
void S_StartMusic ()
{
// stop the old music if it has been paused.
// This ensures that the new music is started from the beginning
// if it's the same as the last one and it has been paused.
if (MusicPaused) S_StopMusic(true);
// start new music for the level
MusicPaused = false;
// Don't start the music if loading a savegame, because the music is stored there.
// Don't start the music if revisiting a level in a hub for the same reason.
if (!primaryLevel->IsReentering())
{
primaryLevel->SetMusic();
}
}
//========================================================================== //==========================================================================
// //
// S_ChangeCDMusic // S_ChangeCDMusic
@ -197,11 +183,11 @@ bool S_ChangeCDMusic (int track, unsigned int id, bool looping)
if (id != 0) if (id != 0)
{ {
mysnprintf (temp, countof(temp), ",CD,%d,%x", track, id); snprintf (temp, countof(temp), ",CD,%d,%x", track, id);
} }
else else
{ {
mysnprintf (temp, countof(temp), ",CD,%d", track); snprintf (temp, countof(temp), ",CD,%d", track);
} }
return S_ChangeMusic (temp, 0, looping); return S_ChangeMusic (temp, 0, looping);
} }
@ -296,7 +282,6 @@ bool S_ChangeMusic(const char* musicname, int order, bool looping, bool force)
else else
{ {
int lumpnum = -1; int lumpnum = -1;
int length = 0;
MusInfo* handle = nullptr; MusInfo* handle = nullptr;
MidiDeviceSetting* devp = MidiDevices.CheckKey(musicname); MidiDeviceSetting* devp = MidiDevices.CheckKey(musicname);
@ -310,10 +295,15 @@ bool S_ChangeMusic(const char* musicname, int order, bool looping, bool force)
if (!FileExists(musicname)) if (!FileExists(musicname))
{ {
if ((lumpnum = fileSystem.FindFile(musicname)) == -1) if ((lumpnum = fileSystem.FindFile(musicname)) == -1)
{
// Always look in the 'music' subfolder as well.
FStringf aliasMusicname("music/%s", musicname);
if ((lumpnum = fileSystem.FindFile(aliasMusicname)) == -1)
{ {
Printf("Music \"%s\" not found\n", musicname); Printf("Music \"%s\" not found\n", musicname);
return false; return false;
} }
}
if (handle == nullptr) if (handle == nullptr)
{ {
if (fileSystem.FileLength(lumpnum) == 0) if (fileSystem.FileLength(lumpnum) == 0)
@ -373,7 +363,8 @@ bool S_ChangeMusic(const char* musicname, int order, bool looping, bool force)
{ // play it { // play it
try try
{ {
S_StartMusicPlaying(mus_playing.handle, looping, S_GetMusicVolume(musicname), order); auto vol = MusicVolumes.CheckKey(musicname);
S_StartMusicPlaying(mus_playing.handle, looping, vol? *vol : 1.f, order);
S_CreateStream(); S_CreateStream();
mus_playing.baseorder = order; mus_playing.baseorder = order;
} }
@ -456,7 +447,7 @@ void S_StopMusic (bool force)
try try
{ {
// [RH] Don't stop if a playlist is active. // [RH] Don't stop if a playlist is active.
if ((force || PlayList.GetNumSongs() == 0) && !mus_playing.name.IsEmpty()) if (!mus_playing.name.IsEmpty())
{ {
if (mus_playing.handle != nullptr) if (mus_playing.handle != nullptr)
{ {
@ -483,8 +474,6 @@ void S_StopMusic (bool force)
} }
} }
}
//========================================================================== //==========================================================================
// //
// CCMD changemus // CCMD changemus
@ -493,11 +482,10 @@ void S_StopMusic (bool force)
CCMD (changemus) CCMD (changemus)
{ {
if (!nomusic) if (MusicEnabled())
{ {
if (argv.argc() > 1) if (argv.argc() > 1)
{ {
PlayList.Clear();
S_ChangeMusic (argv[1], argv.argc() > 2 ? atoi (argv[2]) : 0); S_ChangeMusic (argv[1], argv.argc() > 2 ? atoi (argv[2]) : 0);
} }
else else
@ -527,19 +515,23 @@ CCMD (changemus)
CCMD (stopmus) CCMD (stopmus)
{ {
PlayList.Clear();
S_StopMusic (false); S_StopMusic (false);
mus_playing.LastSong = ""; // forget the last played song so that it won't get restarted if some volume changes occur mus_playing.LastSong = ""; // forget the last played song so that it won't get restarted if some volume changes occur
} }
void Mus_Play(const char *fn, bool loop)
{ {
S_ChangeMusic(fn, 0, loop, true);
} }
void Mus_SetVolume(float vol) void Mus_Stop()
{ {
S_StopMusic(true);
} }
void Mus_SetPaused(bool on) void Mus_SetPaused(bool on)
{ {
if (on) S_PauseMusic();
else S_ResumeMusic();
} }

View file

@ -33,7 +33,6 @@
#define DEF_MIDIDEV -5 #define DEF_MIDIDEV -5
EXTERN_CVAR(Int, snd_mididevice)
static uint32_t nummididevices; static uint32_t nummididevices;
#define NUM_DEF_DEVICES 7 #define NUM_DEF_DEVICES 7
@ -56,7 +55,10 @@ void I_InitMusicWin32 ()
#include "v_text.h" #include "v_text.h"
#include "zmusic/zmusic.h" #include "zmusic/zmusic.h"
#include "s_music.h" #include "s_music.h"
#include "c_cvars.h"
#include "printf.h"
EXTERN_CVAR(Int, snd_mididevice)
CUSTOM_CVAR (Int, snd_mididevice, DEF_MIDIDEV, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITCALL) CUSTOM_CVAR (Int, snd_mididevice, DEF_MIDIDEV, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOINITCALL)

View file

@ -30,6 +30,7 @@
#include "zstring.h" #include "zstring.h"
#include "tarray.h" #include "tarray.h"
#include "name.h"
// //
@ -71,9 +72,11 @@ struct MidiDeviceSetting
typedef TMap<FName, FName> MusicAliasMap; typedef TMap<FName, FName> MusicAliasMap;
typedef TMap<FName, MidiDeviceSetting> MidiDeviceMap; typedef TMap<FName, MidiDeviceSetting> MidiDeviceMap;
typedef TMap<FName, float> MusicVolumeMap;
extern MusicAliasMap MusicAliases; extern MusicAliasMap MusicAliases;
extern MidiDeviceMap MidiDevices; extern MidiDeviceMap MidiDevices;
extern MusicVolumeMap MusicVolumes;
class MusInfo; class MusInfo;
struct MusPlayingInfo struct MusPlayingInfo

View file

@ -2,7 +2,7 @@
// Totally minimalistic interface - should be all the game modules need. // Totally minimalistic interface - should be all the game modules need.
void Mus_Init();
void Mus_Play(const char *fn, bool loop); void Mus_Play(const char *fn, bool loop);
void Mus_Stop(); void Mus_Stop();
void Mus_SetVolume(float vol);
void Mus_SetPaused(bool on); void Mus_SetPaused(bool on);

View file

@ -1,3 +1,4 @@
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <winsock2.h> #include <winsock2.h>
#include <windows.h> // Ugh... This needs to go away but since some of the headers pull it in the compilation is creepingly slow without this. #include <windows.h> // Ugh... This needs to go away but since some of the headers pull it in the compilation is creepingly slow without this.
@ -6,6 +7,7 @@
#undef min #undef min
#undef max #undef max
#endif #endif
#endif
#include <stddef.h> #include <stddef.h>
#include <stdlib.h> #include <stdlib.h>