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"
|
|
|
|
#include "almalloc.h"
|
2018-01-26 21:32:43 -08:00
|
|
|
#include "atomic.h"
|
2019-07-28 21:29:59 -07:00
|
|
|
#include "inprogext.h"
|
2018-11-24 10:07:48 -08:00
|
|
|
#include "vector.h"
|
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 {
|
2018-01-21 17:19:57 -08:00
|
|
|
UserFmtUByte,
|
|
|
|
UserFmtShort,
|
|
|
|
UserFmtFloat,
|
|
|
|
UserFmtDouble,
|
|
|
|
UserFmtMulaw,
|
2018-01-19 19:28:23 -08:00
|
|
|
UserFmtAlaw,
|
2012-01-10 00:58:07 -08:00
|
|
|
UserFmtIMA4,
|
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 {
|
2018-01-21 17:19:57 -08:00
|
|
|
UserFmtMono,
|
|
|
|
UserFmtStereo,
|
|
|
|
UserFmtRear,
|
|
|
|
UserFmtQuad,
|
|
|
|
UserFmtX51, /* (WFX order) */
|
|
|
|
UserFmtX61, /* (WFX order) */
|
|
|
|
UserFmtX71, /* (WFX order) */
|
2020-04-03 10:07:43 -07:00
|
|
|
UserFmtBFormat2D,
|
|
|
|
UserFmtBFormat3D,
|
2010-11-27 15:33:33 -08:00
|
|
|
};
|
|
|
|
|
2010-11-28 12:53:35 -08:00
|
|
|
|
2010-11-27 15:33:33 -08:00
|
|
|
/* Storable formats */
|
2019-06-30 17:41:43 -07:00
|
|
|
enum FmtType : unsigned char {
|
2018-01-21 18:34:03 -08:00
|
|
|
FmtUByte = UserFmtUByte,
|
|
|
|
FmtShort = UserFmtShort,
|
|
|
|
FmtFloat = UserFmtFloat,
|
|
|
|
FmtDouble = UserFmtDouble,
|
|
|
|
FmtMulaw = UserFmtMulaw,
|
|
|
|
FmtAlaw = UserFmtAlaw,
|
2010-11-26 23:42:30 -08:00
|
|
|
};
|
2019-06-30 17:41:43 -07:00
|
|
|
enum FmtChannels : unsigned char {
|
2011-03-16 05:47:07 -07:00
|
|
|
FmtMono = UserFmtMono,
|
2010-12-03 22:33:41 -08:00
|
|
|
FmtStereo = UserFmtStereo,
|
2011-03-16 05:47:07 -07:00
|
|
|
FmtRear = UserFmtRear,
|
|
|
|
FmtQuad = UserFmtQuad,
|
|
|
|
FmtX51 = UserFmtX51,
|
|
|
|
FmtX61 = UserFmtX61,
|
|
|
|
FmtX71 = UserFmtX71,
|
2014-10-31 17:18:45 -07:00
|
|
|
FmtBFormat2D = UserFmtBFormat2D,
|
|
|
|
FmtBFormat3D = UserFmtBFormat3D,
|
2010-11-26 23:42:30 -08:00
|
|
|
};
|
2018-11-20 02:42:49 -08:00
|
|
|
|
2020-01-18 13:23:59 -08:00
|
|
|
ALuint BytesFromFmt(FmtType type) noexcept;
|
2020-04-03 21:43:57 -07:00
|
|
|
ALuint ChannelsFromFmt(FmtChannels chans, ALuint ambiorder) noexcept;
|
|
|
|
inline ALuint FrameSizeFromFmt(FmtChannels chans, FmtType type, ALuint ambiorder) noexcept
|
|
|
|
{ return ChannelsFromFmt(chans, ambiorder) * BytesFromFmt(type); }
|
2010-11-28 12:53:35 -08:00
|
|
|
|
2010-11-26 23:42:30 -08:00
|
|
|
|
2018-11-24 10:07:48 -08:00
|
|
|
struct ALbuffer {
|
2019-05-24 06:12:20 -07:00
|
|
|
al::vector<al::byte,16> mData;
|
2009-10-22 08:53:59 -07:00
|
|
|
|
2019-09-21 16:47:33 -07:00
|
|
|
ALuint Frequency{0u};
|
2018-11-24 10:07:48 -08:00
|
|
|
ALbitfieldSOFT Access{0u};
|
2019-07-31 09:20:53 -07:00
|
|
|
ALuint SampleLen{0u};
|
2011-10-03 10:07:50 -07:00
|
|
|
|
2018-12-24 19:29:01 -08:00
|
|
|
FmtChannels mFmtChannels{};
|
|
|
|
FmtType mFmtType{};
|
2009-10-22 08:53:59 -07:00
|
|
|
|
2018-12-24 19:29:01 -08:00
|
|
|
UserFmtType OriginalType{};
|
2019-09-11 14:33:26 -07:00
|
|
|
ALuint OriginalSize{0};
|
|
|
|
ALuint OriginalAlign{0};
|
2010-05-12 01:36:09 -07:00
|
|
|
|
2019-12-02 11:39:30 -08:00
|
|
|
ALenum AmbiLayout{AL_FUMA_SOFT};
|
|
|
|
ALenum AmbiScaling{AL_FUMA_SOFT};
|
|
|
|
|
2020-02-17 00:22:51 -08:00
|
|
|
LPALBUFFERCALLBACKTYPESOFT Callback{nullptr};
|
|
|
|
void *UserData{nullptr};
|
|
|
|
|
2019-07-31 09:20:53 -07:00
|
|
|
ALuint LoopStart{0u};
|
|
|
|
ALuint LoopEnd{0u};
|
2010-05-13 02:03:48 -07:00
|
|
|
|
2019-09-11 14:33:26 -07:00
|
|
|
ALuint UnpackAlign{0};
|
|
|
|
ALuint PackAlign{0};
|
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
|
|
|
|
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
|
|
|
|
|
|
|
inline ALuint bytesFromFmt() const noexcept { return BytesFromFmt(mFmtType); }
|
2020-04-03 21:43:57 -07:00
|
|
|
inline ALuint channelsFromFmt() const noexcept { return ChannelsFromFmt(mFmtChannels, 1); }
|
2020-01-18 13:23:59 -08:00
|
|
|
inline ALuint frameSizeFromFmt() const noexcept { return channelsFromFmt() * bytesFromFmt(); }
|
2020-03-23 16:00:50 -07:00
|
|
|
|
|
|
|
DISABLE_ALLOC()
|
2018-11-24 10:07:48 -08:00
|
|
|
};
|
2007-11-13 18:02:18 -08:00
|
|
|
|
|
|
|
#endif
|