diff options
author | Chris Robinson <[email protected]> | 2021-01-22 00:00:10 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2021-01-22 00:00:10 -0800 |
commit | 5ff5fd8eccbdc5888b350059cb1f341a33ddf05f (patch) | |
tree | 3ffac7ebb7c57e050a1decae43a40a834b48cb57 | |
parent | 5729e1004da8dd8760fe3fa217faec4d3cd80427 (diff) |
Use a standard bitset for bitfield flags
-rw-r--r-- | alc/alc.cpp | 80 | ||||
-rw-r--r-- | alc/alcmain.h | 4 | ||||
-rw-r--r-- | alc/backends/alsa.cpp | 4 | ||||
-rw-r--r-- | alc/backends/dsound.cpp | 4 | ||||
-rw-r--r-- | alc/backends/oboe.cpp | 6 | ||||
-rw-r--r-- | alc/backends/pulseaudio.cpp | 6 | ||||
-rw-r--r-- | alc/backends/wasapi.cpp | 4 | ||||
-rw-r--r-- | alc/hrtf.cpp | 1 | ||||
-rw-r--r-- | common/albyte.h | 47 |
9 files changed, 56 insertions, 100 deletions
diff --git a/alc/alc.cpp b/alc/alc.cpp index 2b9eb2df..e7c85525 100644 --- a/alc/alc.cpp +++ b/alc/alc.cpp @@ -1804,9 +1804,9 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList) /* If a context is already running on the device, stop playback so the * device attributes can be updated. */ - if(device->Flags.get<DeviceRunning>()) + if(device->Flags.test(DeviceRunning)) device->Backend->stop(); - device->Flags.unset<DeviceRunning>(); + device->Flags.reset(DeviceRunning); UpdateClockBase(device); @@ -1833,7 +1833,7 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList) freq = ConfigValueUInt(devname, nullptr, "frequency").value_or(freq); if(freq < 1) - device->Flags.unset<FrequencyRequest>(); + device->Flags.reset(FrequencyRequest); else { freq = clampu(freq, MIN_OUTPUT_RATE, MAX_OUTPUT_RATE); @@ -1843,7 +1843,7 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList) device->BufferSize = static_cast<uint>(device->BufferSize*scale + 0.5); device->Frequency = freq; - device->Flags.set<FrequencyRequest>(); + device->Flags.set(FrequencyRequest); } if(auto persizeopt = ConfigValueUInt(devname, nullptr, "period_size")) @@ -1878,7 +1878,7 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList) new_sends = numSends; } - if(device->Flags.get<DeviceRunning>()) + if(device->Flags.test(DeviceRunning)) return ALC_NO_ERROR; device->AvgSpeakerDist = 0.0f; @@ -1927,7 +1927,7 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList) if(hrtf_userreq == Hrtf_Enable || (hrtf_userreq != Hrtf_Disable && hrtf_appreq == Hrtf_Enable)) { device->FmtChans = DevFmtStereo; - device->Flags.set<ChannelsRequest>(); + device->Flags.set(ChannelsRequest); } } @@ -1936,9 +1936,9 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList) oldType = device->FmtType; TRACE("Pre-reset: %s%s, %s%s, %s%uhz, %u / %u buffer\n", - device->Flags.get<ChannelsRequest>()?"*":"", DevFmtChannelsString(device->FmtChans), - device->Flags.get<SampleTypeRequest>()?"*":"", DevFmtTypeString(device->FmtType), - device->Flags.get<FrequencyRequest>()?"*":"", device->Frequency, + device->Flags.test(ChannelsRequest)?"*":"", DevFmtChannelsString(device->FmtChans), + device->Flags.test(SampleTypeRequest)?"*":"", DevFmtTypeString(device->FmtType), + device->Flags.test(FrequencyRequest)?"*":"", device->Frequency, device->UpdateSize, device->BufferSize); try { @@ -1951,22 +1951,22 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList) return ALC_INVALID_DEVICE; } - if(device->FmtChans != oldChans && device->Flags.get<ChannelsRequest>()) + if(device->FmtChans != oldChans && device->Flags.test(ChannelsRequest)) { ERR("Failed to set %s, got %s instead\n", DevFmtChannelsString(oldChans), DevFmtChannelsString(device->FmtChans)); - device->Flags.unset<ChannelsRequest>(); + device->Flags.reset(ChannelsRequest); } - if(device->FmtType != oldType && device->Flags.get<SampleTypeRequest>()) + if(device->FmtType != oldType && device->Flags.test(SampleTypeRequest)) { ERR("Failed to set %s, got %s instead\n", DevFmtTypeString(oldType), DevFmtTypeString(device->FmtType)); - device->Flags.unset<SampleTypeRequest>(); + device->Flags.reset(SampleTypeRequest); } - if(device->Frequency != oldFreq && device->Flags.get<FrequencyRequest>()) + if(device->Frequency != oldFreq && device->Flags.test(FrequencyRequest)) { WARN("Failed to set %uhz, got %uhz instead\n", oldFreq, device->Frequency); - device->Flags.unset<FrequencyRequest>(); + device->Flags.reset(FrequencyRequest); } TRACE("Post-reset: %s, %s, %uhz, %u / %u buffer\n", @@ -2263,12 +2263,12 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const int *attrList) } mixer_mode.leave(); - if(!device->Flags.get<DevicePaused>()) + if(!device->Flags.test(DevicePaused)) { try { auto backend = device->Backend.get(); backend->start(); - device->Flags.set<DeviceRunning>(); + device->Flags.set(DeviceRunning); } catch(al::backend_exception& e) { device->handleDisconnect("%s", e.what()); @@ -3367,10 +3367,10 @@ START_API_FUNC ALCdevice *Device{ctx->mDevice.get()}; std::lock_guard<std::mutex> _{Device->StateLock}; - if(!ctx->deinit() && Device->Flags.get<DeviceRunning>()) + if(!ctx->deinit() && Device->Flags.test(DeviceRunning)) { Device->Backend->stop(); - Device->Flags.unset<DeviceRunning>(); + Device->Flags.reset(DeviceRunning); } } END_API_FUNC @@ -3545,7 +3545,7 @@ START_API_FUNC { device->FmtChans = iter->chans; device->mAmbiOrder = iter->order; - device->Flags.set<ChannelsRequest>(); + device->Flags.set(ChannelsRequest); } } if(auto typeopt = ConfigValueStr(deviceName, nullptr, "sample-type")) @@ -3573,7 +3573,7 @@ START_API_FUNC else { device->FmtType = iter->type; - device->Flags.set<SampleTypeRequest>(); + device->Flags.set(SampleTypeRequest); } } @@ -3589,7 +3589,7 @@ START_API_FUNC device->UpdateSize = static_cast<uint>(device->UpdateSize*scale + 0.5); device->BufferSize = static_cast<uint>(device->BufferSize*scale + 0.5); device->Frequency = freq; - device->Flags.set<FrequencyRequest>(); + device->Flags.set(FrequencyRequest); } if(auto persizeopt = ConfigValueUInt(deviceName, nullptr, "period_size")) @@ -3698,9 +3698,9 @@ START_API_FUNC } orphanctxs.clear(); - if(dev->Flags.get<DeviceRunning>()) + if(dev->Flags.test(DeviceRunning)) dev->Backend->stop(); - dev->Flags.unset<DeviceRunning>(); + dev->Flags.reset(DeviceRunning); return ALC_TRUE; } @@ -3746,7 +3746,9 @@ START_API_FUNC device->Frequency = frequency; device->FmtChans = decompfmt->chans; device->FmtType = decompfmt->type; - device->Flags.set<FrequencyRequest, ChannelsRequest, SampleTypeRequest>(); + device->Flags.set(FrequencyRequest); + device->Flags.set(ChannelsRequest); + device->Flags.set(SampleTypeRequest); device->UpdateSize = static_cast<uint>(samples); device->BufferSize = static_cast<uint>(samples); @@ -3800,9 +3802,9 @@ START_API_FUNC listlock.unlock(); std::lock_guard<std::mutex> _{dev->StateLock}; - if(dev->Flags.get<DeviceRunning>()) + if(dev->Flags.test(DeviceRunning)) dev->Backend->stop(); - dev->Flags.unset<DeviceRunning>(); + dev->Flags.reset(DeviceRunning); return ALC_TRUE; } @@ -3821,12 +3823,12 @@ START_API_FUNC std::lock_guard<std::mutex> _{dev->StateLock}; if(!dev->Connected.load(std::memory_order_acquire)) alcSetError(dev.get(), ALC_INVALID_DEVICE); - else if(!dev->Flags.get<DeviceRunning>()) + else if(!dev->Flags.test(DeviceRunning)) { try { auto backend = dev->Backend.get(); backend->start(); - dev->Flags.set<DeviceRunning>(); + dev->Flags.set(DeviceRunning); } catch(al::backend_exception& e) { dev->handleDisconnect("%s", e.what()); @@ -3845,9 +3847,9 @@ START_API_FUNC else { std::lock_guard<std::mutex> _{dev->StateLock}; - if(dev->Flags.get<DeviceRunning>()) + if(dev->Flags.test(DeviceRunning)) dev->Backend->stop(); - dev->Flags.unset<DeviceRunning>(); + dev->Flags.reset(DeviceRunning); } } END_API_FUNC @@ -4007,10 +4009,10 @@ START_API_FUNC else { std::lock_guard<std::mutex> _{dev->StateLock}; - if(dev->Flags.get<DeviceRunning>()) + if(dev->Flags.test(DeviceRunning)) dev->Backend->stop(); - dev->Flags.unset<DeviceRunning>(); - dev->Flags.set<DevicePaused>(); + dev->Flags.reset(DeviceRunning); + dev->Flags.set(DevicePaused); } } END_API_FUNC @@ -4027,16 +4029,16 @@ START_API_FUNC } std::lock_guard<std::mutex> _{dev->StateLock}; - if(!dev->Flags.get<DevicePaused>()) + if(!dev->Flags.test(DevicePaused)) return; - dev->Flags.unset<DevicePaused>(); + dev->Flags.reset(DevicePaused); if(dev->mContexts.load()->empty()) return; try { auto backend = dev->Backend.get(); backend->start(); - dev->Flags.set<DeviceRunning>(); + dev->Flags.set(DeviceRunning); } catch(al::backend_exception& e) { dev->handleDisconnect("%s", e.what()); @@ -4092,9 +4094,9 @@ START_API_FUNC /* Force the backend to stop mixing first since we're resetting. Also reset * the connected state so lost devices can attempt recover. */ - if(dev->Flags.get<DeviceRunning>()) + if(dev->Flags.test(DeviceRunning)) dev->Backend->stop(); - dev->Flags.unset<DeviceRunning>(); + dev->Flags.reset(DeviceRunning); if(!dev->Connected.load(std::memory_order_relaxed)) { /* Make sure disconnection is finished before continuing on. */ diff --git a/alc/alcmain.h b/alc/alcmain.h index 31dbfd3c..e9309c40 100644 --- a/alc/alcmain.h +++ b/alc/alcmain.h @@ -4,6 +4,7 @@ #include <algorithm> #include <array> #include <atomic> +#include <bitset> #include <chrono> #include <cstdint> #include <cstddef> @@ -17,7 +18,6 @@ #include "AL/alc.h" #include "AL/alext.h" -#include "albyte.h" #include "almalloc.h" #include "alnumeric.h" #include "alspan.h" @@ -201,7 +201,7 @@ struct ALCdevice : public al::intrusive_ref<ALCdevice> { std::string DeviceName; // Device flags - al::bitfield<DeviceFlagsCount> Flags{}; + std::bitset<DeviceFlagsCount> Flags{}; // Maximum number of sources that can be created uint SourcesMax{}; diff --git a/alc/backends/alsa.cpp b/alc/backends/alsa.cpp index 814c2553..bdfdd040 100644 --- a/alc/backends/alsa.cpp +++ b/alc/backends/alsa.cpp @@ -746,8 +746,8 @@ bool AlsaPlayback::reset() } CHECK(snd_pcm_hw_params_set_channels(mPcmHandle, hp.get(), mDevice->channelsFromFmt())); /* set rate (implicitly constrains period/buffer parameters) */ - if(!GetConfigValueBool(mDevice->DeviceName.c_str(), "alsa", "allow-resampler", 0) || - !mDevice->Flags.get<FrequencyRequest>()) + if(!GetConfigValueBool(mDevice->DeviceName.c_str(), "alsa", "allow-resampler", 0) + || !mDevice->Flags.test(FrequencyRequest)) { if(snd_pcm_hw_params_set_rate_resample(mPcmHandle, hp.get(), 0) < 0) ERR("Failed to disable ALSA resampler\n"); diff --git a/alc/backends/dsound.cpp b/alc/backends/dsound.cpp index a09def73..aa3a92a0 100644 --- a/alc/backends/dsound.cpp +++ b/alc/backends/dsound.cpp @@ -377,7 +377,7 @@ bool DSoundPlayback::reset() mDevice->FmtType = DevFmtUByte; break; case DevFmtFloat: - if(mDevice->Flags.get<SampleTypeRequest>()) + if(mDevice->Flags.test(SampleTypeRequest)) break; /* fall-through */ case DevFmtUShort: @@ -398,7 +398,7 @@ bool DSoundPlayback::reset() if(SUCCEEDED(hr)) { speakers = DSSPEAKER_CONFIG(speakers); - if(!mDevice->Flags.get<ChannelsRequest>()) + if(!mDevice->Flags.test(ChannelsRequest)) { if(speakers == DSSPEAKER_MONO) mDevice->FmtChans = DevFmtMono; diff --git a/alc/backends/oboe.cpp b/alc/backends/oboe.cpp index 2913b6db..5b0d121d 100644 --- a/alc/backends/oboe.cpp +++ b/alc/backends/oboe.cpp @@ -87,9 +87,9 @@ bool OboePlayback::reset() builder.setFormatConversionAllowed(false); builder.setCallback(this); - if(mDevice->Flags.get<FrequencyRequest>()) + if(mDevice->Flags.test(FrequencyRequest)) builder.setSampleRate(static_cast<int32_t>(mDevice->Frequency)); - if(mDevice->Flags.get<ChannelsRequest>()) + if(mDevice->Flags.test(ChannelsRequest)) { /* Only use mono or stereo at user request. There's no telling what * other counts may be inferred as. @@ -98,7 +98,7 @@ bool OboePlayback::reset() : (mDevice->FmtChans==DevFmtStereo) ? oboe::ChannelCount::Stereo : oboe::ChannelCount::Unspecified); } - if(mDevice->Flags.get<SampleTypeRequest>()) + if(mDevice->Flags.test(SampleTypeRequest)) { oboe::AudioFormat format{oboe::AudioFormat::Unspecified}; switch(mDevice->FmtType) diff --git a/alc/backends/pulseaudio.cpp b/alc/backends/pulseaudio.cpp index 1b727335..a6aa93a5 100644 --- a/alc/backends/pulseaudio.cpp +++ b/alc/backends/pulseaudio.cpp @@ -793,7 +793,7 @@ void PulsePlayback::sinkInfoCallback(pa_context*, const pa_sink_info *info, int ); if(chaniter != chanmaps.cend()) { - if(!mDevice->Flags.get<ChannelsRequest>()) + if(!mDevice->Flags.test(ChannelsRequest)) mDevice->FmtChans = chaniter->fmt; } else @@ -914,8 +914,8 @@ bool PulsePlayback::reset() flags &= ~PA_STREAM_EARLY_REQUESTS; flags |= PA_STREAM_ADJUST_LATENCY; } - if(GetConfigValueBool(mDevice->DeviceName.c_str(), "pulse", "fix-rate", 0) || - !mDevice->Flags.get<FrequencyRequest>()) + if(GetConfigValueBool(mDevice->DeviceName.c_str(), "pulse", "fix-rate", 0) + || !mDevice->Flags.test(FrequencyRequest)) flags |= PA_STREAM_FIX_RATE; pa_channel_map chanmap{}; diff --git a/alc/backends/wasapi.cpp b/alc/backends/wasapi.cpp index a0eb814f..1d1b93c4 100644 --- a/alc/backends/wasapi.cpp +++ b/alc/backends/wasapi.cpp @@ -924,9 +924,9 @@ HRESULT WasapiPlayback::resetProxy() const ReferenceTime per_time{ReferenceTime{seconds{mDevice->UpdateSize}} / mDevice->Frequency}; const ReferenceTime buf_time{ReferenceTime{seconds{mDevice->BufferSize}} / mDevice->Frequency}; - if(!mDevice->Flags.get<FrequencyRequest>()) + if(!mDevice->Flags.test(FrequencyRequest)) mDevice->Frequency = OutputType.Format.nSamplesPerSec; - if(!mDevice->Flags.get<ChannelsRequest>()) + if(!mDevice->Flags.test(ChannelsRequest)) { const uint32_t chancount{OutputType.Format.nChannels}; const DWORD chanmask{OutputType.dwChannelMask}; diff --git a/alc/hrtf.cpp b/alc/hrtf.cpp index 6c40db70..3f4ddf61 100644 --- a/alc/hrtf.cpp +++ b/alc/hrtf.cpp @@ -41,6 +41,7 @@ #include <utility> #include "albit.h" +#include "albyte.h" #include "alcmain.h" #include "alconfig.h" #include "alfstream.h" diff --git a/common/albyte.h b/common/albyte.h index 29a0790f..b871164d 100644 --- a/common/albyte.h +++ b/common/albyte.h @@ -62,53 +62,6 @@ AL_DECL_OP(^, ^=) constexpr al::byte operator~(al::byte b) noexcept { return al::byte(~to_integer<uint>(b)); } - -namespace detail_ { - template<size_t> struct Elem { }; - template<> struct Elem<1> { using type = uint8_t; }; - template<> struct Elem<2> { using type = uint16_t; }; - template<> struct Elem<3> { using type = uint32_t; }; - template<> struct Elem<4> { using type = uint32_t; }; - - template<size_t N> using ElemT = typename Elem<N>::type; -} // namespace detail_ - -template<size_t N> -class bitfield { - static constexpr size_t bits_per_byte{std::numeric_limits<unsigned char>::digits}; - static constexpr size_t NumElems{(N+bits_per_byte-1) / bits_per_byte}; - - using storage_type = detail_::ElemT<NumElems>; - storage_type vals{}; - -public: - template<size_t b> - inline void set() noexcept - { - static_assert(b < N, "Bit index out of range"); - vals |= 1 << b; - } - template<size_t b> - inline void unset() noexcept - { - static_assert(b < N, "Bit index out of range"); - vals &= static_cast<storage_type>(~(1 << b)); - } - template<size_t b> - inline bool get() const noexcept - { - static_assert(b < N, "Bit index out of range"); - return (vals & (1 << b)) != 0; - } - - template<size_t b, size_t ...args> - std::enable_if_t<(sizeof...(args) > 0)> set() noexcept - { - set<b>(); - set<args...>(); - } -}; - } // namespace al #endif /* AL_BYTE_H */ |