2019-07-28 21:29:59 -07:00
|
|
|
#ifndef AL_BUFFER_H
|
|
|
|
#define AL_BUFFER_H
|
|
|
|
|
|
|
|
#include <atomic>
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2018-01-26 21:32:43 -08:00
|
|
|
#include "AL/al.h"
|
|
|
|
|
2019-07-28 21:29:59 -07:00
|
|
|
#include "albyte.h"
|
2021-04-27 16:04:54 -07:00
|
|
|
#include "alc/inprogext.h"
|
2019-07-28 21:29:59 -07:00
|
|
|
#include "almalloc.h"
|
2018-01-26 21:32:43 -08:00
|
|
|
#include "atomic.h"
|
2021-04-27 08:26:42 -07:00
|
|
|
#include "core/buffer_storage.h"
|
2018-11-24 10:07:48 -08:00
|
|
|
#include "vector.h"
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2022-01-30 05:42:44 -08:00
|
|
|
#ifdef ALSOFT_EAX
|
2022-01-30 14:47:32 +02:00
|
|
|
#include "eax_x_ram.h"
|
|
|
|
#endif // ALSOFT_EAX
|
2007-11-13 18:02:18 -08:00
|
|
|
|
2011-05-05 22:36:26 -07:00
|
|
|
/* User formats */
|
2019-06-30 17:41:43 -07:00
|
|
|
enum UserFmtType : unsigned char {
|
2020-08-24 17:59:07 -07:00
|
|
|
UserFmtUByte = FmtUByte,
|
|
|
|
UserFmtShort = FmtShort,
|
|
|
|
UserFmtFloat = FmtFloat,
|
|
|
|
UserFmtMulaw = FmtMulaw,
|
|
|
|
UserFmtAlaw = FmtAlaw,
|
2020-08-25 02:38:44 -07:00
|
|
|
UserFmtDouble = FmtDouble,
|
2020-08-24 17:59:07 -07:00
|
|
|
|
2020-08-25 02:38:44 -07:00
|
|
|
UserFmtIMA4 = 128,
|
2014-03-04 22:44:30 -08:00
|
|
|
UserFmtMSADPCM,
|
2010-11-27 15:33:33 -08:00
|
|
|
};
|
2019-06-30 17:41:43 -07:00
|
|
|
enum UserFmtChannels : unsigned char {
|
2020-08-24 17:59:07 -07:00
|
|
|
UserFmtMono = FmtMono,
|
|
|
|
UserFmtStereo = FmtStereo,
|
|
|
|
UserFmtRear = FmtRear,
|
|
|
|
UserFmtQuad = FmtQuad,
|
|
|
|
UserFmtX51 = FmtX51,
|
|
|
|
UserFmtX61 = FmtX61,
|
|
|
|
UserFmtX71 = FmtX71,
|
|
|
|
UserFmtBFormat2D = FmtBFormat2D,
|
|
|
|
UserFmtBFormat3D = FmtBFormat3D,
|
2021-03-31 05:37:56 -07:00
|
|
|
UserFmtUHJ2 = FmtUHJ2,
|
2021-03-31 10:03:31 -07:00
|
|
|
UserFmtUHJ3 = FmtUHJ3,
|
2021-03-31 20:46:03 -07:00
|
|
|
UserFmtUHJ4 = FmtUHJ4,
|
2010-11-26 23:42:30 -08:00
|
|
|
};
|
2018-11-20 02:42:49 -08:00
|
|
|
|
2010-11-26 23:42:30 -08:00
|
|
|
|
2020-11-21 00:54:25 -08:00
|
|
|
struct ALbuffer : public BufferStorage {
|
2018-11-24 10:07:48 -08:00
|
|
|
ALbitfieldSOFT Access{0u};
|
2009-10-22 08:53:59 -07:00
|
|
|
|
2021-01-24 02:07:39 -08:00
|
|
|
al::vector<al::byte,16> mData;
|
|
|
|
|
2021-01-22 11:55:02 -08:00
|
|
|
UserFmtType OriginalType{UserFmtShort};
|
2019-09-11 14:33:26 -07:00
|
|
|
ALuint OriginalSize{0};
|
|
|
|
ALuint OriginalAlign{0};
|
2010-05-12 01:36:09 -07:00
|
|
|
|
2019-09-11 14:33:26 -07:00
|
|
|
ALuint UnpackAlign{0};
|
|
|
|
ALuint PackAlign{0};
|
2020-04-04 01:52:29 -07:00
|
|
|
ALuint UnpackAmbiOrder{1};
|
Add an extension to alter the block alignment for buffer unpack/pack ops
This is for unpacking (reading, e.g. alBufferData) and packing (writing, e.g.
alGetBufferSamplesSOFT) operations. The alignments are specified in sample
frames, with 0 meaning the default (65 for IMA4, 1 otherwise). IMA4 alignment
must be a multiple of 8, plus 1 (e.g. alignment = n*8 + 1), otherwise an error
will occur during (un)packing. Chenging the block alignment does not affect
already-loaded sample data, only future unpack/pack operations... so for
example, this is perfectly valid:
// Load mono IMA4 data with a block alignment of 1024 bytes, or 2041 sample
// frames.
alBufferi(buffer, AL_UNPACK_BLOCK_ALIGNMENT_SOFT, 2041);
alBufferData(buffer, AL_FORMAT_MONO_IMA4, data, data_len, srate);
alBufferi(buffer, AL_UNPACK_BLOCK_ALIGNMENT_SOFT, 0);
2014-03-04 05:16:45 -08:00
|
|
|
|
2018-11-24 10:07:48 -08:00
|
|
|
ALbitfieldSOFT MappedAccess{0u};
|
|
|
|
ALsizei MappedOffset{0};
|
|
|
|
ALsizei MappedSize{0};
|
2018-01-20 11:49:01 -08:00
|
|
|
|
2021-01-24 02:07:39 -08:00
|
|
|
ALuint mLoopStart{0u};
|
|
|
|
ALuint mLoopEnd{0u};
|
|
|
|
|
2012-04-19 22:14:02 -07:00
|
|
|
/* Number of times buffer was attached to a source (deletion can only occur when 0) */
|
2018-11-24 10:07:48 -08:00
|
|
|
RefCount ref{0u};
|
2009-10-22 08:53:59 -07:00
|
|
|
|
2012-04-19 22:14:02 -07:00
|
|
|
/* Self ID */
|
2018-11-24 10:07:48 -08:00
|
|
|
ALuint id{0};
|
2020-01-18 13:23:59 -08:00
|
|
|
|
2020-03-23 16:00:50 -07:00
|
|
|
DISABLE_ALLOC()
|
2022-01-30 14:47:32 +02:00
|
|
|
|
2022-01-30 05:42:44 -08:00
|
|
|
#ifdef ALSOFT_EAX
|
2022-01-30 14:47:32 +02:00
|
|
|
ALenum eax_x_ram_mode{AL_STORAGE_AUTOMATIC};
|
|
|
|
bool eax_x_ram_is_hardware{};
|
|
|
|
bool eax_x_ram_is_dirty{};
|
|
|
|
#endif // ALSOFT_EAX
|
2018-11-24 10:07:48 -08:00
|
|
|
};
|
2007-11-13 18:02:18 -08:00
|
|
|
|
|
|
|
#endif
|