aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--al/auxeffectslot.h16
-rw-r--r--al/eax/api.h10
-rw-r--r--al/eax/call.h42
-rw-r--r--al/eax/fx_slots.h9
-rw-r--r--al/effect.cpp14
-rw-r--r--al/effect.h10
-rw-r--r--al/effects/effects.h2
-rw-r--r--al/event.cpp2
-rw-r--r--al/source.cpp31
-rw-r--r--al/source.h8
-rw-r--r--alc/alc.cpp10
-rw-r--r--alc/alu.cpp4
-rw-r--r--alc/backends/alsa.cpp2
-rw-r--r--alc/backends/coreaudio.cpp4
-rw-r--r--alc/backends/dsound.cpp6
-rw-r--r--alc/backends/oboe.cpp4
-rw-r--r--alc/backends/oss.cpp2
-rw-r--r--alc/backends/pipewire.cpp5
-rw-r--r--alc/backends/portaudio.cpp4
-rw-r--r--alc/backends/sndio.cpp2
-rw-r--r--alc/backends/wasapi.cpp2
-rw-r--r--alc/backends/winmm.cpp5
-rw-r--r--alc/context.h2
-rw-r--r--alc/effects/base.h42
-rw-r--r--alc/effects/reverb.cpp5
-rw-r--r--common/albit.h7
-rw-r--r--common/almalloc.h56
-rw-r--r--common/alnumbers.h8
-rw-r--r--common/alnumeric.h2
-rw-r--r--common/alspan.h102
-rw-r--r--common/intrusive_ptr.h6
-rw-r--r--common/pffft.cpp30
-rw-r--r--common/ringbuffer.h25
-rw-r--r--common/vecmat.h8
-rw-r--r--core/async_event.h3
-rw-r--r--core/effects/base.h4
-rw-r--r--core/except.h6
-rw-r--r--examples/alffplay.cpp61
-rw-r--r--utils/alsoft-config/mainwindow.cpp4
39 files changed, 281 insertions, 284 deletions
diff --git a/al/auxeffectslot.h b/al/auxeffectslot.h
index 36216022..bfd4038e 100644
--- a/al/auxeffectslot.h
+++ b/al/auxeffectslot.h
@@ -89,12 +89,12 @@ struct ALeffectslot {
public:
void eax_initialize(ALCcontext& al_context, EaxFxSlotIndexValue index);
- EaxFxSlotIndexValue eax_get_index() const noexcept { return eax_fx_slot_index_; }
- const EAX50FXSLOTPROPERTIES& eax_get_eax_fx_slot() const noexcept
+ [[nodiscard]] auto eax_get_index() const noexcept -> EaxFxSlotIndexValue { return eax_fx_slot_index_; }
+ [[nodiscard]] auto eax_get_eax_fx_slot() const noexcept -> const EAX50FXSLOTPROPERTIES&
{ return eax_; }
// Returns `true` if all sources should be updated, or `false` otherwise.
- bool eax_dispatch(const EaxCall& call)
+ [[nodiscard]] auto eax_dispatch(const EaxCall& call) -> bool
{ return call.is_get() ? eax_get(call) : eax_set(call); }
void eax_commit();
@@ -282,14 +282,14 @@ private:
dst = src;
}
- constexpr bool eax4_fx_slot_is_legacy() const noexcept
+ [[nodiscard]] constexpr auto eax4_fx_slot_is_legacy() const noexcept -> bool
{ return eax_fx_slot_index_ < 2; }
void eax4_fx_slot_ensure_unlocked() const;
- static ALenum eax_get_efx_effect_type(const GUID& guid);
- const GUID& eax_get_eax_default_effect_guid() const noexcept;
- long eax_get_eax_default_lock() const noexcept;
+ [[nodiscard]] static auto eax_get_efx_effect_type(const GUID& guid) -> ALenum;
+ [[nodiscard]] auto eax_get_eax_default_effect_guid() const noexcept -> const GUID&;
+ [[nodiscard]] auto eax_get_eax_default_lock() const noexcept -> long;
void eax4_fx_slot_set_defaults(Eax4Props& props) noexcept;
void eax5_fx_slot_set_defaults(Eax5Props& props) noexcept;
@@ -312,7 +312,7 @@ private:
void eax4_fx_slot_set_all(const EaxCall& call);
void eax5_fx_slot_set_all(const EaxCall& call);
- bool eax_fx_slot_should_update_sources() const noexcept;
+ [[nodiscard]] auto eax_fx_slot_should_update_sources() const noexcept -> bool;
// Returns `true` if all sources should be updated, or `false` otherwise.
bool eax4_fx_slot_set(const EaxCall& call);
diff --git a/al/eax/api.h b/al/eax/api.h
index 18d93ef8..038fdf75 100644
--- a/al/eax/api.h
+++ b/al/eax/api.h
@@ -22,12 +22,12 @@
#ifndef _WIN32
-typedef struct _GUID {
+using GUID = struct _GUID {
std::uint32_t Data1;
std::uint16_t Data2;
std::uint16_t Data3;
- std::uint8_t Data4[8];
-} GUID;
+ std::array<std::uint8_t,8> Data4;
+};
inline bool operator==(const GUID& lhs, const GUID& rhs) noexcept
{ return std::memcmp(&lhs, &rhs, sizeof(GUID)) == 0; }
@@ -654,11 +654,11 @@ struct EAXSPEAKERLEVELPROPERTIES {
}; // EAXSPEAKERLEVELPROPERTIES
struct EAX40ACTIVEFXSLOTS {
- GUID guidActiveFXSlots[EAX40_MAX_ACTIVE_FXSLOTS];
+ std::array<GUID,EAX40_MAX_ACTIVE_FXSLOTS> guidActiveFXSlots;
}; // EAX40ACTIVEFXSLOTS
struct EAX50ACTIVEFXSLOTS {
- GUID guidActiveFXSlots[EAX50_MAX_ACTIVE_FXSLOTS];
+ std::array<GUID,EAX50_MAX_ACTIVE_FXSLOTS> guidActiveFXSlots;
}; // EAX50ACTIVEFXSLOTS
// Use this structure for EAXSOURCE_OBSTRUCTIONPARAMETERS property.
diff --git a/al/eax/call.h b/al/eax/call.h
index 45ff328c..04e94f3e 100644
--- a/al/eax/call.h
+++ b/al/eax/call.h
@@ -31,16 +31,16 @@ public:
ALvoid* property_buffer,
ALuint property_size);
- bool is_get() const noexcept { return mCallType == EaxCallType::get; }
- bool is_deferred() const noexcept { return mIsDeferred; }
- int get_version() const noexcept { return mVersion; }
- EaxCallPropertySetId get_property_set_id() const noexcept { return mPropertySetId; }
- ALuint get_property_id() const noexcept { return mPropertyId; }
- ALuint get_property_al_name() const noexcept { return mPropertySourceId; }
- EaxFxSlotIndex get_fx_slot_index() const noexcept { return mFxSlotIndex; }
+ [[nodiscard]] auto is_get() const noexcept -> bool { return mCallType == EaxCallType::get; }
+ [[nodiscard]] auto is_deferred() const noexcept -> bool { return mIsDeferred; }
+ [[nodiscard]] auto get_version() const noexcept -> int { return mVersion; }
+ [[nodiscard]] auto get_property_set_id() const noexcept -> EaxCallPropertySetId { return mPropertySetId; }
+ [[nodiscard]] auto get_property_id() const noexcept -> ALuint { return mPropertyId; }
+ [[nodiscard]] auto get_property_al_name() const noexcept -> ALuint { return mPropertySourceId; }
+ [[nodiscard]] auto get_fx_slot_index() const noexcept -> EaxFxSlotIndex { return mFxSlotIndex; }
template<typename TException, typename TValue>
- TValue& get_value() const
+ [[nodiscard]] auto get_value() const -> TValue&
{
if(mPropertyBufferSize < sizeof(TValue))
fail_too_small();
@@ -49,7 +49,7 @@ public:
}
template<typename TValue>
- al::span<TValue> get_values(size_t max_count) const
+ [[nodiscard]] auto get_values(size_t max_count) const -> al::span<TValue>
{
if(max_count == 0 || mPropertyBufferSize < sizeof(TValue))
fail_too_small();
@@ -59,28 +59,28 @@ public:
}
template<typename TValue>
- al::span<TValue> get_values() const
+ [[nodiscard]] auto get_values() const -> al::span<TValue>
{
return get_values<TValue>(~0_uz);
}
template<typename TException, typename TValue>
- void set_value(const TValue& value) const
+ auto set_value(const TValue& value) const -> void
{
get_value<TException, TValue>() = value;
}
private:
- const EaxCallType mCallType;
- int mVersion;
- EaxFxSlotIndex mFxSlotIndex;
- EaxCallPropertySetId mPropertySetId;
- bool mIsDeferred;
-
- const ALuint mPropertyId;
- const ALuint mPropertySourceId;
- ALvoid*const mPropertyBuffer;
- const ALuint mPropertyBufferSize;
+ const EaxCallType mCallType{};
+ int mVersion{};
+ EaxFxSlotIndex mFxSlotIndex{};
+ EaxCallPropertySetId mPropertySetId{};
+ bool mIsDeferred{};
+
+ const ALuint mPropertyId{};
+ const ALuint mPropertySourceId{};
+ ALvoid*const mPropertyBuffer{};
+ const ALuint mPropertyBufferSize{};
[[noreturn]] static void fail(const char* message);
[[noreturn]] static void fail_too_small();
diff --git a/al/eax/fx_slots.h b/al/eax/fx_slots.h
index 18b2d3ad..b7ed1031 100644
--- a/al/eax/fx_slots.h
+++ b/al/eax/fx_slots.h
@@ -25,11 +25,9 @@ public:
}
- const ALeffectslot& get(
- EaxFxSlotIndex index) const;
+ [[nodiscard]] auto get(EaxFxSlotIndex index) const -> const ALeffectslot&;
- ALeffectslot& get(
- EaxFxSlotIndex index);
+ [[nodiscard]] auto get(EaxFxSlotIndex index) -> ALeffectslot&;
private:
using Items = std::array<EaxAlEffectSlotUPtr, EAX_MAX_FXSLOTS>;
@@ -39,8 +37,7 @@ private:
[[noreturn]]
- static void fail(
- const char* message);
+ static void fail(const char* message);
void initialize_fx_slots(ALCcontext& al_context);
}; // EaxFxSlots
diff --git a/al/effect.cpp b/al/effect.cpp
index 3e48e91b..e99226c8 100644
--- a/al/effect.cpp
+++ b/al/effect.cpp
@@ -58,7 +58,7 @@
#include "eax/exception.h"
#endif // ALSOFT_EAX
-const EffectList gEffectList[16]{
+const std::array<EffectList,16> gEffectList{{
{ "eaxreverb", EAXREVERB_EFFECT, AL_EFFECT_EAXREVERB },
{ "reverb", REVERB_EFFECT, AL_EFFECT_REVERB },
{ "autowah", AUTOWAH_EFFECT, AL_EFFECT_AUTOWAH },
@@ -75,9 +75,7 @@ const EffectList gEffectList[16]{
{ "dedicated", DEDICATED_EFFECT, AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT },
{ "dedicated", DEDICATED_EFFECT, AL_EFFECT_DEDICATED_DIALOGUE },
{ "convolution", CONVOLUTION_EFFECT, AL_EFFECT_CONVOLUTION_SOFT },
-};
-
-bool DisabledEffects[MAX_EFFECTS];
+}};
effect_exception::effect_exception(ALenum code, const char *msg, ...) : mErrorCode{code}
@@ -328,7 +326,7 @@ FORCE_ALIGN void AL_APIENTRY alEffectiDirect(ALCcontext *context, ALuint effect,
{
for(const EffectList &effectitem : gEffectList)
{
- if(value == effectitem.val && !DisabledEffects[effectitem.type])
+ if(value == effectitem.val && !DisabledEffects.test(effectitem.type))
{
isOk = true;
break;
@@ -687,9 +685,9 @@ void LoadReverbPreset(const char *name, ALeffect *effect)
return;
}
- if(!DisabledEffects[EAXREVERB_EFFECT])
+ if(!DisabledEffects.test(EAXREVERB_EFFECT))
InitEffectParams(effect, AL_EFFECT_EAXREVERB);
- else if(!DisabledEffects[REVERB_EFFECT])
+ else if(!DisabledEffects.test(REVERB_EFFECT))
InitEffectParams(effect, AL_EFFECT_REVERB);
else
InitEffectParams(effect, AL_EFFECT_NULL);
@@ -742,7 +740,7 @@ bool IsValidEffectType(ALenum type) noexcept
for(const auto &effect_item : gEffectList)
{
- if(type == effect_item.val && !DisabledEffects[effect_item.type])
+ if(type == effect_item.val && !DisabledEffects.test(effect_item.type))
return true;
}
return false;
diff --git a/al/effect.h b/al/effect.h
index 27e9dd72..7c5c40dc 100644
--- a/al/effect.h
+++ b/al/effect.h
@@ -1,6 +1,8 @@
#ifndef AL_EFFECT_H
#define AL_EFFECT_H
+#include <array>
+#include <bitset>
#include <string_view>
#include "AL/al.h"
@@ -29,16 +31,14 @@ enum {
MAX_EFFECTS
};
-extern bool DisabledEffects[MAX_EFFECTS];
-
-extern float ReverbBoost;
+inline std::bitset<MAX_EFFECTS> DisabledEffects;
struct EffectList {
const char name[16];
- int type;
+ ALuint type;
ALenum val;
};
-extern const EffectList gEffectList[16];
+extern const std::array<EffectList,16> gEffectList;
struct ALeffect {
diff --git a/al/effects/effects.h b/al/effects/effects.h
index f30f256a..66fc8c44 100644
--- a/al/effects/effects.h
+++ b/al/effects/effects.h
@@ -24,7 +24,7 @@ public:
effect_exception(ALenum code, const char *msg, ...);
~effect_exception() override;
- ALenum errorCode() const noexcept { return mErrorCode; }
+ [[nodiscard]] auto errorCode() const noexcept -> ALenum { return mErrorCode; }
};
diff --git a/al/event.cpp b/al/event.cpp
index 8b76ceff..95b07dc2 100644
--- a/al/event.cpp
+++ b/al/event.cpp
@@ -118,7 +118,7 @@ int EventThread(ALCcontext *context)
};
auto proc_disconnect = [context,enabledevts](AsyncDisconnectEvent &evt)
{
- const std::string_view message{evt.msg};
+ const std::string_view message{evt.msg.data()};
context->debugMessage(DebugSource::System, DebugType::Error, 0,
DebugSeverity::High, message);
diff --git a/al/source.cpp b/al/source.cpp
index c9ec8f21..9c449434 100644
--- a/al/source.cpp
+++ b/al/source.cpp
@@ -3917,27 +3917,30 @@ void ALsource::eax4_translate(const Eax4Props& src, Eax5Props& dst) noexcept
// Active FX slots.
//
- for (auto i = 0; i < EAX50_MAX_ACTIVE_FXSLOTS; ++i) {
+ for(size_t i{0};i < EAX50_MAX_ACTIVE_FXSLOTS;++i)
+ {
auto& dst_id = dst.active_fx_slots.guidActiveFXSlots[i];
- if (i < EAX40_MAX_ACTIVE_FXSLOTS) {
+ if(i < EAX40_MAX_ACTIVE_FXSLOTS)
+ {
const auto& src_id = src.active_fx_slots.guidActiveFXSlots[i];
- if (src_id == EAX_NULL_GUID)
+ if(src_id == EAX_NULL_GUID)
dst_id = EAX_NULL_GUID;
- else if (src_id == EAX_PrimaryFXSlotID)
+ else if(src_id == EAX_PrimaryFXSlotID)
dst_id = EAX_PrimaryFXSlotID;
- else if (src_id == EAXPROPERTYID_EAX40_FXSlot0)
+ else if(src_id == EAXPROPERTYID_EAX40_FXSlot0)
dst_id = EAXPROPERTYID_EAX50_FXSlot0;
- else if (src_id == EAXPROPERTYID_EAX40_FXSlot1)
+ else if(src_id == EAXPROPERTYID_EAX40_FXSlot1)
dst_id = EAXPROPERTYID_EAX50_FXSlot1;
- else if (src_id == EAXPROPERTYID_EAX40_FXSlot2)
+ else if(src_id == EAXPROPERTYID_EAX40_FXSlot2)
dst_id = EAXPROPERTYID_EAX50_FXSlot2;
- else if (src_id == EAXPROPERTYID_EAX40_FXSlot3)
+ else if(src_id == EAXPROPERTYID_EAX40_FXSlot3)
dst_id = EAXPROPERTYID_EAX50_FXSlot3;
else
assert(false && "Unknown active FX slot ID.");
- } else
+ }
+ else
dst_id = EAX_NULL_GUID;
}
@@ -4359,7 +4362,7 @@ void ALsource::eax4_set(const EaxCall& call, Eax4Props& props)
break;
case EAXSOURCE_ACTIVEFXSLOTID:
- eax4_defer_active_fx_slot_id(call, props.active_fx_slots.guidActiveFXSlots);
+ eax4_defer_active_fx_slot_id(call, al::span{props.active_fx_slots.guidActiveFXSlots});
break;
default:
@@ -4440,7 +4443,7 @@ void ALsource::eax5_set(const EaxCall& call, Eax5Props& props)
break;
case EAXSOURCE_ACTIVEFXSLOTID:
- eax5_defer_active_fx_slot_id(call, props.active_fx_slots.guidActiveFXSlots);
+ eax5_defer_active_fx_slot_id(call, al::span{props.active_fx_slots.guidActiveFXSlots});
break;
case EAXSOURCE_MACROFXFACTOR:
@@ -4730,7 +4733,8 @@ void ALsource::eax4_get(const EaxCall& call, const Eax4Props& props)
break;
case EAXSOURCE_ACTIVEFXSLOTID:
- eax_get_active_fx_slot_id(call, props.active_fx_slots.guidActiveFXSlots, EAX40_MAX_ACTIVE_FXSLOTS);
+ eax_get_active_fx_slot_id(call, props.active_fx_slots.guidActiveFXSlots.data(),
+ EAX40_MAX_ACTIVE_FXSLOTS);
break;
default:
@@ -4802,7 +4806,8 @@ void ALsource::eax5_get(const EaxCall& call, const Eax5Props& props)
break;
case EAXSOURCE_ACTIVEFXSLOTID:
- eax_get_active_fx_slot_id(call, props.active_fx_slots.guidActiveFXSlots, EAX50_MAX_ACTIVE_FXSLOTS);
+ eax_get_active_fx_slot_id(call, props.active_fx_slots.guidActiveFXSlots.data(),
+ EAX50_MAX_ACTIVE_FXSLOTS);
break;
case EAXSOURCE_MACROFXFACTOR:
diff --git a/al/source.h b/al/source.h
index c7694f83..26d425ef 100644
--- a/al/source.h
+++ b/al/source.h
@@ -978,21 +978,21 @@ private:
}
template<typename TValidator, size_t TIdCount>
- void eax_defer_active_fx_slot_id(const EaxCall& call, GUID (&dst_ids)[TIdCount])
+ void eax_defer_active_fx_slot_id(const EaxCall& call, const al::span<GUID,TIdCount> dst_ids)
{
const auto src_ids = call.get_values<const GUID>(TIdCount);
std::for_each(src_ids.cbegin(), src_ids.cend(), TValidator{});
- std::uninitialized_copy(src_ids.cbegin(), src_ids.cend(), dst_ids);
+ std::uninitialized_copy(src_ids.cbegin(), src_ids.cend(), dst_ids.begin());
}
template<size_t TIdCount>
- void eax4_defer_active_fx_slot_id(const EaxCall& call, GUID (&dst_ids)[TIdCount])
+ void eax4_defer_active_fx_slot_id(const EaxCall& call, const al::span<GUID,TIdCount> dst_ids)
{
eax_defer_active_fx_slot_id<Eax4ActiveFxSlotIdValidator>(call, dst_ids);
}
template<size_t TIdCount>
- void eax5_defer_active_fx_slot_id(const EaxCall& call, GUID (&dst_ids)[TIdCount])
+ void eax5_defer_active_fx_slot_id(const EaxCall& call, const al::span<GUID,TIdCount> dst_ids)
{
eax_defer_active_fx_slot_id<Eax5ActiveFxSlotIdValidator>(call, dst_ids);
}
diff --git a/alc/alc.cpp b/alc/alc.cpp
index 9a919032..1ceae5ee 100644
--- a/alc/alc.cpp
+++ b/alc/alc.cpp
@@ -660,7 +660,7 @@ void alc_initconfig(void)
{
if(len == strlen(effectitem.name) &&
strncmp(effectitem.name, str, len) == 0)
- DisabledEffects[effectitem.type] = true;
+ DisabledEffects.set(effectitem.type);
}
} while(next++);
}
@@ -683,15 +683,15 @@ void alc_initconfig(void)
else
eax_g_is_enabled = true;
- if((DisabledEffects[EAXREVERB_EFFECT] || DisabledEffects[CHORUS_EFFECT])
+ if((DisabledEffects.test(EAXREVERB_EFFECT) || DisabledEffects.test(CHORUS_EFFECT))
&& eax_g_is_enabled)
{
eax_g_is_enabled = false;
TRACE("EAX disabled because %s disabled.\n",
- (DisabledEffects[EAXREVERB_EFFECT] && DisabledEffects[CHORUS_EFFECT])
+ (DisabledEffects.test(EAXREVERB_EFFECT) && DisabledEffects.test(CHORUS_EFFECT))
? "EAXReverb and Chorus are" :
- DisabledEffects[EAXREVERB_EFFECT] ? "EAXReverb is" :
- DisabledEffects[CHORUS_EFFECT] ? "Chorus is" : "");
+ DisabledEffects.test(EAXREVERB_EFFECT) ? "EAXReverb is" :
+ DisabledEffects.test(CHORUS_EFFECT) ? "Chorus is" : "");
}
}
#endif // ALSOFT_EAX
diff --git a/alc/alu.cpp b/alc/alu.cpp
index 7b3cd957..fe47f9be 100644
--- a/alc/alu.cpp
+++ b/alc/alu.cpp
@@ -2257,10 +2257,10 @@ void DeviceBase::handleDisconnect(const char *msg, ...)
va_list args;
va_start(args, msg);
- int msglen{vsnprintf(disconnect.msg, sizeof(disconnect.msg), msg, args)};
+ int msglen{vsnprintf(disconnect.msg.data(), disconnect.msg.size(), msg, args)};
va_end(args);
- if(msglen < 0 || static_cast<size_t>(msglen) >= sizeof(disconnect.msg))
+ if(msglen < 0 || static_cast<size_t>(msglen) >= disconnect.msg.size())
disconnect.msg[sizeof(disconnect.msg)-1] = 0;
for(ContextBase *ctx : *mContexts.load())
diff --git a/alc/backends/alsa.cpp b/alc/backends/alsa.cpp
index 5aae834a..47c6385e 100644
--- a/alc/backends/alsa.cpp
+++ b/alc/backends/alsa.cpp
@@ -1039,7 +1039,7 @@ void AlsaCapture::captureSamples(std::byte *buffer, uint samples)
{
if(mRing)
{
- mRing->read(buffer, samples);
+ std::ignore = mRing->read(buffer, samples);
return;
}
diff --git a/alc/backends/coreaudio.cpp b/alc/backends/coreaudio.cpp
index 16b0781e..50e3bc66 100644
--- a/alc/backends/coreaudio.cpp
+++ b/alc/backends/coreaudio.cpp
@@ -657,7 +657,7 @@ OSStatus CoreAudioCapture::RecordProc(AudioUnitRenderActionFlags *ioActionFlags,
return err;
}
- mRing->write(mCaptureData.data(), inNumberFrames);
+ std::ignore = mRing->write(mCaptureData.data(), inNumberFrames);
return noErr;
}
@@ -924,7 +924,7 @@ void CoreAudioCapture::captureSamples(std::byte *buffer, uint samples)
{
if(!mConverter)
{
- mRing->read(buffer, samples);
+ std::ignore = mRing->read(buffer, samples);
return;
}
diff --git a/alc/backends/dsound.cpp b/alc/backends/dsound.cpp
index 58aa69b2..12196f74 100644
--- a/alc/backends/dsound.cpp
+++ b/alc/backends/dsound.cpp
@@ -717,7 +717,7 @@ void DSoundCapture::stop()
}
void DSoundCapture::captureSamples(std::byte *buffer, uint samples)
-{ mRing->read(buffer, samples); }
+{ std::ignore = mRing->read(buffer, samples); }
uint DSoundCapture::availableSamples()
{
@@ -740,9 +740,9 @@ uint DSoundCapture::availableSamples()
}
if(SUCCEEDED(hr))
{
- mRing->write(ReadPtr1, ReadCnt1/FrameSize);
+ std::ignore = mRing->write(ReadPtr1, ReadCnt1/FrameSize);
if(ReadPtr2 != nullptr && ReadCnt2 > 0)
- mRing->write(ReadPtr2, ReadCnt2/FrameSize);
+ std::ignore = mRing->write(ReadPtr2, ReadCnt2/FrameSize);
hr = mDSCbuffer->Unlock(ReadPtr1, ReadCnt1, ReadPtr2, ReadCnt2);
mCursor = ReadCursor;
}
diff --git a/alc/backends/oboe.cpp b/alc/backends/oboe.cpp
index b7bab19a..9666063a 100644
--- a/alc/backends/oboe.cpp
+++ b/alc/backends/oboe.cpp
@@ -230,7 +230,7 @@ struct OboeCapture final : public BackendBase, public oboe::AudioStreamCallback
oboe::DataCallbackResult OboeCapture::onAudioReady(oboe::AudioStream*, void *audioData,
int32_t numFrames)
{
- mRing->write(audioData, static_cast<uint32_t>(numFrames));
+ std::ignore = mRing->write(audioData, static_cast<uint32_t>(numFrames));
return oboe::DataCallbackResult::Continue;
}
@@ -330,7 +330,7 @@ uint OboeCapture::availableSamples()
{ return static_cast<uint>(mRing->readSpace()); }
void OboeCapture::captureSamples(std::byte *buffer, uint samples)
-{ mRing->read(buffer, samples); }
+{ std::ignore = mRing->read(buffer, samples); }
} // namespace
diff --git a/alc/backends/oss.cpp b/alc/backends/oss.cpp
index 87d3ba35..010b0749 100644
--- a/alc/backends/oss.cpp
+++ b/alc/backends/oss.cpp
@@ -617,7 +617,7 @@ void OSScapture::stop()
}
void OSScapture::captureSamples(std::byte *buffer, uint samples)
-{ mRing->read(buffer, samples); }
+{ std::ignore = mRing->read(buffer, samples); }
uint OSScapture::availableSamples()
{ return static_cast<uint>(mRing->readSpace()); }
diff --git a/alc/backends/pipewire.cpp b/alc/backends/pipewire.cpp
index 01896b01..96b6623f 100644
--- a/alc/backends/pipewire.cpp
+++ b/alc/backends/pipewire.cpp
@@ -1933,7 +1933,8 @@ void PipeWireCapture::inputCallback() noexcept
const uint offset{minu(bufdata->chunk->offset, bufdata->maxsize)};
const uint size{minu(bufdata->chunk->size, bufdata->maxsize - offset)};
- mRing->write(static_cast<char*>(bufdata->data) + offset, size / mRing->getElemSize());
+ std::ignore = mRing->write(static_cast<char*>(bufdata->data) + offset,
+ size / mRing->getElemSize());
pw_stream_queue_buffer(mStream.get(), pw_buf);
}
@@ -2154,7 +2155,7 @@ uint PipeWireCapture::availableSamples()
{ return static_cast<uint>(mRing->readSpace()); }
void PipeWireCapture::captureSamples(std::byte *buffer, uint samples)
-{ mRing->read(buffer, samples); }
+{ std::ignore = mRing->read(buffer, samples); }
} // namespace
diff --git a/alc/backends/portaudio.cpp b/alc/backends/portaudio.cpp
index 979a54d6..2e2e33cc 100644
--- a/alc/backends/portaudio.cpp
+++ b/alc/backends/portaudio.cpp
@@ -271,7 +271,7 @@ PortCapture::~PortCapture()
int PortCapture::readCallback(const void *inputBuffer, void*, unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo*, const PaStreamCallbackFlags) noexcept
{
- mRing->write(inputBuffer, framesPerBuffer);
+ std::ignore = mRing->write(inputBuffer, framesPerBuffer);
return 0;
}
@@ -350,7 +350,7 @@ uint PortCapture::availableSamples()
{ return static_cast<uint>(mRing->readSpace()); }
void PortCapture::captureSamples(std::byte *buffer, uint samples)
-{ mRing->read(buffer, samples); }
+{ std::ignore = mRing->read(buffer, samples); }
} // namespace
diff --git a/alc/backends/sndio.cpp b/alc/backends/sndio.cpp
index d54c337b..8bf63a59 100644
--- a/alc/backends/sndio.cpp
+++ b/alc/backends/sndio.cpp
@@ -497,7 +497,7 @@ void SndioCapture::stop()
}
void SndioCapture::captureSamples(std::byte *buffer, uint samples)
-{ mRing->read(buffer, samples); }
+{ std::ignore = mRing->read(buffer, samples); }
uint SndioCapture::availableSamples()
{ return static_cast<uint>(mRing->readSpace()); }
diff --git a/alc/backends/wasapi.cpp b/alc/backends/wasapi.cpp
index 436ee402..139fa696 100644
--- a/alc/backends/wasapi.cpp
+++ b/alc/backends/wasapi.cpp
@@ -2651,7 +2651,7 @@ void WasapiCapture::stopProxy()
void WasapiCapture::captureSamples(std::byte *buffer, uint samples)
-{ mRing->read(buffer, samples); }
+{ std::ignore = mRing->read(buffer, samples); }
uint WasapiCapture::availableSamples()
{ return static_cast<uint>(mRing->readSpace()); }
diff --git a/alc/backends/winmm.cpp b/alc/backends/winmm.cpp
index f0fb0a1c..15776d17 100644
--- a/alc/backends/winmm.cpp
+++ b/alc/backends/winmm.cpp
@@ -435,7 +435,8 @@ int WinMMCapture::captureProc()
WAVEHDR &waveHdr = mWaveBuffer[widx];
widx = (widx+1) % mWaveBuffer.size();
- mRing->write(waveHdr.lpData, waveHdr.dwBytesRecorded / mFormat.nBlockAlign);
+ std::ignore = mRing->write(waveHdr.lpData,
+ waveHdr.dwBytesRecorded / mFormat.nBlockAlign);
mReadable.fetch_sub(1, std::memory_order_acq_rel);
waveInAddBuffer(mInHdl, &waveHdr, sizeof(WAVEHDR));
} while(--todo);
@@ -573,7 +574,7 @@ void WinMMCapture::stop()
}
void WinMMCapture::captureSamples(std::byte *buffer, uint samples)
-{ mRing->read(buffer, samples); }
+{ std::ignore = mRing->read(buffer, samples); }
uint WinMMCapture::availableSamples()
{ return static_cast<uint>(mRing->readSpace()); }
diff --git a/alc/context.h b/alc/context.h
index b190c5ea..32db76c7 100644
--- a/alc/context.h
+++ b/alc/context.h
@@ -560,7 +560,7 @@ private:
using ContextRef = al::intrusive_ptr<ALCcontext>;
-ContextRef GetContextRef(void);
+ContextRef GetContextRef();
void UpdateContextProps(ALCcontext *context);
diff --git a/alc/effects/base.h b/alc/effects/base.h
index 95695857..025ac663 100644
--- a/alc/effects/base.h
+++ b/alc/effects/base.h
@@ -4,23 +4,29 @@
#include "core/effects/base.h"
-EffectStateFactory *NullStateFactory_getFactory(void);
-EffectStateFactory *ReverbStateFactory_getFactory(void);
-EffectStateFactory *StdReverbStateFactory_getFactory(void);
-EffectStateFactory *AutowahStateFactory_getFactory(void);
-EffectStateFactory *ChorusStateFactory_getFactory(void);
-EffectStateFactory *CompressorStateFactory_getFactory(void);
-EffectStateFactory *DistortionStateFactory_getFactory(void);
-EffectStateFactory *EchoStateFactory_getFactory(void);
-EffectStateFactory *EqualizerStateFactory_getFactory(void);
-EffectStateFactory *FlangerStateFactory_getFactory(void);
-EffectStateFactory *FshifterStateFactory_getFactory(void);
-EffectStateFactory *ModulatorStateFactory_getFactory(void);
-EffectStateFactory *PshifterStateFactory_getFactory(void);
-EffectStateFactory* VmorpherStateFactory_getFactory(void);
-
-EffectStateFactory *DedicatedStateFactory_getFactory(void);
-
-EffectStateFactory *ConvolutionStateFactory_getFactory(void);
+/* This is a user config option for modifying the overall output of the reverb
+ * effect.
+ */
+inline float ReverbBoost{1.0f};
+
+
+EffectStateFactory *NullStateFactory_getFactory();
+EffectStateFactory *ReverbStateFactory_getFactory();
+EffectStateFactory *StdReverbStateFactory_getFactory();
+EffectStateFactory *AutowahStateFactory_getFactory();
+EffectStateFactory *ChorusStateFactory_getFactory();
+EffectStateFactory *CompressorStateFactory_getFactory();
+EffectStateFactory *DistortionStateFactory_getFactory();
+EffectStateFactory *EchoStateFactory_getFactory();
+EffectStateFactory *EqualizerStateFactory_getFactory();
+EffectStateFactory *FlangerStateFactory_getFactory();
+EffectStateFactory *FshifterStateFactory_getFactory();
+EffectStateFactory *ModulatorStateFactory_getFactory();
+EffectStateFactory *PshifterStateFactory_getFactory();
+EffectStateFactory* VmorpherStateFactory_getFactory();
+
+EffectStateFactory *DedicatedStateFactory_getFactory();
+
+EffectStateFactory *ConvolutionStateFactory_getFactory();
#endif /* EFFECTS_BASE_H */
diff --git a/alc/effects/reverb.cpp b/alc/effects/reverb.cpp
index 6a9d1997..5157cf72 100644
--- a/alc/effects/reverb.cpp
+++ b/alc/effects/reverb.cpp
@@ -48,11 +48,6 @@
#include "vecmat.h"
#include "vector.h"
-/* This is a user config option for modifying the overall output of the reverb
- * effect.
- */
-float ReverbBoost = 1.0f;
-
namespace {
using uint = unsigned int;
diff --git a/common/albit.h b/common/albit.h
index 82a4a00d..d54a189c 100644
--- a/common/albit.h
+++ b/common/albit.h
@@ -1,6 +1,7 @@
#ifndef AL_BIT_H
#define AL_BIT_H
+#include <array>
#include <cstdint>
#include <cstring>
#include <limits>
@@ -17,9 +18,9 @@ std::enable_if_t<sizeof(To) == sizeof(From) && std::is_trivially_copyable_v<From
&& std::is_trivially_copyable_v<To>,
To> bit_cast(const From &src) noexcept
{
- alignas(To) char dst[sizeof(To)];
- std::memcpy(&dst[0], &src, sizeof(To));
- return *std::launder(reinterpret_cast<To*>(&dst[0]));
+ alignas(To) std::array<char,sizeof(To)> dst;
+ std::memcpy(dst.data(), &src, sizeof(To));
+ return *std::launder(reinterpret_cast<To*>(dst.data()));
}
#ifdef __BYTE_ORDER__
diff --git a/common/almalloc.h b/common/almalloc.h
index 873473ca..288b5075 100644
--- a/common/almalloc.h
+++ b/common/almalloc.h
@@ -211,34 +211,34 @@ struct FlexArray {
FlexArray(index_type size) : mStore{size} { }
~FlexArray() = default;
- index_type size() const noexcept { return mStore.mSize; }
- bool empty() const noexcept { return mStore.mSize == 0; }
-
- pointer data() noexcept { return mStore.mArray; }
- const_pointer data() const noexcept { return mStore.mArray; }
-
- reference operator[](index_type i) noexcept { return mStore.mArray[i]; }
- const_reference operator[](index_type i) const noexcept { return mStore.mArray[i]; }
-
- reference front() noexcept { return mStore.mArray[0]; }
- const_reference front() const noexcept { return mStore.mArray[0]; }
-
- reference back() noexcept { return mStore.mArray[mStore.mSize-1]; }
- const_reference back() const noexcept { return mStore.mArray[mStore.mSize-1]; }
-
- iterator begin() noexcept { return mStore.mArray; }
- const_iterator begin() const noexcept { return mStore.mArray; }
- const_iterator cbegin() const noexcept { return mStore.mArray; }
- iterator end() noexcept { return mStore.mArray + mStore.mSize; }
- const_iterator end() const noexcept { return mStore.mArray + mStore.mSize; }
- const_iterator cend() const noexcept { return mStore.mArray + mStore.mSize; }
-
- reverse_iterator rbegin() noexcept { return end(); }
- const_reverse_iterator rbegin() const noexcept { return end(); }
- const_reverse_iterator crbegin() const noexcept { return cend(); }
- reverse_iterator rend() noexcept { return begin(); }
- const_reverse_iterator rend() const noexcept { return begin(); }
- const_reverse_iterator crend() const noexcept { return cbegin(); }
+ [[nodiscard]] auto size() const noexcept -> index_type { return mStore.mSize; }
+ [[nodiscard]] auto empty() const noexcept -> bool { return mStore.mSize == 0; }
+
+ [[nodiscard]] auto data() noexcept -> pointer { return mStore.mArray; }
+ [[nodiscard]] auto data() const noexcept -> const_pointer { return mStore.mArray; }
+
+ [[nodiscard]] auto operator[](index_type i) noexcept -> reference { return mStore.mArray[i]; }
+ [[nodiscard]] auto operator[](index_type i) const noexcept -> const_reference { return mStore.mArray[i]; }
+
+ [[nodiscard]] auto front() noexcept -> reference { return mStore.mArray[0]; }
+ [[nodiscard]] auto front() const noexcept -> const_reference { return mStore.mArray[0]; }
+
+ [[nodiscard]] auto back() noexcept -> reference { return mStore.mArray[mStore.mSize-1]; }
+ [[nodiscard]] auto back() const noexcept -> const_reference { return mStore.mArray[mStore.mSize-1]; }
+
+ [[nodiscard]] auto begin() noexcept -> iterator { return mStore.mArray; }
+ [[nodiscard]] auto begin() const noexcept -> const_iterator { return mStore.mArray; }
+ [[nodiscard]] auto cbegin() const noexcept -> const_iterator { return mStore.mArray; }
+ [[nodiscard]] auto end() noexcept -> iterator { return mStore.mArray + mStore.mSize; }
+ [[nodiscard]] auto end() const noexcept -> const_iterator { return mStore.mArray + mStore.mSize; }
+ [[nodiscard]] auto cend() const noexcept -> const_iterator { return mStore.mArray + mStore.mSize; }
+
+ [[nodiscard]] auto rbegin() noexcept -> reverse_iterator { return end(); }
+ [[nodiscard]] auto rbegin() const noexcept -> const_reverse_iterator { return end(); }
+ [[nodiscard]] auto crbegin() const noexcept -> const_reverse_iterator { return cend(); }
+ [[nodiscard]] auto rend() noexcept -> reverse_iterator { return begin(); }
+ [[nodiscard]] auto rend() const noexcept -> const_reverse_iterator { return begin(); }
+ [[nodiscard]] auto crend() const noexcept -> const_reverse_iterator { return cbegin(); }
DEF_PLACE_NEWDEL()
};
diff --git a/common/alnumbers.h b/common/alnumbers.h
index e92d7b87..7abe6b32 100644
--- a/common/alnumbers.h
+++ b/common/alnumbers.h
@@ -3,9 +3,7 @@
#include <utility>
-namespace al {
-
-namespace numbers {
+namespace al::numbers {
namespace detail_ {
template<typename T>
@@ -29,8 +27,6 @@ inline constexpr auto inv_pi = inv_pi_v<double>;
inline constexpr auto sqrt2 = sqrt2_v<double>;
inline constexpr auto sqrt3 = sqrt3_v<double>;
-} // namespace numbers
-
-} // namespace al
+} // namespace al::numbers
#endif /* COMMON_ALNUMBERS_H */
diff --git a/common/alnumeric.h b/common/alnumeric.h
index 6281b012..cb8704b2 100644
--- a/common/alnumeric.h
+++ b/common/alnumeric.h
@@ -245,7 +245,7 @@ inline float fast_roundf(float f) noexcept
/* Integral limit, where sub-integral precision is not available for
* floats.
*/
- static constexpr float ilim[2]{
+ static constexpr std::array ilim{
8388608.0f /* 0x1.0p+23 */,
-8388608.0f /* -0x1.0p+23 */
};
diff --git a/common/alspan.h b/common/alspan.h
index 341ce7c8..d91747c2 100644
--- a/common/alspan.h
+++ b/common/alspan.h
@@ -107,43 +107,43 @@ public:
constexpr span& operator=(const span &rhs) noexcept = default;
- constexpr reference front() const { return *mData; }
- constexpr reference back() const { return *(mData+E-1); }
- constexpr reference operator[](index_type idx) const { return mData[idx]; }
- constexpr pointer data() const noexcept { return mData; }
-
- constexpr index_type size() const noexcept { return E; }
- constexpr index_type size_bytes() const noexcept { return E * sizeof(value_type); }
- constexpr bool empty() const noexcept { return E == 0; }
-
- constexpr iterator begin() const noexcept { return mData; }
- constexpr iterator end() const noexcept { return mData+E; }
- constexpr const_iterator cbegin() const noexcept { return mData; }
- constexpr const_iterator cend() const noexcept { return mData+E; }
-
- constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator{end()}; }
- constexpr reverse_iterator rend() const noexcept { return reverse_iterator{begin()}; }
- constexpr const_reverse_iterator crbegin() const noexcept
+ [[nodiscard]] constexpr auto front() const -> reference { return *mData; }
+ [[nodiscard]] constexpr auto back() const -> reference { return *(mData+E-1); }
+ [[nodiscard]] constexpr auto operator[](index_type idx) const -> reference { return mData[idx]; }
+ [[nodiscard]] constexpr auto data() const noexcept -> pointer { return mData; }
+
+ [[nodiscard]] constexpr auto size() const noexcept -> index_type { return E; }
+ [[nodiscard]] constexpr auto size_bytes() const noexcept -> index_type { return E * sizeof(value_type); }
+ [[nodiscard]] constexpr auto empty() const noexcept -> bool { return E == 0; }
+
+ [[nodiscard]] constexpr auto begin() const noexcept -> iterator { return mData; }
+ [[nodiscard]] constexpr auto end() const noexcept -> iterator { return mData+E; }
+ [[nodiscard]] constexpr auto cbegin() const noexcept -> const_iterator { return mData; }
+ [[nodiscard]] constexpr auto cend() const noexcept -> const_iterator { return mData+E; }
+
+ [[nodiscard]] constexpr auto rbegin() const noexcept -> reverse_iterator { return reverse_iterator{end()}; }
+ [[nodiscard]] constexpr auto rend() const noexcept -> reverse_iterator { return reverse_iterator{begin()}; }
+ [[nodiscard]] constexpr auto crbegin() const noexcept -> const_reverse_iterator
{ return const_reverse_iterator{cend()}; }
- constexpr const_reverse_iterator crend() const noexcept
+ [[nodiscard]] constexpr auto crend() const noexcept -> const_reverse_iterator
{ return const_reverse_iterator{cbegin()}; }
template<size_t C>
- constexpr span<element_type,C> first() const
+ [[nodiscard]] constexpr auto first() const -> span<element_type,C>
{
static_assert(E >= C, "New size exceeds original capacity");
return span<element_type,C>{mData, C};
}
template<size_t C>
- constexpr span<element_type,C> last() const
+ [[nodiscard]] constexpr auto last() const -> span<element_type,C>
{
static_assert(E >= C, "New size exceeds original capacity");
return span<element_type,C>{mData+(E-C), C};
}
template<size_t O, size_t C>
- constexpr auto subspan() const -> std::enable_if_t<C!=dynamic_extent,span<element_type,C>>
+ [[nodiscard]] constexpr auto subspan() const -> std::enable_if_t<C!=dynamic_extent,span<element_type,C>>
{
static_assert(E >= O, "Offset exceeds extent");
static_assert(E-O >= C, "New size exceeds original capacity");
@@ -151,7 +151,7 @@ public:
}
template<size_t O, size_t C=dynamic_extent>
- constexpr auto subspan() const -> std::enable_if_t<C==dynamic_extent,span<element_type,E-O>>
+ [[nodiscard]] constexpr auto subspan() const -> std::enable_if_t<C==dynamic_extent,span<element_type,E-O>>
{
static_assert(E >= O, "Offset exceeds extent");
return span<element_type,E-O>{mData+O, E-O};
@@ -161,10 +161,10 @@ public:
* defining the specialization. As a result, these methods need to be
* defined later.
*/
- constexpr span<element_type,dynamic_extent> first(size_t count) const;
- constexpr span<element_type,dynamic_extent> last(size_t count) const;
- constexpr span<element_type,dynamic_extent> subspan(size_t offset,
- size_t count=dynamic_extent) const;
+ [[nodiscard]] constexpr auto first(size_t count) const -> span<element_type,dynamic_extent>;
+ [[nodiscard]] constexpr auto last(size_t count) const -> span<element_type,dynamic_extent>;
+ [[nodiscard]] constexpr auto subspan(size_t offset,
+ size_t count=dynamic_extent) const -> span<element_type,dynamic_extent>;
private:
pointer mData{nullptr};
@@ -221,51 +221,51 @@ public:
constexpr span& operator=(const span &rhs) noexcept = default;
- constexpr reference front() const { return *mData; }
- constexpr reference back() const { return *(mDataEnd-1); }
- constexpr reference operator[](index_type idx) const { return mData[idx]; }
- constexpr pointer data() const noexcept { return mData; }
+ [[nodiscard]] constexpr auto front() const -> reference { return *mData; }
+ [[nodiscard]] constexpr auto back() const -> reference { return *(mDataEnd-1); }
+ [[nodiscard]] constexpr auto operator[](index_type idx) const -> reference { return mData[idx]; }
+ [[nodiscard]] constexpr auto data() const noexcept -> pointer { return mData; }
- constexpr index_type size() const noexcept { return static_cast<index_type>(mDataEnd-mData); }
- constexpr index_type size_bytes() const noexcept
+ [[nodiscard]] constexpr auto size() const noexcept -> index_type { return static_cast<index_type>(mDataEnd-mData); }
+ [[nodiscard]] constexpr auto size_bytes() const noexcept -> index_type
{ return static_cast<index_type>(mDataEnd-mData) * sizeof(value_type); }
- constexpr bool empty() const noexcept { return mData == mDataEnd; }
+ [[nodiscard]] constexpr auto empty() const noexcept -> bool { return mData == mDataEnd; }
- constexpr iterator begin() const noexcept { return mData; }
- constexpr iterator end() const noexcept { return mDataEnd; }
- constexpr const_iterator cbegin() const noexcept { return mData; }
- constexpr const_iterator cend() const noexcept { return mDataEnd; }
+ [[nodiscard]] constexpr auto begin() const noexcept -> iterator { return mData; }
+ [[nodiscard]] constexpr auto end() const noexcept -> iterator { return mDataEnd; }
+ [[nodiscard]] constexpr auto cbegin() const noexcept -> const_iterator { return mData; }
+ [[nodiscard]] constexpr auto cend() const noexcept -> const_iterator { return mDataEnd; }
- constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator{end()}; }
- constexpr reverse_iterator rend() const noexcept { return reverse_iterator{begin()}; }
- constexpr const_reverse_iterator crbegin() const noexcept
+ [[nodiscard]] constexpr auto rbegin() const noexcept -> reverse_iterator { return reverse_iterator{end()}; }
+ [[nodiscard]] constexpr auto rend() const noexcept -> reverse_iterator { return reverse_iterator{begin()}; }
+ [[nodiscard]] constexpr auto crbegin() const noexcept -> const_reverse_iterator
{ return const_reverse_iterator{cend()}; }
- constexpr const_reverse_iterator crend() const noexcept
+ [[nodiscard]] constexpr auto crend() const noexcept -> const_reverse_iterator
{ return const_reverse_iterator{cbegin()}; }
template<size_t C>
- constexpr span<element_type,C> first() const
+ [[nodiscard]] constexpr auto first() const -> span<element_type,C>
{ return span<element_type,C>{mData, C}; }
- constexpr span first(size_t count) const
+ [[nodiscard]] constexpr auto first(size_t count) const -> span
{ return (count >= size()) ? *this : span{mData, mData+count}; }
template<size_t C>
- constexpr span<element_type,C> last() const
+ [[nodiscard]] constexpr auto last() const -> span<element_type,C>
{ return span<element_type,C>{mDataEnd-C, C}; }
- constexpr span last(size_t count) const
+ [[nodiscard]] constexpr auto last(size_t count) const -> span
{ return (count >= size()) ? *this : span{mDataEnd-count, mDataEnd}; }
template<size_t O, size_t C>
- constexpr auto subspan() const -> std::enable_if_t<C!=dynamic_extent,span<element_type,C>>
+ [[nodiscard]] constexpr auto subspan() const -> std::enable_if_t<C!=dynamic_extent,span<element_type,C>>
{ return span<element_type,C>{mData+O, C}; }
template<size_t O, size_t C=dynamic_extent>
- constexpr auto subspan() const -> std::enable_if_t<C==dynamic_extent,span<element_type,C>>
+ [[nodiscard]] constexpr auto subspan() const -> std::enable_if_t<C==dynamic_extent,span<element_type,C>>
{ return span<element_type,C>{mData+O, mDataEnd}; }
- constexpr span subspan(size_t offset, size_t count=dynamic_extent) const
+ [[nodiscard]] constexpr auto subspan(size_t offset, size_t count=dynamic_extent) const -> span
{
return (offset > size()) ? span{} :
(count >= size()-offset) ? span{mData+offset, mDataEnd} :
@@ -278,21 +278,21 @@ private:
};
template<typename T, size_t E>
-constexpr inline auto span<T,E>::first(size_t count) const -> span<element_type,dynamic_extent>
+[[nodiscard]] constexpr inline auto span<T,E>::first(size_t count) const -> span<element_type,dynamic_extent>
{
return (count >= size()) ? span<element_type>{mData, extent} :
span<element_type>{mData, count};
}
template<typename T, size_t E>
-constexpr inline auto span<T,E>::last(size_t count) const -> span<element_type,dynamic_extent>
+[[nodiscard]] constexpr inline auto span<T,E>::last(size_t count) const -> span<element_type,dynamic_extent>
{
return (count >= size()) ? span<element_type>{mData, extent} :
span<element_type>{mData+extent-count, count};
}
template<typename T, size_t E>
-constexpr inline auto span<T,E>::subspan(size_t offset, size_t count) const
+[[nodiscard]] constexpr inline auto span<T,E>::subspan(size_t offset, size_t count) const
-> span<element_type,dynamic_extent>
{
return (offset > size()) ? span<element_type>{} :
diff --git a/common/intrusive_ptr.h b/common/intrusive_ptr.h
index 714a5617..0152b92a 100644
--- a/common/intrusive_ptr.h
+++ b/common/intrusive_ptr.h
@@ -81,9 +81,9 @@ public:
explicit operator bool() const noexcept { return mPtr != nullptr; }
- T& operator*() const noexcept { return *mPtr; }
- T* operator->() const noexcept { return mPtr; }
- T* get() const noexcept { return mPtr; }
+ [[nodiscard]] auto operator*() const noexcept -> T& { return *mPtr; }
+ [[nodiscard]] auto operator->() const noexcept -> T* { return mPtr; }
+ [[nodiscard]] auto get() const noexcept -> T* { return mPtr; }
void reset(T *ptr=nullptr) noexcept
{
diff --git a/common/pffft.cpp b/common/pffft.cpp
index 8e849cb4..505c9791 100644
--- a/common/pffft.cpp
+++ b/common/pffft.cpp
@@ -58,11 +58,11 @@
#include "pffft.h"
#include <array>
-#include <assert.h>
+#include <cassert>
#include <cmath>
+#include <cstdio>
+#include <cstdlib>
#include <cstring>
-#include <stdio.h>
-#include <stdlib.h>
#include <vector>
#include "albit.h"
@@ -90,7 +90,7 @@ using uint = unsigned int;
* Altivec support macros
*/
#if defined(__ppc__) || defined(__ppc64__) || defined(__powerpc__) || defined(__powerpc64__)
-typedef vector float v4sf;
+using v4sf = vector float;
#define SIMD_SZ 4
#define VZERO() ((vector float) vec_splat_u8(0))
#define VMUL(a,b) vec_madd(a,b, VZERO())
@@ -142,7 +142,7 @@ force_inline void vtranspose4(v4sf &x0, v4sf &x1, v4sf &x2, v4sf &x3) noexcept
(defined(_M_IX86_FP) && _M_IX86_FP >= 1)
#include <xmmintrin.h>
-typedef __m128 v4sf;
+using v4sf = __m128;
#define SIMD_SZ 4 // 4 floats by simd vector -- this is pretty much hardcoded in the preprocess/finalize functions anyway so you will have to work if you want to enable AVX with its 256-bit vectors.
#define VZERO _mm_setzero_ps
#define VMUL _mm_mul_ps
@@ -178,7 +178,7 @@ force_inline void vtranspose4(v4sf &x0, v4sf &x1, v4sf &x2, v4sf &x3) noexcept
#elif defined(__ARM_NEON) || defined(__aarch64__) || defined(__arm64)
#include <arm_neon.h>
-typedef float32x4_t v4sf;
+using v4sf = float32x4_t;
#define SIMD_SZ 4
#define VZERO() vdupq_n_f32(0)
#define VMUL vmulq_f32
@@ -297,7 +297,7 @@ force_inline v4sf vswaphl(v4sf a, v4sf b) noexcept
// fallback mode for situations where SIMD is not available, use scalar mode instead
#ifdef PFFFT_SIMD_DISABLE
-typedef float v4sf;
+using v4sf = float;
#define SIMD_SZ 1
#define VZERO() 0.f
#define VMUL(a,b) ((a)*(b))
@@ -335,14 +335,14 @@ force_inline void vcplxmulconj(v4sf &ar, v4sf &ai, v4sf br, v4sf bi) noexcept
[[maybe_unused]] void validate_pffft_simd()
{
using float4 = std::array<float,4>;
- static constexpr float f[16]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
+ static constexpr std::array<float,16> f{{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}};
float4 a0_f, a1_f, a2_f, a3_f, t_f, u_f;
v4sf a0_v, a1_v, a2_v, a3_v, t_v, u_v;
- std::memcpy(&a0_v, f, 4*sizeof(float));
- std::memcpy(&a1_v, f+4, 4*sizeof(float));
- std::memcpy(&a2_v, f+8, 4*sizeof(float));
- std::memcpy(&a3_v, f+12, 4*sizeof(float));
+ std::memcpy(&a0_v, f.data(), 4*sizeof(float));
+ std::memcpy(&a1_v, f.data()+4, 4*sizeof(float));
+ std::memcpy(&a2_v, f.data()+8, 4*sizeof(float));
+ std::memcpy(&a3_v, f.data()+12, 4*sizeof(float));
t_v = VZERO(); t_f = al::bit_cast<float4>(t_v);
printf("VZERO=[%2g %2g %2g %2g]\n", t_f[0], t_f[1], t_f[2], t_f[3]); assertv4(t, 0, 0, 0, 0);
@@ -1331,7 +1331,7 @@ uint decompose(const uint n, const al::span<uint,15> ifac, const al::span<const
void rffti1_ps(const uint n, float *wa, const al::span<uint,15> ifac)
{
- static constexpr uint ntryh[]{4,2,3,5};
+ static constexpr std::array ntryh{4u,2u,3u,5u};
const uint nf{decompose(n, ifac, ntryh)};
const double argh{2.0*al::numbers::pi / n};
@@ -1365,7 +1365,7 @@ void rffti1_ps(const uint n, float *wa, const al::span<uint,15> ifac)
void cffti1_ps(const uint n, float *wa, const al::span<uint,15> ifac)
{
- static constexpr uint ntryh[]{5,3,4,2};
+ static constexpr std::array ntryh{5u,3u,4u,2u};
const uint nf{decompose(n, ifac, ntryh)};
const double argh{2.0*al::numbers::pi / n};
@@ -1814,7 +1814,7 @@ void pffft_transform_internal(const PFFFT_Setup *setup, const v4sf *vinput, v4sf
const size_t Ncvec{setup->Ncvec};
const bool nf_odd{(setup->ifac[1]&1) != 0};
- v4sf *buff[2]{voutput, scratch};
+ std::array buff{voutput, scratch};
bool ib{nf_odd != ordered};
if(direction == PFFFT_FORWARD)
{
diff --git a/common/ringbuffer.h b/common/ringbuffer.h
index 8c65c3af..718238a3 100644
--- a/common/ringbuffer.h
+++ b/common/ringbuffer.h
@@ -36,26 +36,26 @@ public:
RingBuffer(const std::size_t count) : mBuffer{count} { }
/** Reset the read and write pointers to zero. This is not thread safe. */
- void reset() noexcept;
+ auto reset() noexcept -> void;
/**
* The non-copying data reader. Returns two ringbuffer data pointers that
* hold the current readable data. If the readable data is in one segment
* the second segment has zero length.
*/
- DataPair getReadVector() const noexcept;
+ [[nodiscard]] auto getReadVector() const noexcept -> DataPair;
/**
* The non-copying data writer. Returns two ringbuffer data pointers that
* hold the current writeable data. If the writeable data is in one segment
* the second segment has zero length.
*/
- DataPair getWriteVector() const noexcept;
+ [[nodiscard]] auto getWriteVector() const noexcept -> DataPair;
/**
* Return the number of elements available for reading. This is the number
* of elements in front of the read pointer and behind the write pointer.
*/
- std::size_t readSpace() const noexcept
+ [[nodiscard]] auto readSpace() const noexcept -> size_t
{
const size_t w{mWritePtr.load(std::memory_order_acquire)};
const size_t r{mReadPtr.load(std::memory_order_acquire)};
@@ -66,14 +66,14 @@ public:
* The copying data reader. Copy at most `cnt' elements into `dest'.
* Returns the actual number of elements copied.
*/
- std::size_t read(void *dest, std::size_t cnt) noexcept;
+ [[nodiscard]] auto read(void *dest, size_t cnt) noexcept -> size_t;
/**
* The copying data reader w/o read pointer advance. Copy at most `cnt'
* elements into `dest'. Returns the actual number of elements copied.
*/
- std::size_t peek(void *dest, std::size_t cnt) const noexcept;
+ [[nodiscard]] auto peek(void *dest, size_t cnt) const noexcept -> size_t;
/** Advance the read pointer `cnt' places. */
- void readAdvance(std::size_t cnt) noexcept
+ auto readAdvance(size_t cnt) noexcept -> void
{ mReadPtr.fetch_add(cnt, std::memory_order_acq_rel); }
@@ -81,7 +81,7 @@ public:
* Return the number of elements available for writing. This is the number
* of elements in front of the write pointer and behind the read pointer.
*/
- std::size_t writeSpace() const noexcept
+ [[nodiscard]] auto writeSpace() const noexcept -> size_t
{
const size_t w{mWritePtr.load(std::memory_order_acquire)};
const size_t r{mReadPtr.load(std::memory_order_acquire) + mWriteSize - mSizeMask};
@@ -92,12 +92,12 @@ public:
* The copying data writer. Copy at most `cnt' elements from `src'. Returns
* the actual number of elements copied.
*/
- std::size_t write(const void *src, std::size_t cnt) noexcept;
+ [[nodiscard]] auto write(const void *src, size_t cnt) noexcept -> size_t;
/** Advance the write pointer `cnt' places. */
- void writeAdvance(std::size_t cnt) noexcept
+ auto writeAdvance(size_t cnt) noexcept -> void
{ mWritePtr.fetch_add(cnt, std::memory_order_acq_rel); }
- std::size_t getElemSize() const noexcept { return mElemSize; }
+ [[nodiscard]] auto getElemSize() const noexcept -> size_t { return mElemSize; }
/**
* Create a new ringbuffer to hold at least `sz' elements of `elem_sz'
@@ -105,7 +105,8 @@ public:
* (even if it is already a power of two, to ensure the requested amount
* can be written).
*/
- static std::unique_ptr<RingBuffer> Create(std::size_t sz, std::size_t elem_sz, int limit_writes);
+ [[nodiscard]]
+ static auto Create(size_t sz, size_t elem_sz, int limit_writes) -> std::unique_ptr<RingBuffer>;
DEF_FAM_NEWDEL(RingBuffer, mBuffer)
};
diff --git a/common/vecmat.h b/common/vecmat.h
index a45f262f..0cdb82eb 100644
--- a/common/vecmat.h
+++ b/common/vecmat.h
@@ -14,7 +14,7 @@ namespace alu {
template<typename T>
class VectorR {
static_assert(std::is_floating_point<T>::value, "Must use floating-point types");
- alignas(16) T mVals[4];
+ alignas(16) std::array<T,4> mVals;
public:
constexpr VectorR() noexcept = default;
@@ -58,7 +58,7 @@ public:
return T{0};
}
- constexpr VectorR cross_product(const alu::VectorR<T> &rhs) const noexcept
+ [[nodiscard]] constexpr auto cross_product(const alu::VectorR<T> &rhs) const noexcept -> VectorR
{
return VectorR{
mVals[1]*rhs.mVals[2] - mVals[2]*rhs.mVals[1],
@@ -67,7 +67,7 @@ public:
T{0}};
}
- constexpr T dot_product(const alu::VectorR<T> &rhs) const noexcept
+ [[nodiscard]] constexpr auto dot_product(const alu::VectorR<T> &rhs) const noexcept -> T
{ return mVals[0]*rhs.mVals[0] + mVals[1]*rhs.mVals[1] + mVals[2]*rhs.mVals[2]; }
};
using Vector = VectorR<float>;
@@ -75,7 +75,7 @@ using Vector = VectorR<float>;
template<typename T>
class MatrixR {
static_assert(std::is_floating_point<T>::value, "Must use floating-point types");
- alignas(16) T mVals[16];
+ alignas(16) std::array<T,16> mVals;
public:
constexpr MatrixR() noexcept = default;
diff --git a/core/async_event.h b/core/async_event.h
index f1ca0c7b..20857c9c 100644
--- a/core/async_event.h
+++ b/core/async_event.h
@@ -1,6 +1,7 @@
#ifndef CORE_EVENT_H
#define CORE_EVENT_H
+#include <array>
#include <stdint.h>
#include <variant>
@@ -39,7 +40,7 @@ struct AsyncBufferCompleteEvent {
};
struct AsyncDisconnectEvent {
- char msg[244];
+ std::array<char,244> msg;
};
struct AsyncEffectReleaseEvent {
diff --git a/core/effects/base.h b/core/effects/base.h
index 83df7cf0..7d8770fb 100644
--- a/core/effects/base.h
+++ b/core/effects/base.h
@@ -71,10 +71,10 @@ union EffectProps {
float DecayLFRatio;
float ReflectionsGain;
float ReflectionsDelay;
- float ReflectionsPan[3];
+ std::array<float,3> ReflectionsPan;
float LateReverbGain;
float LateReverbDelay;
- float LateReverbPan[3];
+ std::array<float,3> LateReverbPan;
float EchoTime;
float EchoDepth;
float ModulationTime;
diff --git a/core/except.h b/core/except.h
index 0e28e9df..eec876db 100644
--- a/core/except.h
+++ b/core/except.h
@@ -14,12 +14,12 @@ class base_exception : public std::exception {
protected:
base_exception() = default;
- virtual ~base_exception();
+ ~base_exception() override;
- void setMessage(const char *msg, std::va_list args);
+ auto setMessage(const char *msg, std::va_list args) -> void;
public:
- const char *what() const noexcept override { return mMessage.c_str(); }
+ [[nodiscard]] auto what() const noexcept -> const char* override { return mMessage.c_str(); }
};
} // namespace al
diff --git a/examples/alffplay.cpp b/examples/alffplay.cpp
index 1f02ef70..54803035 100644
--- a/examples/alffplay.cpp
+++ b/examples/alffplay.cpp
@@ -474,8 +474,8 @@ nanoseconds AudioState::getClockNoLock()
// Get the current device clock time and latency.
auto device = alcGetContextsDevice(alcGetCurrentContext());
- ALCint64SOFT devtimes[2]{0,0};
- alcGetInteger64vSOFT(device, ALC_DEVICE_CLOCK_LATENCY_SOFT, 2, devtimes);
+ std::array<ALCint64SOFT,2> devtimes{};
+ alcGetInteger64vSOFT(device, ALC_DEVICE_CLOCK_LATENCY_SOFT, 2, devtimes.data());
auto latency = nanoseconds{devtimes[1]};
auto device_time = nanoseconds{devtimes[0]};
@@ -494,15 +494,14 @@ nanoseconds AudioState::getClockNoLock()
* actually the timestamp of the first sample frame played. The audio
* clock, then, is that plus the current source offset.
*/
- ALint64SOFT offset[2];
+ std::array<ALint64SOFT,2> offset{};
if(alGetSourcei64vSOFT)
- alGetSourcei64vSOFT(mSource, AL_SAMPLE_OFFSET_LATENCY_SOFT, offset);
+ alGetSourcei64vSOFT(mSource, AL_SAMPLE_OFFSET_LATENCY_SOFT, offset.data());
else
{
ALint ioffset;
alGetSourcei(mSource, AL_SAMPLE_OFFSET, &ioffset);
offset[0] = ALint64SOFT{ioffset} << 32;
- offset[1] = 0;
}
/* NOTE: The source state must be checked last, in case an underrun
* occurs and the source stops between getting the state and retrieving
@@ -550,15 +549,14 @@ nanoseconds AudioState::getClockNoLock()
nanoseconds pts{mCurrentPts};
if(mSource)
{
- ALint64SOFT offset[2];
+ std::array<ALint64SOFT,2> offset{};
if(alGetSourcei64vSOFT)
- alGetSourcei64vSOFT(mSource, AL_SAMPLE_OFFSET_LATENCY_SOFT, offset);
+ alGetSourcei64vSOFT(mSource, AL_SAMPLE_OFFSET_LATENCY_SOFT, offset.data());
else
{
ALint ioffset;
alGetSourcei(mSource, AL_SAMPLE_OFFSET, &ioffset);
offset[0] = ALint64SOFT{ioffset} << 32;
- offset[1] = 0;
}
ALint queued, status;
alGetSourcei(mSource, AL_BUFFERS_QUEUED, &queued);
@@ -610,8 +608,8 @@ bool AudioState::startPlayback()
/* Subtract the total buffer queue time from the current pts to get the
* pts of the start of the queue.
*/
- int64_t srctimes[2]{0,0};
- alGetSourcei64vSOFT(mSource, AL_SAMPLE_OFFSET_CLOCK_SOFT, srctimes);
+ std::array<int64_t,2> srctimes{};
+ alGetSourcei64vSOFT(mSource, AL_SAMPLE_OFFSET_CLOCK_SOFT, srctimes.data());
auto device_time = nanoseconds{srctimes[1]};
auto src_offset = duration_cast<nanoseconds>(fixed32{srctimes[0]}) /
mCodecCtx->sample_rate;
@@ -1151,9 +1149,9 @@ int AudioState::handler()
mSwresCtx.reset(ps);
if(err != 0)
{
- char errstr[AV_ERROR_MAX_STRING_SIZE]{};
+ std::array<char,AV_ERROR_MAX_STRING_SIZE> errstr{};
std::cerr<< "Failed to allocate SwrContext: "
- <<av_make_error_string(errstr, AV_ERROR_MAX_STRING_SIZE, err) <<std::endl;
+ <<av_make_error_string(errstr.data(), AV_ERROR_MAX_STRING_SIZE, err) <<std::endl;
return 0;
}
@@ -1185,17 +1183,17 @@ int AudioState::handler()
mSwresCtx.reset(ps);
if(err != 0)
{
- char errstr[AV_ERROR_MAX_STRING_SIZE]{};
+ std::array<char,AV_ERROR_MAX_STRING_SIZE> errstr{};
std::cerr<< "Failed to allocate SwrContext: "
- <<av_make_error_string(errstr, AV_ERROR_MAX_STRING_SIZE, err) <<std::endl;
+ <<av_make_error_string(errstr.data(), AV_ERROR_MAX_STRING_SIZE, err) <<std::endl;
return 0;
}
}
if(int err{swr_init(mSwresCtx.get())})
{
- char errstr[AV_ERROR_MAX_STRING_SIZE]{};
+ std::array<char,AV_ERROR_MAX_STRING_SIZE> errstr{};
std::cerr<< "Failed to initialize audio converter: "
- <<av_make_error_string(errstr, AV_ERROR_MAX_STRING_SIZE, err) <<std::endl;
+ <<av_make_error_string(errstr.data(), AV_ERROR_MAX_STRING_SIZE, err) <<std::endl;
return 0;
}
@@ -1206,8 +1204,8 @@ int AudioState::handler()
alSourcei(mSource, AL_DIRECT_CHANNELS_SOFT, DirectOutMode);
if(EnableWideStereo)
{
- const float angles[2]{static_cast<float>(M_PI / 3.0), static_cast<float>(-M_PI / 3.0)};
- alSourcefv(mSource, AL_STEREO_ANGLES, angles);
+ const std::array angles{static_cast<float>(M_PI / 3.0), static_cast<float>(-M_PI / 3.0)};
+ alSourcefv(mSource, AL_STEREO_ANGLES, angles.data());
}
if(has_bfmt_ex)
{
@@ -1260,7 +1258,7 @@ int AudioState::handler()
/* Prefill the codec buffer. */
auto packet_sender = [this]()
{
- while(1)
+ while(true)
{
const int ret{mQueue.sendPacket(mCodecCtx.get())};
if(ret == AVErrorEOF) break;
@@ -1287,7 +1285,7 @@ int AudioState::handler()
mCurrentPts += skip;
}
- while(1)
+ while(true)
{
if(mMovie.mQuit.load(std::memory_order_relaxed))
{
@@ -1451,7 +1449,7 @@ void VideoState::updateVideo(SDL_Window *screen, SDL_Renderer *renderer, bool re
auto clocktime = mMovie.getMasterClock();
bool updated{false};
- while(1)
+ while(true)
{
size_t next_idx{(read_idx+1)%mPictQ.size()};
if(next_idx == mPictQWrite.load(std::memory_order_acquire))
@@ -1546,18 +1544,15 @@ void VideoState::updateVideo(SDL_Window *screen, SDL_Renderer *renderer, bool re
}
/* point pict at the queue */
- uint8_t *pict_data[3];
+ std::array<uint8_t*,3> pict_data;
pict_data[0] = static_cast<uint8_t*>(pixels);
pict_data[1] = pict_data[0] + w*h;
pict_data[2] = pict_data[1] + w*h/4;
- int pict_linesize[3];
- pict_linesize[0] = pitch;
- pict_linesize[1] = pitch / 2;
- pict_linesize[2] = pitch / 2;
+ std::array pict_linesize{pitch, pitch/2, pitch/2};
- sws_scale(mSwscaleCtx.get(), reinterpret_cast<uint8_t**>(frame->data), frame->linesize,
- 0, h, pict_data, pict_linesize);
+ sws_scale(mSwscaleCtx.get(), reinterpret_cast<uint8_t**>(frame->data),
+ frame->linesize, 0, h, pict_data.data(), pict_linesize.data());
SDL_UnlockTexture(mImage);
}
@@ -1599,7 +1594,7 @@ int VideoState::handler()
/* Prefill the codec buffer. */
auto packet_sender = [this]()
{
- while(1)
+ while(true)
{
const int ret{mQueue.sendPacket(mCodecCtx.get())};
if(ret == AVErrorEOF) break;
@@ -1613,7 +1608,7 @@ int VideoState::handler()
}
auto current_pts = nanoseconds::zero();
- while(1)
+ while(true)
{
size_t write_idx{mPictQWrite.load(std::memory_order_relaxed)};
Picture *vp{&mPictQ[write_idx]};
@@ -2062,7 +2057,7 @@ int main(int argc, char *argv[])
while(fileidx < argc && !movState)
{
- movState = std::unique_ptr<MovieState>{new MovieState{argv[fileidx++]}};
+ movState = std::make_unique<MovieState>(argv[fileidx++]);
if(!movState->prepare()) movState = nullptr;
}
if(!movState)
@@ -2077,7 +2072,7 @@ int main(int argc, char *argv[])
Next, Quit
} eom_action{EomAction::Next};
seconds last_time{seconds::min()};
- while(1)
+ while(true)
{
/* SDL_WaitEventTimeout is broken, just force a 10ms sleep. */
std::this_thread::sleep_for(milliseconds{10});
@@ -2145,7 +2140,7 @@ int main(int argc, char *argv[])
movState = nullptr;
while(fileidx < argc && !movState)
{
- movState = std::unique_ptr<MovieState>{new MovieState{argv[fileidx++]}};
+ movState = std::make_unique<MovieState>(argv[fileidx++]);
if(!movState->prepare()) movState = nullptr;
}
if(movState)
diff --git a/utils/alsoft-config/mainwindow.cpp b/utils/alsoft-config/mainwindow.cpp
index bee7022f..207c98c4 100644
--- a/utils/alsoft-config/mainwindow.cpp
+++ b/utils/alsoft-config/mainwindow.cpp
@@ -583,7 +583,7 @@ QStringList MainWindow::collectHrtfs()
break;
}
++i;
- } while(1);
+ } while(true);
}
}
}
@@ -618,7 +618,7 @@ QStringList MainWindow::collectHrtfs()
break;
}
++i;
- } while(1);
+ } while(true);
}
}
}