aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--al/source.cpp6
-rw-r--r--alc/voice.h11
2 files changed, 11 insertions, 6 deletions
diff --git a/al/source.cpp b/al/source.cpp
index b18ebe5d..54705e6a 100644
--- a/al/source.cpp
+++ b/al/source.cpp
@@ -2682,7 +2682,8 @@ START_API_FUNC
auto count_free_voices = [](const ALuint count, const ALvoice &voice) noexcept -> ALuint
{
if(voice.mPlayState.load(std::memory_order_acquire) == ALvoice::Stopped
- && voice.mSourceID.load(std::memory_order_relaxed) == 0u)
+ && voice.mSourceID.load(std::memory_order_relaxed) == 0u
+ && voice.mPendingStop.load(std::memory_order_relaxed) == false)
return count + 1;
return count;
};
@@ -2760,7 +2761,8 @@ START_API_FUNC
auto find_voice = [](const ALvoice &v) noexcept -> bool
{
return v.mPlayState.load(std::memory_order_acquire) == ALvoice::Stopped
- && v.mSourceID.load(std::memory_order_relaxed) == 0u;
+ && v.mSourceID.load(std::memory_order_relaxed) == 0u
+ && v.mPendingStop.load(std::memory_order_relaxed) == false;
};
auto voices_end = context->mVoices.data() + context->mVoices.size();
voice = std::find_if(context->mVoices.data(), voices_end, find_voice);
diff --git a/alc/voice.h b/alc/voice.h
index 73344271..e8daa0c7 100644
--- a/alc/voice.h
+++ b/alc/voice.h
@@ -199,10 +199,11 @@ struct ALvoice {
std::atomic<ALvoiceProps*> mUpdate{nullptr};
+ ALvoicePropsBase mProps;
+
std::atomic<ALuint> mSourceID{0u};
std::atomic<State> mPlayState{Stopped};
-
- ALvoicePropsBase mProps;
+ std::atomic<bool> mPendingStop{false};
/**
* Source offset in samples, relative to the currently playing buffer, NOT
@@ -268,11 +269,13 @@ struct ALvoice {
mUpdate.store(rhs.mUpdate.exchange(old_update, std::memory_order_relaxed),
std::memory_order_relaxed);
+ mProps = rhs.mProps;
+
mSourceID.store(rhs.mSourceID.load(std::memory_order_relaxed), std::memory_order_relaxed);
mPlayState.store(rhs.mPlayState.load(std::memory_order_relaxed),
std::memory_order_relaxed);
-
- mProps = rhs.mProps;
+ mPendingStop.store(rhs.mPendingStop.load(std::memory_order_relaxed),
+ std::memory_order_relaxed);
mPosition.store(rhs.mPosition.load(std::memory_order_relaxed), std::memory_order_relaxed);
mPositionFrac.store(rhs.mPositionFrac.load(std::memory_order_relaxed),