Make isPlaying of music thread safe
This commit is contained in:
parent
01c79c746f
commit
866df61527
@ -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());
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 == "")
|
||||
{
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user