Audio/Music: Fix datarace
This commit is contained in:
parent
c7b6d83bbc
commit
16922a9519
|
|
@ -63,7 +63,7 @@ namespace Nz
|
||||||
AudioFormat m_audioFormat;
|
AudioFormat m_audioFormat;
|
||||||
std::atomic_bool m_streaming;
|
std::atomic_bool m_streaming;
|
||||||
std::atomic<UInt64> m_processedSamples;
|
std::atomic<UInt64> m_processedSamples;
|
||||||
mutable std::mutex m_bufferLock;
|
mutable std::recursive_mutex m_sourceLock;
|
||||||
std::size_t m_bufferCount;
|
std::size_t m_bufferCount;
|
||||||
std::shared_ptr<SoundStream> m_stream;
|
std::shared_ptr<SoundStream> m_stream;
|
||||||
std::thread m_thread;
|
std::thread m_thread;
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@ namespace Nz
|
||||||
*/
|
*/
|
||||||
void Music::EnableLooping(bool loop)
|
void Music::EnableLooping(bool loop)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(m_bufferLock);
|
std::lock_guard<std::recursive_mutex> lock(m_sourceLock);
|
||||||
|
|
||||||
m_looping = loop;
|
m_looping = loop;
|
||||||
}
|
}
|
||||||
|
|
@ -135,7 +135,7 @@ namespace Nz
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// Prevent music thread from enqueuing new buffers while we're getting the count
|
// Prevent music thread from enqueuing new buffers while we're getting the count
|
||||||
std::lock_guard<std::mutex> lock(m_bufferLock);
|
std::lock_guard<std::recursive_mutex> lock(m_sourceLock);
|
||||||
|
|
||||||
UInt32 sampleOffset = m_source->GetSampleOffset();
|
UInt32 sampleOffset = m_source->GetSampleOffset();
|
||||||
UInt32 playingOffset = SafeCast<UInt32>((1000ULL * (sampleOffset + (m_processedSamples / GetChannelCount(m_stream->GetFormat())))) / m_sampleRate);
|
UInt32 playingOffset = SafeCast<UInt32>((1000ULL * (sampleOffset + (m_processedSamples / GetChannelCount(m_stream->GetFormat())))) / m_sampleRate);
|
||||||
|
|
@ -187,7 +187,7 @@ namespace Nz
|
||||||
{
|
{
|
||||||
NazaraAssert(m_stream, "Music not created");
|
NazaraAssert(m_stream, "Music not created");
|
||||||
|
|
||||||
std::lock_guard<std::mutex> lock(m_bufferLock);
|
std::lock_guard<std::recursive_mutex> lock(m_sourceLock);
|
||||||
|
|
||||||
SoundStatus status = m_source->GetStatus();
|
SoundStatus status = m_source->GetStatus();
|
||||||
|
|
||||||
|
|
@ -206,7 +206,7 @@ namespace Nz
|
||||||
*/
|
*/
|
||||||
bool Music::IsLooping() const
|
bool Music::IsLooping() const
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(m_bufferLock);
|
std::lock_guard<std::recursive_mutex> lock(m_sourceLock);
|
||||||
|
|
||||||
return m_looping;
|
return m_looping;
|
||||||
}
|
}
|
||||||
|
|
@ -268,7 +268,7 @@ namespace Nz
|
||||||
*/
|
*/
|
||||||
void Music::Pause()
|
void Music::Pause()
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(m_bufferLock);
|
std::lock_guard<std::recursive_mutex> lock(m_sourceLock);
|
||||||
|
|
||||||
m_source->Pause();
|
m_source->Pause();
|
||||||
}
|
}
|
||||||
|
|
@ -290,6 +290,8 @@ namespace Nz
|
||||||
// Maybe we are already playing
|
// Maybe we are already playing
|
||||||
if (m_streaming)
|
if (m_streaming)
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(m_sourceLock);
|
||||||
|
|
||||||
switch (GetStatus())
|
switch (GetStatus())
|
||||||
{
|
{
|
||||||
case SoundStatus::Playing:
|
case SoundStatus::Playing:
|
||||||
|
|
@ -446,7 +448,7 @@ namespace Nz
|
||||||
// Wait until buffers are processed
|
// Wait until buffers are processed
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(50));
|
std::this_thread::sleep_for(std::chrono::milliseconds(50));
|
||||||
|
|
||||||
std::lock_guard<std::mutex> lock(m_bufferLock);
|
std::lock_guard<std::recursive_mutex> lock(m_sourceLock);
|
||||||
|
|
||||||
SoundStatus status = m_source->GetStatus();
|
SoundStatus status = m_source->GetStatus();
|
||||||
if (status == SoundStatus::Stopped)
|
if (status == SoundStatus::Stopped)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue