mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-02-18 10:11:11 +00:00
- cleanup of the sound init/exit code.
Now there is only one single entry point for both, instead of previously 2 entry and 4 exit points. This also eliminates the explicit shutdown of ZMusic. Timidity++'s two buffers have been put in containers that self-destruct on shutdown and calling dumb_exit is not necessary because the only feature requiring it is not used by any code in the music library.
This commit is contained in:
parent
86ab366958
commit
d2c156224b
20 changed files with 85 additions and 204 deletions
|
@ -30,7 +30,29 @@
|
||||||
namespace TimidityPlus
|
namespace TimidityPlus
|
||||||
{
|
{
|
||||||
|
|
||||||
static MBlockNode *free_mblock_list = NULL;
|
struct MBlock
|
||||||
|
{
|
||||||
|
MBlockNode* free_mblock_list = NULL;
|
||||||
|
|
||||||
|
~MBlock()
|
||||||
|
{
|
||||||
|
int cnt;
|
||||||
|
|
||||||
|
cnt = 0;
|
||||||
|
while (free_mblock_list)
|
||||||
|
{
|
||||||
|
MBlockNode* tmp;
|
||||||
|
|
||||||
|
tmp = free_mblock_list;
|
||||||
|
free_mblock_list = free_mblock_list->next;
|
||||||
|
free(tmp);
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static MBlock free_list;
|
||||||
|
|
||||||
#define ADDRALIGN 8
|
#define ADDRALIGN 8
|
||||||
/* #define DEBUG */
|
/* #define DEBUG */
|
||||||
|
|
||||||
|
@ -50,7 +72,7 @@ static MBlockNode *new_mblock_node(size_t n)
|
||||||
return NULL;
|
return NULL;
|
||||||
p->block_size = n;
|
p->block_size = n;
|
||||||
}
|
}
|
||||||
else if (free_mblock_list == NULL)
|
else if (free_list.free_mblock_list == NULL)
|
||||||
{
|
{
|
||||||
if ((p = (MBlockNode *)safe_malloc(sizeof(MBlockNode) + MIN_MBLOCK_SIZE)) == NULL)
|
if ((p = (MBlockNode *)safe_malloc(sizeof(MBlockNode) + MIN_MBLOCK_SIZE)) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -58,8 +80,8 @@ static MBlockNode *new_mblock_node(size_t n)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
p = free_mblock_list;
|
p = free_list.free_mblock_list;
|
||||||
free_mblock_list = free_mblock_list->next;
|
free_list.free_mblock_list = free_list.free_mblock_list->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
p->offset = 0;
|
p->offset = 0;
|
||||||
|
@ -115,8 +137,8 @@ static void reuse_mblock1(MBlockNode *p)
|
||||||
free(p);
|
free(p);
|
||||||
else /* p->block_size <= MIN_MBLOCK_SIZE */
|
else /* p->block_size <= MIN_MBLOCK_SIZE */
|
||||||
{
|
{
|
||||||
p->next = free_mblock_list;
|
p->next = free_list.free_mblock_list;
|
||||||
free_mblock_list = p;
|
free_list.free_mblock_list = p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,21 +171,4 @@ char *strdup_mblock(MBlockList *mblock, const char *str)
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
int free_global_mblock(void)
|
|
||||||
{
|
|
||||||
int cnt;
|
|
||||||
|
|
||||||
cnt = 0;
|
|
||||||
while (free_mblock_list)
|
|
||||||
{
|
|
||||||
MBlockNode *tmp;
|
|
||||||
|
|
||||||
tmp = free_mblock_list;
|
|
||||||
free_mblock_list = free_mblock_list->next;
|
|
||||||
free(tmp);
|
|
||||||
cnt++;
|
|
||||||
}
|
|
||||||
return cnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -42,6 +42,7 @@ static float newt_coeffs[58][58];
|
||||||
static int sample_bounds_min, sample_bounds_max; /* min/max bounds for sample data */
|
static int sample_bounds_min, sample_bounds_max; /* min/max bounds for sample data */
|
||||||
|
|
||||||
#define DEFAULT_GAUSS_ORDER 25
|
#define DEFAULT_GAUSS_ORDER 25
|
||||||
|
std::vector<float> gauss_table_data;
|
||||||
static float *gauss_table[(1 << FRACTION_BITS)] = { 0 }; /* don't need doubles */
|
static float *gauss_table[(1 << FRACTION_BITS)] = { 0 }; /* don't need doubles */
|
||||||
static int gauss_n = DEFAULT_GAUSS_ORDER;
|
static int gauss_n = DEFAULT_GAUSS_ORDER;
|
||||||
|
|
||||||
|
@ -209,7 +210,9 @@ void initialize_gauss_table(int n)
|
||||||
zsin[i] = sin(i / (4 * M_PI));
|
zsin[i] = sin(i / (4 * M_PI));
|
||||||
|
|
||||||
x_inc = 1.0 / (1 << FRACTION_BITS);
|
x_inc = 1.0 / (1 << FRACTION_BITS);
|
||||||
gptr = (float*)safe_realloc(gauss_table[0], (n + 1) * sizeof(float)*(1 << FRACTION_BITS));
|
|
||||||
|
gauss_table_data.resize((n + 1) * sizeof(float) * (1 << FRACTION_BITS));
|
||||||
|
gptr = gauss_table_data.data();
|
||||||
for (m = 0, x = 0.0; m < (1 << FRACTION_BITS); m++, x += x_inc)
|
for (m = 0, x = 0.0; m < (1 << FRACTION_BITS); m++, x += x_inc)
|
||||||
{
|
{
|
||||||
xz = (x + n_half) / (4 * M_PI);
|
xz = (x + n_half) / (4 * M_PI);
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
#include "zmusic/midiconfig.h"
|
#include "zmusic/midiconfig.h"
|
||||||
#include "zmusic/mididefs.h"
|
#include "zmusic/mididefs.h"
|
||||||
|
|
||||||
void TimidityPP_Shutdown();
|
|
||||||
typedef void(*MidiCallback)(void *);
|
typedef void(*MidiCallback)(void *);
|
||||||
|
|
||||||
// A device that provides a WinMM-like MIDI streaming interface -------------
|
// A device that provides a WinMM-like MIDI streaming interface -------------
|
||||||
|
|
|
@ -225,9 +225,3 @@ MIDIDevice *CreateTimidityPPMIDIDevice(const char *Args, int samplerate)
|
||||||
return new TimidityPPMIDIDevice(samplerate);
|
return new TimidityPPMIDIDevice(samplerate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void TimidityPP_Shutdown()
|
|
||||||
{
|
|
||||||
TimidityPlus::free_gauss_table();
|
|
||||||
TimidityPlus::free_global_mblock();
|
|
||||||
}
|
|
||||||
|
|
|
@ -306,18 +306,3 @@ MusInfo *ZMusic_OpenCDSong (int track, int id)
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
void TimidityPP_Shutdown();
|
|
||||||
extern "C" void dumb_exit();
|
|
||||||
|
|
||||||
void ZMusic_Shutdown()
|
|
||||||
{
|
|
||||||
// free static data in the backends.
|
|
||||||
TimidityPP_Shutdown();
|
|
||||||
dumb_exit();
|
|
||||||
}
|
|
||||||
|
|
|
@ -159,8 +159,6 @@ void MIDIDumpWave(MIDISource* source, EMidiDevice devtype, const char* devarg, c
|
||||||
MusInfo *ZMusic_OpenSong (MusicIO::FileInterface *reader, EMidiDevice device, const char *Args);
|
MusInfo *ZMusic_OpenSong (MusicIO::FileInterface *reader, EMidiDevice device, const char *Args);
|
||||||
MusInfo *ZMusic_OpenCDSong (int track, int cdid = 0);
|
MusInfo *ZMusic_OpenCDSong (int track, int cdid = 0);
|
||||||
|
|
||||||
void ZMusic_Shutdown();
|
|
||||||
|
|
||||||
class MusInfo;
|
class MusInfo;
|
||||||
// Configuration interface. The return value specifies if a music restart is needed.
|
// Configuration interface. The return value specifies if a music restart is needed.
|
||||||
// RealValue should be written back to the CVAR or whatever other method the client uses to store configuration state.
|
// RealValue should be written back to the CVAR or whatever other method the client uses to store configuration state.
|
||||||
|
|
|
@ -2494,7 +2494,6 @@ void D_DoomMain (void)
|
||||||
|
|
||||||
if (!batchrun) Printf ("S_Init: Setting up sound.\n");
|
if (!batchrun) Printf ("S_Init: Setting up sound.\n");
|
||||||
S_Init ();
|
S_Init ();
|
||||||
S_InitMusic();
|
|
||||||
|
|
||||||
if (!batchrun) Printf ("ST_Init: Init startup screen.\n");
|
if (!batchrun) Printf ("ST_Init: Init startup screen.\n");
|
||||||
if (!restart)
|
if (!restart)
|
||||||
|
@ -2803,7 +2802,6 @@ void D_Cleanup()
|
||||||
R_DeinitTranslationTables(); // some tables are initialized from outside the translation code.
|
R_DeinitTranslationTables(); // some tables are initialized from outside the translation code.
|
||||||
gameinfo.~gameinfo_t();
|
gameinfo.~gameinfo_t();
|
||||||
new (&gameinfo) gameinfo_t; // Reset gameinfo
|
new (&gameinfo) gameinfo_t; // Reset gameinfo
|
||||||
S_ShutdownMusic();
|
|
||||||
S_Shutdown(); // free all channels and delete playlist
|
S_Shutdown(); // free all channels and delete playlist
|
||||||
C_ClearAliases(); // CCMDs won't be reinitialized so these need to be deleted here
|
C_ClearAliases(); // CCMDs won't be reinitialized so these need to be deleted here
|
||||||
DestroyCVarsFlagged(CVAR_MOD); // Delete any cvar left by mods
|
DestroyCVarsFlagged(CVAR_MOD); // Delete any cvar left by mods
|
||||||
|
|
|
@ -88,9 +88,6 @@ void I_Init(void)
|
||||||
CheckCPUID(&CPU);
|
CheckCPUID(&CPU);
|
||||||
CalculateCPUSpeed();
|
CalculateCPUSpeed();
|
||||||
DumpCPUInfo(&CPU);
|
DumpCPUInfo(&CPU);
|
||||||
|
|
||||||
atterm(I_ShutdownSound);
|
|
||||||
I_InitSound();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -97,9 +97,6 @@ void I_Init (void)
|
||||||
{
|
{
|
||||||
CheckCPUID (&CPU);
|
CheckCPUID (&CPU);
|
||||||
DumpCPUInfo (&CPU);
|
DumpCPUInfo (&CPU);
|
||||||
|
|
||||||
atterm(I_ShutdownSound);
|
|
||||||
I_InitSound ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -307,16 +307,6 @@ void I_CloseSound ()
|
||||||
GSnd = NULL;
|
GSnd = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_ShutdownSound()
|
|
||||||
{
|
|
||||||
I_ShutdownMusic(true);
|
|
||||||
if (GSnd != NULL)
|
|
||||||
{
|
|
||||||
S_StopAllChannels();
|
|
||||||
I_CloseSound();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *GetSampleTypeName(SampleType type)
|
const char *GetSampleTypeName(SampleType type)
|
||||||
{
|
{
|
||||||
switch(type)
|
switch(type)
|
||||||
|
|
|
@ -174,7 +174,6 @@ extern bool nosfx;
|
||||||
extern bool nosound;
|
extern bool nosound;
|
||||||
|
|
||||||
void I_InitSound ();
|
void I_InitSound ();
|
||||||
void I_ShutdownSound ();
|
|
||||||
|
|
||||||
void S_ChannelEnded(FISoundChannel *schan);
|
void S_ChannelEnded(FISoundChannel *schan);
|
||||||
void S_ChannelVirtualChanged(FISoundChannel *schan, bool is_virtual);
|
void S_ChannelVirtualChanged(FISoundChannel *schan, bool is_virtual);
|
||||||
|
|
|
@ -62,13 +62,9 @@
|
||||||
|
|
||||||
void I_InitSoundFonts();
|
void I_InitSoundFonts();
|
||||||
|
|
||||||
extern MusPlayingInfo mus_playing;
|
|
||||||
|
|
||||||
EXTERN_CVAR (Int, snd_samplerate)
|
EXTERN_CVAR (Int, snd_samplerate)
|
||||||
EXTERN_CVAR (Int, snd_mididevice)
|
EXTERN_CVAR (Int, snd_mididevice)
|
||||||
|
|
||||||
static bool MusicDown = true;
|
|
||||||
|
|
||||||
static bool ungzip(uint8_t *data, int size, std::vector<uint8_t> &newdata);
|
static bool ungzip(uint8_t *data, int size, std::vector<uint8_t> &newdata);
|
||||||
|
|
||||||
int nomusic = 0;
|
int nomusic = 0;
|
||||||
|
@ -279,8 +275,6 @@ void I_InitMusic (void)
|
||||||
I_InitMusicWin32 ();
|
I_InitMusicWin32 ();
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
|
|
||||||
MusicDown = false;
|
|
||||||
|
|
||||||
Callbacks callbacks;
|
Callbacks callbacks;
|
||||||
|
|
||||||
callbacks.Fluid_MessageFunc = Printf;
|
callbacks.Fluid_MessageFunc = Printf;
|
||||||
|
@ -298,28 +292,6 @@ void I_InitMusic (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
void I_ShutdownMusic(bool onexit)
|
|
||||||
{
|
|
||||||
if (MusicDown)
|
|
||||||
return;
|
|
||||||
MusicDown = true;
|
|
||||||
if (mus_playing.handle)
|
|
||||||
{
|
|
||||||
S_StopMusic (true);
|
|
||||||
assert (mus_playing.handle == nullptr);
|
|
||||||
}
|
|
||||||
if (onexit)
|
|
||||||
{
|
|
||||||
ZMusic_Shutdown();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
@ -380,7 +352,6 @@ ADD_STAT(music)
|
||||||
// Common loader for the dumpers.
|
// Common loader for the dumpers.
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
extern MusPlayingInfo mus_playing;
|
|
||||||
|
|
||||||
static MIDISource *GetMIDISource(const char *fn)
|
static MIDISource *GetMIDISource(const char *fn)
|
||||||
{
|
{
|
||||||
|
|
|
@ -41,7 +41,6 @@ struct FOptionValues;
|
||||||
// MUSIC I/O
|
// MUSIC I/O
|
||||||
//
|
//
|
||||||
void I_InitMusic ();
|
void I_InitMusic ();
|
||||||
void I_ShutdownMusic (bool onexit = false);
|
|
||||||
void I_BuildMIDIMenuList (FOptionValues *);
|
void I_BuildMIDIMenuList (FOptionValues *);
|
||||||
|
|
||||||
// Volume.
|
// Volume.
|
||||||
|
|
|
@ -40,8 +40,6 @@
|
||||||
#include "s_music.h"
|
#include "s_music.h"
|
||||||
#include "zmusic/zmusic.h"
|
#include "zmusic/zmusic.h"
|
||||||
|
|
||||||
extern MusPlayingInfo mus_playing;
|
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// ADL Midi device
|
// ADL Midi device
|
||||||
|
|
|
@ -103,8 +103,7 @@ static void S_ActivatePlayList(bool goBack);
|
||||||
|
|
||||||
static bool MusicPaused; // whether music is paused
|
static bool MusicPaused; // whether music is paused
|
||||||
MusPlayingInfo mus_playing; // music currently being played
|
MusPlayingInfo mus_playing; // music currently being played
|
||||||
static FString LastSong; // last music that was played
|
static FPlayList PlayList;
|
||||||
static FPlayList *PlayList;
|
|
||||||
float relative_volume = 1.f;
|
float relative_volume = 1.f;
|
||||||
float saved_relative_volume = 1.0f; // this could be used to implement an ACS FadeMusic function
|
float saved_relative_volume = 1.0f; // this could be used to implement an ACS FadeMusic function
|
||||||
|
|
||||||
|
@ -114,47 +113,9 @@ DEFINE_FIELD_X(MusPlayingInfo, MusPlayingInfo, baseorder);
|
||||||
DEFINE_FIELD_X(MusPlayingInfo, MusPlayingInfo, loop);
|
DEFINE_FIELD_X(MusPlayingInfo, MusPlayingInfo, loop);
|
||||||
|
|
||||||
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
// PUBLIC DATA DEFINITIONS -------------------------------------------------
|
||||||
void S_ShutdownMusic ();
|
|
||||||
|
|
||||||
// CODE --------------------------------------------------------------------
|
// CODE --------------------------------------------------------------------
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
// S_Init
|
|
||||||
//
|
|
||||||
// Initializes sound stuff, including volume. Sets channels, SFX and
|
|
||||||
// music volume, allocates channel buffer, and sets S_sfx lookup.
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
void S_InitMusic ()
|
|
||||||
{
|
|
||||||
// no sounds are playing, and they are not paused
|
|
||||||
mus_playing.name = "";
|
|
||||||
LastSong = "";
|
|
||||||
mus_playing.handle = nullptr;
|
|
||||||
mus_playing.baseorder = 0;
|
|
||||||
MusicPaused = false;
|
|
||||||
atterm(S_ShutdownMusic);
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
// S_Shutdown
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
void S_ShutdownMusic ()
|
|
||||||
{
|
|
||||||
if (PlayList != nullptr)
|
|
||||||
{
|
|
||||||
delete PlayList;
|
|
||||||
PlayList = nullptr;
|
|
||||||
}
|
|
||||||
S_StopMusic (true);
|
|
||||||
mus_playing.name = "";
|
|
||||||
LastSong = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
@ -279,9 +240,9 @@ void S_UpdateMusic ()
|
||||||
// playlist when the current song finishes.
|
// playlist when the current song finishes.
|
||||||
if (!mus_playing.handle->IsPlaying())
|
if (!mus_playing.handle->IsPlaying())
|
||||||
{
|
{
|
||||||
if (PlayList)
|
if (PlayList.GetNumSongs())
|
||||||
{
|
{
|
||||||
PlayList->Advance();
|
PlayList.Advance();
|
||||||
S_ActivatePlayList(false);
|
S_ActivatePlayList(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -331,15 +292,14 @@ void S_ActivatePlayList (bool goBack)
|
||||||
{
|
{
|
||||||
int startpos, pos;
|
int startpos, pos;
|
||||||
|
|
||||||
startpos = pos = PlayList->GetPosition ();
|
startpos = pos = PlayList.GetPosition ();
|
||||||
S_StopMusic (true);
|
S_StopMusic (true);
|
||||||
while (!S_ChangeMusic (PlayList->GetSong (pos), 0, false, true))
|
while (!S_ChangeMusic (PlayList.GetSong (pos), 0, false, true))
|
||||||
{
|
{
|
||||||
pos = goBack ? PlayList->Backup () : PlayList->Advance ();
|
pos = goBack ? PlayList.Backup () : PlayList.Advance ();
|
||||||
if (pos == startpos)
|
if (pos == startpos)
|
||||||
{
|
{
|
||||||
delete PlayList;
|
PlayList.Clear();
|
||||||
PlayList = nullptr;
|
|
||||||
Printf ("Cannot play anything in the playlist.\n");
|
Printf ("Cannot play anything in the playlist.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -394,7 +354,7 @@ bool S_StartMusic (const char *m_id)
|
||||||
bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
|
bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
|
||||||
{
|
{
|
||||||
if (nomusic) return false; // skip the entire procedure if music is globally disabled.
|
if (nomusic) return false; // skip the entire procedure if music is globally disabled.
|
||||||
if (!force && PlayList)
|
if (!force && PlayList.GetNumSongs())
|
||||||
{ // Don't change if a playlist is active
|
{ // Don't change if a playlist is active
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -418,7 +378,7 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
|
||||||
// Don't choke if the map doesn't have a song attached
|
// Don't choke if the map doesn't have a song attached
|
||||||
S_StopMusic (true);
|
S_StopMusic (true);
|
||||||
mus_playing.name = "";
|
mus_playing.name = "";
|
||||||
LastSong = "";
|
mus_playing.LastSong = "";
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -535,7 +495,7 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
|
||||||
mus_playing.loop = looping;
|
mus_playing.loop = looping;
|
||||||
mus_playing.name = musicname;
|
mus_playing.name = musicname;
|
||||||
mus_playing.baseorder = order;
|
mus_playing.baseorder = order;
|
||||||
LastSong = musicname;
|
mus_playing.LastSong = musicname;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -561,7 +521,7 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force)
|
||||||
mus_playing.loop = looping;
|
mus_playing.loop = looping;
|
||||||
mus_playing.name = musicname;
|
mus_playing.name = musicname;
|
||||||
mus_playing.baseorder = 0;
|
mus_playing.baseorder = 0;
|
||||||
LastSong = "";
|
mus_playing.LastSong = "";
|
||||||
|
|
||||||
if (mus_playing.handle != 0)
|
if (mus_playing.handle != 0)
|
||||||
{ // play it
|
{ // play it
|
||||||
|
@ -600,10 +560,10 @@ DEFINE_ACTION_FUNCTION(DObject, S_ChangeMusic)
|
||||||
|
|
||||||
void S_RestartMusic ()
|
void S_RestartMusic ()
|
||||||
{
|
{
|
||||||
if (!LastSong.IsEmpty())
|
if (!mus_playing.LastSong.IsEmpty())
|
||||||
{
|
{
|
||||||
FString song = LastSong;
|
FString song = mus_playing.LastSong;
|
||||||
LastSong = "";
|
mus_playing.LastSong = "";
|
||||||
S_ChangeMusic (song, mus_playing.baseorder, mus_playing.loop, true);
|
S_ChangeMusic (song, mus_playing.baseorder, mus_playing.loop, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -680,7 +640,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 == nullptr) && !mus_playing.name.IsEmpty())
|
if ((force || PlayList.GetNumSongs() == 0) && !mus_playing.name.IsEmpty())
|
||||||
{
|
{
|
||||||
if (mus_playing.handle != nullptr)
|
if (mus_playing.handle != nullptr)
|
||||||
{
|
{
|
||||||
|
@ -690,8 +650,7 @@ void S_StopMusic (bool force)
|
||||||
delete mus_playing.handle;
|
delete mus_playing.handle;
|
||||||
mus_playing.handle = nullptr;
|
mus_playing.handle = nullptr;
|
||||||
}
|
}
|
||||||
LastSong = mus_playing.name;
|
mus_playing.LastSong = std::move(mus_playing.name);
|
||||||
mus_playing.name = "";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (const std::runtime_error& )
|
catch (const std::runtime_error& )
|
||||||
|
@ -772,11 +731,7 @@ CCMD (changemus)
|
||||||
{
|
{
|
||||||
if (argv.argc() > 1)
|
if (argv.argc() > 1)
|
||||||
{
|
{
|
||||||
if (PlayList)
|
PlayList.Clear();
|
||||||
{
|
|
||||||
delete PlayList;
|
|
||||||
PlayList = nullptr;
|
|
||||||
}
|
|
||||||
S_ChangeMusic (argv[1], argv.argc() > 2 ? atoi (argv[2]) : 0);
|
S_ChangeMusic (argv[1], argv.argc() > 2 ? atoi (argv[2]) : 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -806,13 +761,9 @@ CCMD (changemus)
|
||||||
|
|
||||||
CCMD (stopmus)
|
CCMD (stopmus)
|
||||||
{
|
{
|
||||||
if (PlayList)
|
PlayList.Clear();
|
||||||
{
|
|
||||||
delete PlayList;
|
|
||||||
PlayList = nullptr;
|
|
||||||
}
|
|
||||||
S_StopMusic (false);
|
S_StopMusic (false);
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -909,30 +860,25 @@ UNSAFE_CCMD (playlist)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (PlayList != nullptr)
|
if (PlayList.GetNumSongs() > 0)
|
||||||
{
|
{
|
||||||
PlayList->ChangeList (argv[1]);
|
PlayList.ChangeList (argv[1]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PlayList = new FPlayList (argv[1]);
|
PlayList.ChangeList(argv[1]);
|
||||||
}
|
}
|
||||||
if (PlayList->GetNumSongs () == 0)
|
if (PlayList.GetNumSongs () > 0)
|
||||||
{
|
|
||||||
delete PlayList;
|
|
||||||
PlayList = nullptr;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if (argc == 3)
|
if (argc == 3)
|
||||||
{
|
{
|
||||||
if (stricmp (argv[2], "shuffle") == 0)
|
if (stricmp (argv[2], "shuffle") == 0)
|
||||||
{
|
{
|
||||||
PlayList->Shuffle ();
|
PlayList.Shuffle ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PlayList->SetPosition (atoi (argv[2]));
|
PlayList.SetPosition (atoi (argv[2]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
S_ActivatePlayList (false);
|
S_ActivatePlayList (false);
|
||||||
|
@ -948,7 +894,7 @@ UNSAFE_CCMD (playlist)
|
||||||
|
|
||||||
static bool CheckForPlaylist ()
|
static bool CheckForPlaylist ()
|
||||||
{
|
{
|
||||||
if (PlayList == nullptr)
|
if (PlayList.GetNumSongs() == 0)
|
||||||
{
|
{
|
||||||
Printf ("No playlist is playing.\n");
|
Printf ("No playlist is playing.\n");
|
||||||
return false;
|
return false;
|
||||||
|
@ -960,7 +906,7 @@ CCMD (playlistpos)
|
||||||
{
|
{
|
||||||
if (CheckForPlaylist() && argv.argc() > 1)
|
if (CheckForPlaylist() && argv.argc() > 1)
|
||||||
{
|
{
|
||||||
PlayList->SetPosition (atoi (argv[1]) - 1);
|
PlayList.SetPosition (atoi (argv[1]) - 1);
|
||||||
S_ActivatePlayList (false);
|
S_ActivatePlayList (false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -975,7 +921,7 @@ CCMD (playlistnext)
|
||||||
{
|
{
|
||||||
if (CheckForPlaylist())
|
if (CheckForPlaylist())
|
||||||
{
|
{
|
||||||
PlayList->Advance ();
|
PlayList.Advance ();
|
||||||
S_ActivatePlayList (false);
|
S_ActivatePlayList (false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -990,7 +936,7 @@ CCMD (playlistprev)
|
||||||
{
|
{
|
||||||
if (CheckForPlaylist())
|
if (CheckForPlaylist())
|
||||||
{
|
{
|
||||||
PlayList->Backup ();
|
PlayList.Backup ();
|
||||||
S_ActivatePlayList (true);
|
S_ActivatePlayList (true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1006,9 +952,9 @@ CCMD (playliststatus)
|
||||||
if (CheckForPlaylist ())
|
if (CheckForPlaylist ())
|
||||||
{
|
{
|
||||||
Printf ("Song %d of %d:\n%s\n",
|
Printf ("Song %d of %d:\n%s\n",
|
||||||
PlayList->GetPosition () + 1,
|
PlayList.GetPosition () + 1,
|
||||||
PlayList->GetNumSongs (),
|
PlayList.GetNumSongs (),
|
||||||
PlayList->GetSong (PlayList->GetPosition ()));
|
PlayList.GetSong (PlayList.GetPosition ()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,6 @@ void S_ParseMusInfo();
|
||||||
|
|
||||||
//
|
//
|
||||||
void S_InitMusic ();
|
void S_InitMusic ();
|
||||||
void S_ShutdownMusic ();
|
|
||||||
void S_StartMusic ();
|
void S_StartMusic ();
|
||||||
|
|
||||||
|
|
||||||
|
@ -86,8 +85,11 @@ struct MusPlayingInfo
|
||||||
MusInfo* handle;
|
MusInfo* handle;
|
||||||
int baseorder;
|
int baseorder;
|
||||||
bool loop;
|
bool loop;
|
||||||
|
FString LastSong; // last music that was played
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern MusPlayingInfo mus_playing;
|
||||||
|
|
||||||
extern float relative_volume, saved_relative_volume;
|
extern float relative_volume, saved_relative_volume;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,7 @@
|
||||||
#include "vm.h"
|
#include "vm.h"
|
||||||
#include "g_game.h"
|
#include "g_game.h"
|
||||||
#include "atterm.h"
|
#include "atterm.h"
|
||||||
|
#include "s_music.h"
|
||||||
|
|
||||||
// MACROS ------------------------------------------------------------------
|
// MACROS ------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -308,6 +309,7 @@ void S_Init ()
|
||||||
atterm(S_Shutdown);
|
atterm(S_Shutdown);
|
||||||
|
|
||||||
// Heretic and Hexen have sound curve lookup tables. Doom does not.
|
// Heretic and Hexen have sound curve lookup tables. Doom does not.
|
||||||
|
I_InitSound();
|
||||||
curvelump = Wads.CheckNumForName ("SNDCURVE");
|
curvelump = Wads.CheckNumForName ("SNDCURVE");
|
||||||
if (curvelump >= 0)
|
if (curvelump >= 0)
|
||||||
{
|
{
|
||||||
|
@ -349,13 +351,9 @@ void S_Shutdown ()
|
||||||
{
|
{
|
||||||
FSoundChan *chan, *next;
|
FSoundChan *chan, *next;
|
||||||
|
|
||||||
chan = Channels;
|
S_StopMusic(true);
|
||||||
while (chan != NULL)
|
mus_playing.LastSong = ""; // If this isn't reset here, the song would attempt resume at the most inpopportune time...
|
||||||
{
|
S_StopAllChannels();
|
||||||
next = chan->NextChan;
|
|
||||||
S_StopChannel(chan);
|
|
||||||
chan = next;
|
|
||||||
}
|
|
||||||
|
|
||||||
GSnd->UpdateSounds();
|
GSnd->UpdateSounds();
|
||||||
for (chan = FreeChannels; chan != NULL; chan = next)
|
for (chan = FreeChannels; chan != NULL; chan = next)
|
||||||
|
@ -364,7 +362,13 @@ void S_Shutdown ()
|
||||||
delete chan;
|
delete chan;
|
||||||
}
|
}
|
||||||
FreeChannels = NULL;
|
FreeChannels = NULL;
|
||||||
|
|
||||||
|
if (GSnd != NULL)
|
||||||
|
{
|
||||||
|
I_CloseSound();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
|
@ -2614,7 +2618,7 @@ CCMD (snd_reset)
|
||||||
|
|
||||||
void S_SoundReset()
|
void S_SoundReset()
|
||||||
{
|
{
|
||||||
I_ShutdownMusic();
|
S_StopMusic(true);
|
||||||
S_EvictAllChannels();
|
S_EvictAllChannels();
|
||||||
I_CloseSound();
|
I_CloseSound();
|
||||||
I_InitSound();
|
I_InitSound();
|
||||||
|
|
|
@ -41,11 +41,6 @@
|
||||||
#include "v_text.h"
|
#include "v_text.h"
|
||||||
#include "files.h"
|
#include "files.h"
|
||||||
|
|
||||||
FPlayList::FPlayList (const char *path)
|
|
||||||
{
|
|
||||||
ChangeList (path);
|
|
||||||
}
|
|
||||||
|
|
||||||
FPlayList::~FPlayList ()
|
FPlayList::~FPlayList ()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,6 @@ class FileReader;
|
||||||
class FPlayList
|
class FPlayList
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FPlayList (const char *path);
|
|
||||||
~FPlayList ();
|
~FPlayList ();
|
||||||
|
|
||||||
bool ChangeList (const char *path);
|
bool ChangeList (const char *path);
|
||||||
|
@ -51,11 +50,16 @@ public:
|
||||||
int Backup ();
|
int Backup ();
|
||||||
void Shuffle ();
|
void Shuffle ();
|
||||||
const char *GetSong (int position) const;
|
const char *GetSong (int position) const;
|
||||||
|
void Clear()
|
||||||
|
{
|
||||||
|
Songs.Clear();
|
||||||
|
Position = 0;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static FString NextLine (FileReader &file);
|
static FString NextLine (FileReader &file);
|
||||||
|
|
||||||
unsigned int Position;
|
unsigned int Position = 0;
|
||||||
TArray<FString> Songs;
|
TArray<FString> Songs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -336,9 +336,6 @@ void I_Init()
|
||||||
CheckCPUID(&CPU);
|
CheckCPUID(&CPU);
|
||||||
CalculateCPUSpeed();
|
CalculateCPUSpeed();
|
||||||
DumpCPUInfo(&CPU);
|
DumpCPUInfo(&CPU);
|
||||||
|
|
||||||
atterm(I_ShutdownSound);
|
|
||||||
I_InitSound ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue