mirror of
https://github.com/love2d/megasource.git
synced 2026-08-19 20:20:11 +02:00
Update OpenAL-soft to 1.23.1-bc7cb17.
This commit is contained in:
@@ -1,12 +1,16 @@
|
||||
#ifndef ALC_DEVICE_H
|
||||
#define ALC_DEVICE_H
|
||||
|
||||
#include <array>
|
||||
#include <atomic>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <optional>
|
||||
#include <stdint.h>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "AL/alc.h"
|
||||
#include "AL/alext.h"
|
||||
@@ -17,66 +21,22 @@
|
||||
#include "core/device.h"
|
||||
#include "inprogext.h"
|
||||
#include "intrusive_ptr.h"
|
||||
#include "vector.h"
|
||||
|
||||
#ifdef ALSOFT_EAX
|
||||
#include "al/eax_x_ram.h"
|
||||
#include "al/eax/x_ram.h"
|
||||
#endif // ALSOFT_EAX
|
||||
|
||||
struct ALbuffer;
|
||||
struct ALeffect;
|
||||
struct ALfilter;
|
||||
struct BackendBase;
|
||||
struct BufferSubList;
|
||||
struct EffectSubList;
|
||||
struct FilterSubList;
|
||||
|
||||
using uint = unsigned int;
|
||||
|
||||
|
||||
struct BufferSubList {
|
||||
uint64_t FreeMask{~0_u64};
|
||||
ALbuffer *Buffers{nullptr}; /* 64 */
|
||||
|
||||
BufferSubList() noexcept = default;
|
||||
BufferSubList(const BufferSubList&) = delete;
|
||||
BufferSubList(BufferSubList&& rhs) noexcept : FreeMask{rhs.FreeMask}, Buffers{rhs.Buffers}
|
||||
{ rhs.FreeMask = ~0_u64; rhs.Buffers = nullptr; }
|
||||
~BufferSubList();
|
||||
|
||||
BufferSubList& operator=(const BufferSubList&) = delete;
|
||||
BufferSubList& operator=(BufferSubList&& rhs) noexcept
|
||||
{ std::swap(FreeMask, rhs.FreeMask); std::swap(Buffers, rhs.Buffers); return *this; }
|
||||
};
|
||||
|
||||
struct EffectSubList {
|
||||
uint64_t FreeMask{~0_u64};
|
||||
ALeffect *Effects{nullptr}; /* 64 */
|
||||
|
||||
EffectSubList() noexcept = default;
|
||||
EffectSubList(const EffectSubList&) = delete;
|
||||
EffectSubList(EffectSubList&& rhs) noexcept : FreeMask{rhs.FreeMask}, Effects{rhs.Effects}
|
||||
{ rhs.FreeMask = ~0_u64; rhs.Effects = nullptr; }
|
||||
~EffectSubList();
|
||||
|
||||
EffectSubList& operator=(const EffectSubList&) = delete;
|
||||
EffectSubList& operator=(EffectSubList&& rhs) noexcept
|
||||
{ std::swap(FreeMask, rhs.FreeMask); std::swap(Effects, rhs.Effects); return *this; }
|
||||
};
|
||||
|
||||
struct FilterSubList {
|
||||
uint64_t FreeMask{~0_u64};
|
||||
ALfilter *Filters{nullptr}; /* 64 */
|
||||
|
||||
FilterSubList() noexcept = default;
|
||||
FilterSubList(const FilterSubList&) = delete;
|
||||
FilterSubList(FilterSubList&& rhs) noexcept : FreeMask{rhs.FreeMask}, Filters{rhs.Filters}
|
||||
{ rhs.FreeMask = ~0_u64; rhs.Filters = nullptr; }
|
||||
~FilterSubList();
|
||||
|
||||
FilterSubList& operator=(const FilterSubList&) = delete;
|
||||
FilterSubList& operator=(FilterSubList&& rhs) noexcept
|
||||
{ std::swap(FreeMask, rhs.FreeMask); std::swap(Filters, rhs.Filters); return *this; }
|
||||
};
|
||||
|
||||
|
||||
struct ALCdevice : public al::intrusive_ref<ALCdevice>, DeviceBase {
|
||||
/* This lock protects the device state (format, update size, etc) from
|
||||
* being from being changed in multiple threads, or being accessed while
|
||||
@@ -94,7 +54,7 @@ struct ALCdevice : public al::intrusive_ref<ALCdevice>, DeviceBase {
|
||||
uint AuxiliaryEffectSlotMax{};
|
||||
|
||||
std::string mHrtfName;
|
||||
al::vector<std::string> mHrtfList;
|
||||
std::vector<std::string> mHrtfList;
|
||||
ALCenum mHrtfStatus{ALC_FALSE};
|
||||
|
||||
enum class OutputMode1 : ALCenum {
|
||||
@@ -117,49 +77,54 @@ struct ALCdevice : public al::intrusive_ref<ALCdevice>, DeviceBase {
|
||||
|
||||
// Map of Buffers for this device
|
||||
std::mutex BufferLock;
|
||||
al::vector<BufferSubList> BufferList;
|
||||
std::vector<BufferSubList> BufferList;
|
||||
|
||||
// Map of Effects for this device
|
||||
std::mutex EffectLock;
|
||||
al::vector<EffectSubList> EffectList;
|
||||
std::vector<EffectSubList> EffectList;
|
||||
|
||||
// Map of Filters for this device
|
||||
std::mutex FilterLock;
|
||||
al::vector<FilterSubList> FilterList;
|
||||
std::vector<FilterSubList> FilterList;
|
||||
|
||||
#ifdef ALSOFT_EAX
|
||||
ALuint eax_x_ram_free_size{eax_x_ram_max_size};
|
||||
#endif // ALSOFT_EAX
|
||||
|
||||
|
||||
std::unordered_map<ALuint,std::string> mBufferNames;
|
||||
std::unordered_map<ALuint,std::string> mEffectNames;
|
||||
std::unordered_map<ALuint,std::string> mFilterNames;
|
||||
|
||||
ALCdevice(DeviceType type);
|
||||
~ALCdevice();
|
||||
|
||||
void enumerateHrtfs();
|
||||
|
||||
bool getConfigValueBool(const char *block, const char *key, bool def)
|
||||
{ return GetConfigValueBool(DeviceName.c_str(), block, key, def); }
|
||||
bool getConfigValueBool(const std::string_view block, const std::string_view key, bool def)
|
||||
{ return GetConfigValueBool(DeviceName, block, key, def); }
|
||||
|
||||
template<typename T>
|
||||
al::optional<T> configValue(const char *block, const char *key) = delete;
|
||||
|
||||
DEF_NEWDEL(ALCdevice)
|
||||
inline std::optional<T> configValue(const std::string_view block, const std::string_view key) = delete;
|
||||
};
|
||||
|
||||
template<>
|
||||
inline al::optional<std::string> ALCdevice::configValue(const char *block, const char *key)
|
||||
{ return ConfigValueStr(DeviceName.c_str(), block, key); }
|
||||
inline std::optional<std::string> ALCdevice::configValue(const std::string_view block, const std::string_view key)
|
||||
{ return ConfigValueStr(DeviceName, block, key); }
|
||||
template<>
|
||||
inline al::optional<int> ALCdevice::configValue(const char *block, const char *key)
|
||||
{ return ConfigValueInt(DeviceName.c_str(), block, key); }
|
||||
inline std::optional<int> ALCdevice::configValue(const std::string_view block, const std::string_view key)
|
||||
{ return ConfigValueInt(DeviceName, block, key); }
|
||||
template<>
|
||||
inline al::optional<uint> ALCdevice::configValue(const char *block, const char *key)
|
||||
{ return ConfigValueUInt(DeviceName.c_str(), block, key); }
|
||||
inline std::optional<uint> ALCdevice::configValue(const std::string_view block, const std::string_view key)
|
||||
{ return ConfigValueUInt(DeviceName, block, key); }
|
||||
template<>
|
||||
inline al::optional<float> ALCdevice::configValue(const char *block, const char *key)
|
||||
{ return ConfigValueFloat(DeviceName.c_str(), block, key); }
|
||||
inline std::optional<float> ALCdevice::configValue(const std::string_view block, const std::string_view key)
|
||||
{ return ConfigValueFloat(DeviceName, block, key); }
|
||||
template<>
|
||||
inline al::optional<bool> ALCdevice::configValue(const char *block, const char *key)
|
||||
{ return ConfigValueBool(DeviceName.c_str(), block, key); }
|
||||
inline std::optional<bool> ALCdevice::configValue(const std::string_view block, const std::string_view key)
|
||||
{ return ConfigValueBool(DeviceName, block, key); }
|
||||
|
||||
/** Stores the latest ALC device error. */
|
||||
void alcSetError(ALCdevice *device, ALCenum errorCode);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user