diff --git a/al/source.cpp b/al/source.cpp index ec3c7d8a..5e34e1df 100644 --- a/al/source.cpp +++ b/al/source.cpp @@ -503,8 +503,8 @@ void InitVoice(Voice *voice, ALsource *source, ALbufferQueueItem *BufferList, AL voice->mAmbiScaling = IsUHJ(voice->mFmtChannels) ? AmbiScaling::UHJ : buffer->mAmbiScaling; voice->mAmbiOrder = (voice->mFmtChannels == FmtSuperStereo) ? 1 : buffer->mAmbiOrder; - if(buffer->mCallback) voice->mFlags |= VoiceIsCallback; - else if(source->SourceType == AL_STATIC) voice->mFlags |= VoiceIsStatic; + if(buffer->mCallback) voice->mFlags.set(VoiceIsCallback); + else if(source->SourceType == AL_STATIC) voice->mFlags.set(VoiceIsStatic); voice->mNumCallbackSamples = 0; voice->prepare(device); @@ -613,9 +613,9 @@ bool SetVoiceOffset(Voice *oldvoice, const VoicePos &vpos, ALsource *source, ALC newvoice->mPosition.store(vpos.pos, std::memory_order_relaxed); newvoice->mPositionFrac.store(vpos.frac, std::memory_order_relaxed); newvoice->mCurrentBuffer.store(vpos.bufferitem, std::memory_order_relaxed); - newvoice->mFlags = 0u; + newvoice->mFlags.reset(); if(vpos.pos > 0 || vpos.frac > 0 || vpos.bufferitem != &source->mQueue.front()) - newvoice->mFlags |= VoiceIsFading; + newvoice->mFlags.set(VoiceIsFading); InitVoice(newvoice, source, vpos.bufferitem, context, device); source->VoiceIdx = vidx; @@ -1268,7 +1268,7 @@ bool SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp prop, const a if(Voice *voice{GetSourceVoice(Source, Context)}) { - if((voice->mFlags&VoiceIsCallback)) + if(voice->mFlags.test(VoiceIsCallback)) SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Source offset for callback is invalid"); auto vpos = GetSampleOffset(Source->mQueue, prop, values[0]); @@ -1494,7 +1494,7 @@ bool SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, const a if(Voice *voice{GetSourceVoice(Source, Context)}) { - if((voice->mFlags&VoiceIsCallback)) + if(voice->mFlags.test(VoiceIsCallback)) SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Source offset for callback is invalid"); auto vpos = GetSampleOffset(Source->mQueue, prop, values[0]); @@ -3117,7 +3117,7 @@ START_API_FUNC voice->mPosition.store(0u, std::memory_order_relaxed); voice->mPositionFrac.store(0, std::memory_order_relaxed); voice->mCurrentBuffer.store(&source->mQueue.front(), std::memory_order_relaxed); - voice->mFlags = 0; + voice->mFlags.reset(); /* A source that's not playing or paused has any offset applied when it * starts playing. */ @@ -3132,7 +3132,7 @@ START_API_FUNC voice->mPositionFrac.store(vpos->frac, std::memory_order_relaxed); voice->mCurrentBuffer.store(vpos->bufferitem, std::memory_order_relaxed); if(vpos->pos!=0 || vpos->frac!=0 || vpos->bufferitem!=&source->mQueue.front()) - voice->mFlags |= VoiceIsFading; + voice->mFlags.set(VoiceIsFading); } } InitVoice(voice, source, std::addressof(*BufferList), context.get(), device); diff --git a/alc/alu.cpp b/alc/alu.cpp index 81b5c605..37d5a1ed 100644 --- a/alc/alu.cpp +++ b/alc/alu.cpp @@ -776,7 +776,7 @@ void CalcPanningAndFilters(Voice *voice, const float xpos, const float ypos, con break; } - voice->mFlags &= ~(VoiceHasHrtf | VoiceHasNfc); + voice->mFlags.reset(VoiceHasHrtf).reset(VoiceHasNfc); if(auto *decoder{voice->mDecoder.get()}) decoder->mWidthControl = props->EnhWidth; @@ -807,7 +807,7 @@ void CalcPanningAndFilters(Voice *voice, const float xpos, const float ypos, con voice->mChans[0].mDryParams.NFCtrlFilter.adjust(w0); } - voice->mFlags |= VoiceHasNfc; + voice->mFlags.set(VoiceHasNfc); } /* Panning a B-Format sound toward some direction is easy. Just pan the @@ -1040,7 +1040,7 @@ void CalcPanningAndFilters(Voice *voice, const float xpos, const float ypos, con } } - voice->mFlags |= VoiceHasHrtf; + voice->mFlags.set(VoiceHasHrtf); } else { @@ -1061,7 +1061,7 @@ void CalcPanningAndFilters(Voice *voice, const float xpos, const float ypos, con for(size_t c{0};c < num_channels;c++) voice->mChans[c].mDryParams.NFCtrlFilter.adjust(w0); - voice->mFlags |= VoiceHasNfc; + voice->mFlags.set(VoiceHasNfc); } /* Calculate the directional coefficients once, which apply to all @@ -1112,7 +1112,7 @@ void CalcPanningAndFilters(Voice *voice, const float xpos, const float ypos, con for(size_t c{0};c < num_channels;c++) voice->mChans[c].mDryParams.NFCtrlFilter.adjust(w0); - voice->mFlags |= VoiceHasNfc; + voice->mFlags.set(VoiceHasNfc); } for(size_t c{0};c < num_channels;c++) diff --git a/core/voice.cpp b/core/voice.cpp index 1eb804ac..924a8446 100644 --- a/core/voice.cpp +++ b/core/voice.cpp @@ -482,7 +482,7 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo ResamplerFunc Resample{(increment == MixerFracOne && DataPosFrac == 0) ? Resample_ : mResampler}; - uint Counter{(mFlags&VoiceIsFading) ? SamplesToDo : 0}; + uint Counter{mFlags.test(VoiceIsFading) ? SamplesToDo : 0}; if(!Counter) { /* No fading, just overwrite the old/current params. */ @@ -490,7 +490,7 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo { { DirectParams &parms = chandata.mDryParams; - if(!(mFlags&VoiceHasHrtf)) + if(!mFlags.test(VoiceHasHrtf)) parms.Gains.Current = parms.Gains.Target; else parms.Hrtf.Old = parms.Hrtf.Target; @@ -592,12 +592,12 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo std::copy_n(prevSamples->data(), MaxResamplerEdge, chanbuffer.data()); ++prevSamples; } - if((mFlags&VoiceIsStatic)) + if(mFlags.test(VoiceIsStatic)) LoadBufferStatic(BufferListItem, BufferLoopItem, DataPosInt, mFmtType, mFmtChannels, mFrameStep, SrcBufferSize, MixingSamples); - else if((mFlags&VoiceIsCallback)) + else if(mFlags.test(VoiceIsCallback)) { - if(!(mFlags&VoiceCallbackStopped)) + if(!mFlags.test(VoiceCallbackStopped)) { if(SrcBufferSize > mNumCallbackSamples) { @@ -607,10 +607,10 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo const int gotBytes{BufferListItem->mCallback(BufferListItem->mUserData, &BufferListItem->mSamples[byteOffset], static_cast(needBytes))}; if(gotBytes < 0) - mFlags |= VoiceCallbackStopped; + mFlags.set(VoiceCallbackStopped); else if(static_cast(gotBytes) < needBytes) { - mFlags |= VoiceCallbackStopped; + mFlags.set(VoiceCallbackStopped); mNumCallbackSamples += static_cast(static_cast(gotBytes) / mFrameSize); } @@ -650,7 +650,7 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo voiceSamples->data() + MaxResamplerEdge, DataPosFrac, increment, {Device->ResampledData, DstBufferSize})}; ++voiceSamples; - if((mFlags&VoiceIsAmbisonic)) + if(mFlags.test(VoiceIsAmbisonic)) chandata.mAmbiSplitter.processScale({ResampledData, DstBufferSize}, chandata.mAmbiHFScale, chandata.mAmbiLFScale); @@ -661,7 +661,7 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo const float *samples{DoFilters(parms.LowPass, parms.HighPass, FilterBuf.data(), {ResampledData, DstBufferSize}, mDirect.FilterType)}; - if((mFlags&VoiceHasHrtf)) + if(mFlags.test(VoiceHasHrtf)) { const float TargetGain{parms.Hrtf.Target.Gain * likely(vstate == Playing)}; DoHrtfMix(samples, DstBufferSize, parms, TargetGain, Counter, OutPos, @@ -671,7 +671,7 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo { const float *TargetGains{likely(vstate == Playing) ? parms.Gains.Target.data() : SilentTarget.data()}; - if((mFlags&VoiceHasNfc)) + if(mFlags.test(VoiceHasNfc)) DoNfcMix({samples, DstBufferSize}, mDirect.Buffer.data(), parms, TargetGains, Counter, OutPos, Device); else @@ -708,7 +708,7 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo { /* Do nothing extra when there's no buffers. */ } - else if((mFlags&VoiceIsStatic)) + else if(mFlags.test(VoiceIsStatic)) { if(BufferLoopItem) { @@ -731,7 +731,7 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo } } } - else if((mFlags&VoiceIsCallback)) + else if(mFlags.test(VoiceIsCallback)) { /* Don't use up the stored callback samples when stopping (pausing) * since they'll be replayed when resuming. @@ -769,7 +769,7 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo } } while(OutPos < SamplesToDo && likely(vstate == Playing)); - mFlags |= VoiceIsFading; + mFlags.set(VoiceIsFading); /* Don't update positions and buffers if we were stopping. */ if(unlikely(vstate == Stopping)) @@ -898,7 +898,7 @@ void Voice::prepare(DeviceBase *device) mChans[1].mAmbiLFScale = 1.293f; mChans[2].mAmbiLFScale = 1.293f; } - mFlags |= VoiceIsAmbisonic; + mFlags.set(VoiceIsAmbisonic); } else if(mFmtChannels == FmtUHJ2 && !device->mUhjEncoder) { @@ -919,7 +919,7 @@ void Voice::prepare(DeviceBase *device) mChans[0].mAmbiLFScale = 0.661f; mChans[1].mAmbiLFScale = 1.293f; mChans[2].mAmbiLFScale = 1.293f; - mFlags |= VoiceIsAmbisonic; + mFlags.set(VoiceIsAmbisonic); } else { @@ -929,6 +929,6 @@ void Voice::prepare(DeviceBase *device) chandata.mDryParams.NFCtrlFilter = device->mNFCtrlFilter; std::fill_n(chandata.mWetParams.begin(), device->NumAuxSends, SendParams{}); } - mFlags &= ~VoiceIsAmbisonic; + mFlags.reset(VoiceIsAmbisonic); } } diff --git a/core/voice.h b/core/voice.h index d7168fb9..70b80841 100644 --- a/core/voice.h +++ b/core/voice.h @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -164,13 +165,17 @@ struct VoicePropsItem : public VoiceProps { DEF_NEWDEL(VoicePropsItem) }; -constexpr uint VoiceIsStatic{ 1u<<0}; -constexpr uint VoiceIsCallback{ 1u<<1}; -constexpr uint VoiceIsAmbisonic{ 1u<<2}; /* Needs HF scaling for ambisonic upsampling. */ -constexpr uint VoiceCallbackStopped{1u<<3}; -constexpr uint VoiceIsFading{ 1u<<4}; /* Use gain stepping for smooth transitions. */ -constexpr uint VoiceHasHrtf{ 1u<<5}; -constexpr uint VoiceHasNfc{ 1u<<6}; +enum : uint { + VoiceIsStatic, + VoiceIsCallback, + VoiceIsAmbisonic, + VoiceCallbackStopped, + VoiceIsFading, + VoiceHasHrtf, + VoiceHasNfc, + + VoiceFlagCount +}; struct Voice { enum State { @@ -224,7 +229,7 @@ struct Voice { InterpState mResampleState; - uint mFlags{}; + std::bitset mFlags{}; uint mNumCallbackSamples{0}; struct TargetData {