- 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:
Christoph Oelckers 2019-10-01 20:04:46 +02:00
parent 86ab366958
commit d2c156224b
20 changed files with 85 additions and 204 deletions

View file

@ -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;
}
} }

View file

@ -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);

View file

@ -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 -------------

View file

@ -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();
}

View file

@ -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();
}

View file

@ -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.

View file

@ -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

View file

@ -88,9 +88,6 @@ void I_Init(void)
CheckCPUID(&CPU); CheckCPUID(&CPU);
CalculateCPUSpeed(); CalculateCPUSpeed();
DumpCPUInfo(&CPU); DumpCPUInfo(&CPU);
atterm(I_ShutdownSound);
I_InitSound();
} }

View file

@ -97,9 +97,6 @@ void I_Init (void)
{ {
CheckCPUID (&CPU); CheckCPUID (&CPU);
DumpCPUInfo (&CPU); DumpCPUInfo (&CPU);
atterm(I_ShutdownSound);
I_InitSound ();
} }
// //

View file

@ -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)

View file

@ -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);

View file

@ -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)
{ {

View file

@ -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.

View file

@ -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

View file

@ -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 ()));
} }
} }

View file

@ -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;

View file

@ -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();

View file

@ -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 ()
{ {
} }

View file

@ -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;
}; };

View file

@ -336,9 +336,6 @@ void I_Init()
CheckCPUID(&CPU); CheckCPUID(&CPU);
CalculateCPUSpeed(); CalculateCPUSpeed();
DumpCPUInfo(&CPU); DumpCPUInfo(&CPU);
atterm(I_ShutdownSound);
I_InitSound ();
} }