Attempt to fix memleak when quitting the game with music enabled (bug #25092)

This commit is contained in:
Charles Dang 2017-04-09 15:00:27 +11:00
parent be3cf5fa62
commit 92d1a26caf

View file

@ -146,7 +146,7 @@ private:
std::list< sound_cache_chunk > sound_cache;
typedef std::list< sound_cache_chunk >::iterator sound_cache_iterator;
std::map<std::string,Mix_Music*> music_cache;
std::map<std::string, std::shared_ptr<Mix_Music>> music_cache;
std::vector<std::string> played_before;
@ -486,19 +486,19 @@ static void play_new_music()
const std::string& filename = current_track.file_path();
std::map<std::string,Mix_Music*>::const_iterator itor = music_cache.find(filename);
auto itor = music_cache.find(filename);
if(itor == music_cache.end()) {
LOG_AUDIO << "attempting to insert track '" << filename << "' into cache\n";
SDL_RWops *rwops = filesystem::load_RWops(filename);
Mix_Music* const music = Mix_LoadMUSType_RW(rwops, MUS_NONE, true); // SDL takes ownership of rwops
const std::shared_ptr<Mix_Music> music(Mix_LoadMUSType_RW(rwops, MUS_NONE, true), &Mix_FreeMusic); // SDL takes ownership of rwops
if(music == nullptr) {
ERR_AUDIO << "Could not load music file '" << filename << "': "
<< Mix_GetError() << "\n";
return;
}
itor = music_cache.insert(std::pair<std::string,Mix_Music*>(filename,music)).first;
itor = music_cache.emplace(filename, music).first;
last_track=current_track;
}
@ -509,7 +509,7 @@ static void play_new_music()
fading_time=0;
}
const int res = Mix_FadeInMusic(itor->second, 1, fading_time);
const int res = Mix_FadeInMusic(itor->second.get(), 1, fading_time);
if(res < 0)
{
ERR_AUDIO << "Could not play music: " << Mix_GetError() << " " << filename <<" " << std::endl;
@ -606,7 +606,7 @@ void music_thinker::process(events::pump_info &info) {
if (unload_music) {
for (auto track : music_cache) {
Mix_FreeMusic(track.second);
Mix_FreeMusic(track.second.get());
}
music_cache.clear();