diff options
Diffstat (limited to 'al/source.cpp')
-rw-r--r-- | al/source.cpp | 90 |
1 files changed, 51 insertions, 39 deletions
diff --git a/al/source.cpp b/al/source.cpp index 3aaaaf90..a802cabc 100644 --- a/al/source.cpp +++ b/al/source.cpp @@ -2641,20 +2641,23 @@ START_API_FUNC if UNLIKELY(n <= 0) return; al::vector<ALsource*> extra_sources; - std::array<ALsource*,16> source_storage; - ALsource **srchandles{source_storage.data()}; - if UNLIKELY(static_cast<ALuint>(n) > source_storage.size()) + std::array<ALsource*,8> source_storage; + al::span<ALsource*> srchandles; + if LIKELY(static_cast<ALuint>(n) <= source_storage.size()) + srchandles = {source_storage.data(), static_cast<ALuint>(n)}; + else { extra_sources.resize(static_cast<ALuint>(n)); - srchandles = extra_sources.data(); + srchandles = {extra_sources.data(), extra_sources.size()}; } std::lock_guard<std::mutex> _{context->mSourceLock}; - for(ALsizei i{0};i < n;i++) + for(auto &srchdl : srchandles) { - srchandles[i] = LookupSource(context.get(), sources[i]); - if(!srchandles[i]) - SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid source ID %u", sources[i]); + srchdl = LookupSource(context.get(), *sources); + if(!srchdl) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid source ID %u", *sources); + ++sources; } ALCdevice *device{context->mDevice.get()}; @@ -2663,7 +2666,7 @@ START_API_FUNC if UNLIKELY(!device->Connected.load(std::memory_order_acquire)) { /* TODO: Send state change event? */ - std::for_each(srchandles, srchandles+n, + std::for_each(srchandles.begin(), srchandles.end(), [](ALsource *source) -> void { source->OffsetType = AL_NONE; @@ -2684,10 +2687,10 @@ START_API_FUNC }; auto free_voices = std::accumulate(context->mVoices.begin(), context->mVoices.end(), ALuint{0}, count_free_voices); - if UNLIKELY(static_cast<ALuint>(n) > free_voices) + if UNLIKELY(srchandles.size() > free_voices) { /* Increase the number of voices to handle the request. */ - const ALuint need_voices{static_cast<ALuint>(n) - free_voices}; + const size_t need_voices{srchandles.size() - free_voices}; context->mVoices.resize(context->mVoices.size() + need_voices); } @@ -2869,7 +2872,7 @@ START_API_FUNC SendStateChangeEvent(context.get(), source->id, AL_PLAYING); } }; - std::for_each(srchandles, srchandles+n, start_source); + std::for_each(srchandles.begin(), srchandles.end(), start_source); } END_API_FUNC @@ -2890,20 +2893,23 @@ START_API_FUNC if UNLIKELY(n <= 0) return; al::vector<ALsource*> extra_sources; - std::array<ALsource*,16> source_storage; - ALsource **srchandles{source_storage.data()}; - if UNLIKELY(static_cast<ALuint>(n) > source_storage.size()) + std::array<ALsource*,8> source_storage; + al::span<ALsource*> srchandles; + if LIKELY(static_cast<ALuint>(n) <= source_storage.size()) + srchandles = {source_storage.data(), static_cast<ALuint>(n)}; + else { extra_sources.resize(static_cast<ALuint>(n)); - srchandles = extra_sources.data(); + srchandles = {extra_sources.data(), extra_sources.size()}; } std::lock_guard<std::mutex> _{context->mSourceLock}; - for(ALsizei i{0};i < n;i++) + for(auto &srchdl : srchandles) { - srchandles[i] = LookupSource(context.get(), sources[i]); - if(!srchandles[i]) - SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid source ID %u", sources[i]); + srchdl = LookupSource(context.get(), *sources); + if(!srchdl) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid source ID %u", *sources); + ++sources; } ALCdevice *device{context->mDevice.get()}; @@ -2924,7 +2930,7 @@ START_API_FUNC SendStateChangeEvent(context.get(), source->id, AL_PAUSED); } }; - std::for_each(srchandles, srchandles+n, pause_source); + std::for_each(srchandles.begin(), srchandles.end(), pause_source); } END_API_FUNC @@ -2945,20 +2951,23 @@ START_API_FUNC if UNLIKELY(n <= 0) return; al::vector<ALsource*> extra_sources; - std::array<ALsource*,16> source_storage; - ALsource **srchandles{source_storage.data()}; - if UNLIKELY(static_cast<ALuint>(n) > source_storage.size()) + std::array<ALsource*,8> source_storage; + al::span<ALsource*> srchandles; + if LIKELY(static_cast<ALuint>(n) <= source_storage.size()) + srchandles = {source_storage.data(), static_cast<ALuint>(n)}; + else { extra_sources.resize(static_cast<ALuint>(n)); - srchandles = extra_sources.data(); + srchandles = {extra_sources.data(), extra_sources.size()}; } std::lock_guard<std::mutex> _{context->mSourceLock}; - for(ALsizei i{0};i < n;i++) + for(auto &srchdl : srchandles) { - srchandles[i] = LookupSource(context.get(), sources[i]); - if(!srchandles[i]) - SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid source ID %u", sources[i]); + srchdl = LookupSource(context.get(), *sources); + if(!srchdl) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid source ID %u", *sources); + ++sources; } ALCdevice *device{context->mDevice.get()}; @@ -2989,7 +2998,7 @@ START_API_FUNC source->OffsetType = AL_NONE; source->Offset = 0.0; }; - std::for_each(srchandles, srchandles+n, stop_source); + std::for_each(srchandles.begin(), srchandles.end(), stop_source); } END_API_FUNC @@ -3010,20 +3019,23 @@ START_API_FUNC if UNLIKELY(n <= 0) return; al::vector<ALsource*> extra_sources; - std::array<ALsource*,16> source_storage; - ALsource **srchandles{source_storage.data()}; - if UNLIKELY(static_cast<ALuint>(n) > source_storage.size()) + std::array<ALsource*,8> source_storage; + al::span<ALsource*> srchandles; + if LIKELY(static_cast<ALuint>(n) <= source_storage.size()) + srchandles = {source_storage.data(), static_cast<ALuint>(n)}; + else { extra_sources.resize(static_cast<ALuint>(n)); - srchandles = extra_sources.data(); + srchandles = {extra_sources.data(), extra_sources.size()}; } std::lock_guard<std::mutex> _{context->mSourceLock}; - for(ALsizei i{0};i < n;i++) + for(auto &srchdl : srchandles) { - srchandles[i] = LookupSource(context.get(), sources[i]); - if(!srchandles[i]) - SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid source ID %u", sources[i]); + srchdl = LookupSource(context.get(), *sources); + if(!srchdl) + SETERR_RETURN(context, AL_INVALID_NAME,, "Invalid source ID %u", *sources); + ++sources; } ALCdevice *device{context->mDevice.get()}; @@ -3050,7 +3062,7 @@ START_API_FUNC source->OffsetType = AL_NONE; source->Offset = 0.0; }; - std::for_each(srchandles, srchandles+n, rewind_source); + std::for_each(srchandles.begin(), srchandles.end(), rewind_source); } END_API_FUNC |