Make isPlaying of music thread safe

This commit is contained in:
Benau 2018-11-08 01:00:17 +08:00
parent 01c79c746f
commit 866df61527
4 changed files with 21 additions and 8 deletions

View File

@ -123,6 +123,7 @@ MusicInformation::MusicInformation(const XMLNode *root,
MusicInformation::~MusicInformation()
{
std::lock_guard<std::mutex> lock(m_music_mutex);
if(m_normal_music) delete m_normal_music;
if(m_fast_music) delete m_fast_music;
} // ~MusicInformation
@ -146,6 +147,7 @@ void MusicInformation::startMusic()
m_time_since_faster = 0.0f;
m_mode = SOUND_NORMAL;
std::unique_lock<std::mutex> lock(m_music_mutex);
if (m_normal_music)
{
delete m_normal_music;
@ -180,9 +182,11 @@ void MusicInformation::startMusic()
{
m_normal_music = new MusicDummy();
}
lock.unlock();
if (m_normal_music->load(m_normal_filename) == false)
{
lock.lock();
delete m_normal_music;
m_normal_music = NULL;
Log::warn("MusicInformation", "Unable to load music %s, "
@ -206,6 +210,7 @@ void MusicInformation::startMusic()
return;
}
lock.lock();
#ifdef ENABLE_SOUND
if (UserConfigParams::m_enable_sound)
{
@ -216,9 +221,11 @@ void MusicInformation::startMusic()
{
m_fast_music = new MusicDummy();
}
lock.unlock();
if (m_fast_music->load(m_fast_filename) == false)
{
lock.lock();
delete m_fast_music;
m_fast_music = NULL;
Log::warn("MusicInformation", "Unabled to load fast music %s, not "
@ -281,6 +288,7 @@ void MusicInformation::update(float dt)
//-----------------------------------------------------------------------------
void MusicInformation::stopMusic()
{
std::lock_guard<std::mutex> lock(m_music_mutex);
if (m_normal_music != NULL)
{
m_normal_music->stopMusic();
@ -357,6 +365,7 @@ void MusicInformation::switchToFastMusic()
bool MusicInformation::isPlaying() const
{
std::lock_guard<std::mutex> lock(m_music_mutex);
return (m_normal_music != NULL && m_normal_music->isPlaying()) ||
(m_fast_music != NULL && m_fast_music->isPlaying());
}

View File

@ -19,6 +19,7 @@
#ifndef HEADER_MUSIC_INFORMATION_HPP
#define HEADER_MUSIC_INFORMATION_HPP
#include <mutex>
#include <string>
#include <stdexcept>
#include <vector>
@ -66,6 +67,7 @@ private:
/** Maximum pitch for faster music. */
float m_max_pitch;
static const int LOOP_FOREVER=-1;
mutable std::mutex m_music_mutex;
Music *m_normal_music,
*m_fast_music;
enum {SOUND_NORMAL, //!< normal music is played

View File

@ -38,7 +38,7 @@ MusicOggStream::MusicOggStream(float loop_start)
m_soundBuffers[0] = m_soundBuffers[1]= 0;
m_soundSource = -1;
m_pausedMusic = true;
m_playing = false;
m_playing.store(false);
m_loop_start = loop_start;
} // MusicOggStream
@ -168,7 +168,7 @@ bool MusicOggStream::release()
if(!m_error) ov_clear(&m_oggStream);
m_soundSource = -1;
m_playing = false;
m_playing.store(false);
return true;
} // release
@ -189,7 +189,7 @@ bool MusicOggStream::playMusic()
alSourcePlay(m_soundSource);
m_pausedMusic = false;
m_playing = true;
m_playing.store(true);
check("playMusic");
return true;
} // playMusic
@ -197,7 +197,7 @@ bool MusicOggStream::playMusic()
//-----------------------------------------------------------------------------
bool MusicOggStream::isPlaying()
{
return m_playing;
return m_playing.load();
/*
if (m_soundSource == -1) return false;
@ -212,14 +212,14 @@ bool MusicOggStream::isPlaying()
//-----------------------------------------------------------------------------
bool MusicOggStream::stopMusic()
{
m_playing = false;
m_playing.store(false);
return (release());
} // stopMusic
//-----------------------------------------------------------------------------
bool MusicOggStream::pauseMusic()
{
m_playing = false;
m_playing.store(false);
if (m_fileName == "")
{
// nothing is loaded
@ -234,7 +234,7 @@ bool MusicOggStream::pauseMusic()
//-----------------------------------------------------------------------------
bool MusicOggStream::resumeMusic()
{
m_playing = true;
m_playing.store(true);
if (m_fileName == "")
{

View File

@ -40,6 +40,8 @@
#endif
#include "audio/music.hpp"
#include <atomic>
/**
* \brief ogg files based implementation of the Music interface
* \ingroup audio
@ -78,7 +80,7 @@ private:
vorbis_info* m_vorbisInfo;
bool m_error;
bool m_playing;
std::atomic_bool m_playing;
ALuint m_soundBuffers[2];
ALuint m_soundSource;