#ifndef _AL_BUFFER_H_
|
|
#define _AL_BUFFER_H_
|
|
|
|
#include "AL/alc.h"
|
|
#include "AL/al.h"
|
|
#include "AL/alext.h"
|
|
|
|
#include "inprogext.h"
|
|
#include "atomic.h"
|
|
#include "vector.h"
|
|
|
|
|
|
/* User formats */
|
|
enum UserFmtType {
|
|
UserFmtUByte,
|
|
UserFmtShort,
|
|
UserFmtFloat,
|
|
UserFmtDouble,
|
|
UserFmtMulaw,
|
|
UserFmtAlaw,
|
|
UserFmtIMA4,
|
|
UserFmtMSADPCM,
|
|
};
|
|
enum UserFmtChannels {
|
|
UserFmtMono,
|
|
UserFmtStereo,
|
|
UserFmtRear,
|
|
UserFmtQuad,
|
|
UserFmtX51, /* (WFX order) */
|
|
UserFmtX61, /* (WFX order) */
|
|
UserFmtX71, /* (WFX order) */
|
|
UserFmtBFormat2D, /* WXY */
|
|
UserFmtBFormat3D, /* WXYZ */
|
|
};
|
|
|
|
ALsizei BytesFromUserFmt(UserFmtType type);
|
|
ALsizei ChannelsFromUserFmt(UserFmtChannels chans);
|
|
inline ALsizei FrameSizeFromUserFmt(UserFmtChannels chans, UserFmtType type)
|
|
{ return ChannelsFromUserFmt(chans) * BytesFromUserFmt(type); }
|
|
|
|
|
|
/* Storable formats */
|
|
enum FmtType {
|
|
FmtUByte = UserFmtUByte,
|
|
FmtShort = UserFmtShort,
|
|
FmtFloat = UserFmtFloat,
|
|
FmtDouble = UserFmtDouble,
|
|
FmtMulaw = UserFmtMulaw,
|
|
FmtAlaw = UserFmtAlaw,
|
|
};
|
|
enum FmtChannels {
|
|
FmtMono = UserFmtMono,
|
|
FmtStereo = UserFmtStereo,
|
|
FmtRear = UserFmtRear,
|
|
FmtQuad = UserFmtQuad,
|
|
FmtX51 = UserFmtX51,
|
|
FmtX61 = UserFmtX61,
|
|
FmtX71 = UserFmtX71,
|
|
FmtBFormat2D = UserFmtBFormat2D,
|
|
FmtBFormat3D = UserFmtBFormat3D,
|
|
};
|
|
#define MAX_INPUT_CHANNELS (8)
|
|
|
|
/* DevFmtType traits, providing the type, etc given a DevFmtType. */
|
|
template<FmtType T>
|
|
struct FmtTypeTraits { };
|
|
|
|
template<>
|
|
struct FmtTypeTraits<FmtUByte> { using Type = ALubyte; };
|
|
template<>
|
|
struct FmtTypeTraits<FmtShort> { using Type = ALshort; };
|
|
template<>
|
|
struct FmtTypeTraits<FmtFloat> { using Type = ALfloat; };
|
|
template<>
|
|
struct FmtTypeTraits<FmtDouble> { using Type = ALdouble; };
|
|
template<>
|
|
struct FmtTypeTraits<FmtMulaw> { using Type = ALubyte; };
|
|
template<>
|
|
struct FmtTypeTraits<FmtAlaw> { using Type = ALubyte; };
|
|
|
|
|
|
ALsizei BytesFromFmt(FmtType type);
|
|
ALsizei ChannelsFromFmt(FmtChannels chans);
|
|
inline ALsizei FrameSizeFromFmt(FmtChannels chans, FmtType type)
|
|
{ return ChannelsFromFmt(chans) * BytesFromFmt(type); }
|
|
|
|
|
|
struct ALbuffer {
|
|
al::vector<ALbyte,16> mData;
|
|
|
|
ALsizei Frequency{0};
|
|
ALbitfieldSOFT Access{0u};
|
|
ALsizei SampleLen{0};
|
|
|
|
FmtChannels mFmtChannels{};
|
|
FmtType mFmtType{};
|
|
ALsizei BytesAlloc{0};
|
|
|
|
UserFmtType OriginalType{};
|
|
ALsizei OriginalSize{0};
|
|
ALsizei OriginalAlign{0};
|
|
|
|
ALsizei LoopStart{0};
|
|
ALsizei LoopEnd{0};
|
|
|
|
std::atomic<ALsizei> UnpackAlign{0};
|
|
std::atomic<ALsizei> PackAlign{0};
|
|
|
|
ALbitfieldSOFT MappedAccess{0u};
|
|
ALsizei MappedOffset{0};
|
|
ALsizei MappedSize{0};
|
|
|
|
/* Number of times buffer was attached to a source (deletion can only occur when 0) */
|
|
RefCount ref{0u};
|
|
|
|
/* Self ID */
|
|
ALuint id{0};
|
|
};
|
|
|
|
#endif
|