9613b4bfe2
Rather than each buffer being individually allocated with a generated 'thunk' ID that's used with a uint:ptr map, buffers are allocated in arrays of 64 within a vector. Each group of 64 has an associated 64-bit mask indicating which are free to use, and the buffer ID is comprised of the two array indices which directly locate the buffer (no searching, binary or otherwise). Currently no buffers are actually deallocated after being allocated, though they are reused. So an app that creates a ton of buffers once, then deletes them all and uses only a couple from then on, will have a bit of waste, while an app that's more consistent with the number of used buffers won't be a problem. This can be improved by removing elements of the containing vector that contain all-free buffers while there are plenty of other free buffers. Also, this method can easily be applied to other resources, like sources.
118 lines
2.4 KiB
C
118 lines
2.4 KiB
C
#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 "rwlock.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* 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(enum UserFmtType type);
|
|
ALsizei ChannelsFromUserFmt(enum UserFmtChannels chans);
|
|
inline ALsizei FrameSizeFromUserFmt(enum UserFmtChannels chans, enum 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)
|
|
|
|
ALsizei BytesFromFmt(enum FmtType type);
|
|
ALsizei ChannelsFromFmt(enum FmtChannels chans);
|
|
inline ALsizei FrameSizeFromFmt(enum FmtChannels chans, enum FmtType type)
|
|
{
|
|
return ChannelsFromFmt(chans) * BytesFromFmt(type);
|
|
}
|
|
|
|
|
|
typedef struct ALbuffer {
|
|
ALvoid *data;
|
|
|
|
ALsizei Frequency;
|
|
ALbitfieldSOFT Access;
|
|
ALsizei SampleLen;
|
|
|
|
enum FmtChannels FmtChannels;
|
|
enum FmtType FmtType;
|
|
ALsizei BytesAlloc;
|
|
|
|
enum UserFmtType OriginalType;
|
|
ALsizei OriginalSize;
|
|
ALsizei OriginalAlign;
|
|
|
|
ALsizei LoopStart;
|
|
ALsizei LoopEnd;
|
|
|
|
ATOMIC(ALsizei) UnpackAlign;
|
|
ATOMIC(ALsizei) PackAlign;
|
|
|
|
ALbitfieldSOFT MappedAccess;
|
|
ALsizei MappedOffset;
|
|
ALsizei MappedSize;
|
|
|
|
/* Number of times buffer was attached to a source (deletion can only occur when 0) */
|
|
RefCount ref;
|
|
|
|
RWLock lock;
|
|
|
|
/* Self ID */
|
|
ALuint id;
|
|
} ALbuffer;
|
|
|
|
ALvoid ReleaseALBuffers(ALCdevice *device);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|