From ef2769af03825f278b855858681e4cbe55c0734b Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Wed, 4 Sep 2019 23:04:55 -0700 Subject: Use a normal vector for the voices array --- al/source.cpp | 55 +++++++++++++++++-------------------------------------- 1 file changed, 17 insertions(+), 38 deletions(-) (limited to 'al/source.cpp') diff --git a/al/source.cpp b/al/source.cpp index 86a7d94c..be565d58 100644 --- a/al/source.cpp +++ b/al/source.cpp @@ -77,10 +77,10 @@ using namespace std::placeholders; ALvoice *GetSourceVoice(ALsource *source, ALCcontext *context) { ALuint idx{source->VoiceIdx}; - if(idx < context->mVoiceCount.load(std::memory_order_relaxed)) + if(idx < context->mVoices.size()) { ALuint sid{source->id}; - ALvoice &voice = (*context->mVoices)[idx]; + ALvoice &voice = context->mVoices[idx]; if(voice.mSourceID.load(std::memory_order_acquire) == sid) return &voice; } @@ -2671,38 +2671,20 @@ START_API_FUNC } /* Count the number of reusable voices. */ - auto voices_end = context->mVoices->begin() + - context->mVoiceCount.load(std::memory_order_relaxed); - auto free_voices = std::accumulate(context->mVoices->begin(), voices_end, ALsizei{0}, - [](const ALsizei count, const ALvoice &voice) noexcept -> ALsizei - { - if(voice.mPlayState.load(std::memory_order_acquire) == ALvoice::Stopped && - voice.mSourceID.load(std::memory_order_relaxed) == 0u) - return count + 1; - return count; - } - ); + auto count_free_voices = [](const ALsizei count, const ALvoice &voice) noexcept -> ALsizei + { + if(voice.mPlayState.load(std::memory_order_acquire) == ALvoice::Stopped && + voice.mSourceID.load(std::memory_order_relaxed) == 0u) + return count + 1; + return count; + }; + auto free_voices = std::accumulate(context->mVoices.begin(), context->mVoices.end(), + ALsizei{0}, count_free_voices); if UNLIKELY(n > free_voices) { - /* Increment the number of voices to handle the request. */ + /* Increase the number of voices to handle the request. */ const ALuint need_voices{static_cast(n) - free_voices}; - const size_t rem_voices{context->mVoices->size() - - context->mVoiceCount.load(std::memory_order_relaxed)}; - - if UNLIKELY(need_voices > rem_voices) - { - /* Allocate more voices to get enough. */ - const size_t alloc_count{need_voices - rem_voices}; - if UNLIKELY(context->mVoices->size() > std::numeric_limits::max()-alloc_count) - SETERR_RETURN(context, AL_OUT_OF_MEMORY,, - "Overflow increasing voice count to %zu + %zu", context->mVoices->size(), - alloc_count); - - const size_t newcount{context->mVoices->size() + alloc_count}; - context->allocVoices(newcount); - } - - context->mVoiceCount.fetch_add(need_voices, std::memory_order_relaxed); + context->mVoices.resize(context->mVoices.size() + need_voices); } auto start_source = [&context,device](ALsource *source) -> void @@ -2757,9 +2739,8 @@ START_API_FUNC } /* Look for an unused voice to play this source with. */ - auto voices_end = context->mVoices->begin() + - context->mVoiceCount.load(std::memory_order_relaxed); - voice = std::find_if(context->mVoices->begin(), voices_end, + auto voices_end = context->mVoices.data() + context->mVoices.size(); + voice = std::find_if(context->mVoices.data(), voices_end, [](const ALvoice &voice) noexcept -> bool { return voice.mPlayState.load(std::memory_order_acquire) == ALvoice::Stopped && @@ -2767,7 +2748,7 @@ START_API_FUNC } ); assert(voice != voices_end); - auto vidx = static_cast(std::distance(context->mVoices->begin(), voice)); + auto vidx = static_cast(std::distance(context->mVoices.data(), voice)); voice->mPlayState.store(ALvoice::Stopped, std::memory_order_release); source->PropsClean.test_and_set(std::memory_order_acquire); @@ -3317,9 +3298,7 @@ ALsource::~ALsource() void UpdateAllSourceProps(ALCcontext *context) { std::lock_guard _{context->mSourceLock}; - auto voices_end = context->mVoices->begin() + - context->mVoiceCount.load(std::memory_order_relaxed); - std::for_each(context->mVoices->begin(), voices_end, + std::for_each(context->mVoices.begin(), context->mVoices.end(), [context](ALvoice &voice) -> void { ALuint sid{voice.mSourceID.load(std::memory_order_acquire)}; -- cgit v1.2.3