Multiply samples with the cubic coeffs before transposing
[openal-soft.git] / OpenAL32 / Include / alBuffer.h
blobdd046da82053fe420ef8a08f48d2fff625d9039f
1 #ifndef _AL_BUFFER_H_
2 #define _AL_BUFFER_H_
4 #include "alMain.h"
6 #ifdef __cplusplus
7 extern "C" {
8 #endif
10 /* User formats */
11 enum UserFmtType {
12 UserFmtByte = AL_BYTE_SOFT,
13 UserFmtUByte = AL_UNSIGNED_BYTE_SOFT,
14 UserFmtShort = AL_SHORT_SOFT,
15 UserFmtUShort = AL_UNSIGNED_SHORT_SOFT,
16 UserFmtInt = AL_INT_SOFT,
17 UserFmtUInt = AL_UNSIGNED_INT_SOFT,
18 UserFmtFloat = AL_FLOAT_SOFT,
19 UserFmtDouble = AL_DOUBLE_SOFT,
20 UserFmtByte3 = AL_BYTE3_SOFT,
21 UserFmtUByte3 = AL_UNSIGNED_BYTE3_SOFT,
22 UserFmtMulaw,
23 UserFmtAlaw,
24 UserFmtIMA4,
25 UserFmtMSADPCM,
27 enum UserFmtChannels {
28 UserFmtMono = AL_MONO_SOFT,
29 UserFmtStereo = AL_STEREO_SOFT,
30 UserFmtRear = AL_REAR_SOFT,
31 UserFmtQuad = AL_QUAD_SOFT,
32 UserFmtX51 = AL_5POINT1_SOFT, /* (WFX order) */
33 UserFmtX61 = AL_6POINT1_SOFT, /* (WFX order) */
34 UserFmtX71 = AL_7POINT1_SOFT, /* (WFX order) */
35 UserFmtBFormat2D = 0x10000000, /* WXY */
36 UserFmtBFormat3D, /* WXYZ */
39 ALuint BytesFromUserFmt(enum UserFmtType type) DECL_CONST;
40 ALuint ChannelsFromUserFmt(enum UserFmtChannels chans) DECL_CONST;
41 inline ALuint FrameSizeFromUserFmt(enum UserFmtChannels chans, enum UserFmtType type)
43 return ChannelsFromUserFmt(chans) * BytesFromUserFmt(type);
47 /* Storable formats */
48 enum FmtType {
49 FmtByte = UserFmtByte,
50 FmtShort = UserFmtShort,
51 FmtFloat = UserFmtFloat,
53 enum FmtChannels {
54 FmtMono = UserFmtMono,
55 FmtStereo = UserFmtStereo,
56 FmtRear = UserFmtRear,
57 FmtQuad = UserFmtQuad,
58 FmtX51 = UserFmtX51,
59 FmtX61 = UserFmtX61,
60 FmtX71 = UserFmtX71,
61 FmtBFormat2D = UserFmtBFormat2D,
62 FmtBFormat3D = UserFmtBFormat3D,
64 #define MAX_INPUT_CHANNELS (8)
66 ALuint BytesFromFmt(enum FmtType type) DECL_CONST;
67 ALuint ChannelsFromFmt(enum FmtChannels chans) DECL_CONST;
68 inline ALuint FrameSizeFromFmt(enum FmtChannels chans, enum FmtType type)
70 return ChannelsFromFmt(chans) * BytesFromFmt(type);
74 typedef struct ALbuffer {
75 ALvoid *data;
77 ALsizei Frequency;
78 ALenum Format;
79 ALsizei SampleLen;
81 enum FmtChannels FmtChannels;
82 enum FmtType FmtType;
84 enum UserFmtChannels OriginalChannels;
85 enum UserFmtType OriginalType;
86 ALsizei OriginalSize;
87 ALsizei OriginalAlign;
89 ALsizei LoopStart;
90 ALsizei LoopEnd;
92 ATOMIC(ALsizei) UnpackAlign;
93 ATOMIC(ALsizei) PackAlign;
95 /* Number of times buffer was attached to a source (deletion can only occur when 0) */
96 RefCount ref;
98 RWLock lock;
100 /* Self ID */
101 ALuint id;
102 } ALbuffer;
104 ALbuffer *NewBuffer(ALCcontext *context);
105 void DeleteBuffer(ALCdevice *device, ALbuffer *buffer);
107 ALenum LoadData(ALbuffer *buffer, ALuint freq, ALenum NewFormat, ALsizei frames, enum UserFmtChannels SrcChannels, enum UserFmtType SrcType, const ALvoid *data, ALsizei align, ALboolean storesrc);
109 inline struct ALbuffer *LookupBuffer(ALCdevice *device, ALuint id)
110 { return (struct ALbuffer*)LookupUIntMapKey(&device->BufferMap, id); }
111 inline struct ALbuffer *RemoveBuffer(ALCdevice *device, ALuint id)
112 { return (struct ALbuffer*)RemoveUIntMapKey(&device->BufferMap, id); }
114 ALvoid ReleaseALBuffers(ALCdevice *device);
116 #ifdef __cplusplus
118 #endif
120 #endif