Store double formats as float
[openal-soft.git] / OpenAL32 / Include / alBuffer.h
blob8230f2b05739d995afb107c8a2d165580112a2e3
1 #ifndef _AL_BUFFER_H_
2 #define _AL_BUFFER_H_
4 #include "AL/al.h"
6 #ifdef __cplusplus
7 extern "C" {
8 #endif
10 /* Input formats (some are currently theoretical) */
11 enum SrcFmtType {
12 SrcFmtByte, /* AL_BYTE */
13 SrcFmtUByte, /* AL_UNSIGNED_BYTE */
14 SrcFmtShort, /* AL_SHORT */
15 SrcFmtUShort, /* AL_UNSIGNED_SHORT */
16 SrcFmtFloat, /* AL_FLOAT */
17 SrcFmtDouble, /* AL_DOUBLE */
18 SrcFmtMulaw, /* AL_MULAW */
20 enum SrcFmtChannels {
21 SrcFmtMono, /* AL_MONO */
22 SrcFmtStereo, /* AL_STEREO */
23 SrcFmtRear, /* AL_REAR */
24 SrcFmtQuad, /* AL_QUAD */
25 SrcFmtX51, /* AL_5POINT1 (WFX order) */
26 SrcFmtX61, /* AL_6POINT1 (WFX order) */
27 SrcFmtX71, /* AL_7POINT1 (WFX order) */
30 void DecomposeInputFormat(ALenum format, enum SrcFmtType *type,
31 enum SrcFmtChannels *order);
33 static __inline ALuint BytesFromSrcFmt(enum SrcFmtType type)
35 switch(type)
37 case SrcFmtByte: return sizeof(ALbyte);
38 case SrcFmtUByte: return sizeof(ALubyte);
39 case SrcFmtShort: return sizeof(ALshort);
40 case SrcFmtUShort: return sizeof(ALushort);
41 case SrcFmtFloat: return sizeof(ALfloat);
42 case SrcFmtDouble: return sizeof(ALdouble);
43 case SrcFmtMulaw: return sizeof(ALubyte);
45 return 0;
47 static __inline ALuint ChannelsFromSrcFmt(enum SrcFmtChannels chans)
49 switch(chans)
51 case SrcFmtMono: return 1;
52 case SrcFmtStereo: return 2;
53 case SrcFmtRear: return 2;
54 case SrcFmtQuad: return 4;
55 case SrcFmtX51: return 6;
56 case SrcFmtX61: return 7;
57 case SrcFmtX71: return 8;
59 return 0;
61 static __inline ALuint FrameSizeFromSrcFmt(enum SrcFmtType type,
62 enum SrcFmtChannels chans)
64 return BytesFromSrcFmt(type) * ChannelsFromSrcFmt(chans);
68 /* Storable formats */
69 enum FmtType {
70 FmtUByte,
71 FmtShort,
72 FmtFloat,
74 enum FmtChannels {
75 FmtMono,
76 FmtStereo,
77 FmtRear,
78 FmtQuad,
79 FmtX51,
80 FmtX61,
81 FmtX71,
84 void DecomposeFormat(ALenum format, enum FmtType *type, enum FmtChannels *order);
86 static __inline ALuint BytesFromFmt(enum FmtType type)
88 switch(type)
90 case FmtUByte: return sizeof(ALubyte);
91 case FmtShort: return sizeof(ALshort);
92 case FmtFloat: return sizeof(ALfloat);
94 return 0;
96 static __inline ALuint ChannelsFromFmt(enum FmtChannels chans)
98 switch(chans)
100 case FmtMono: return 1;
101 case FmtStereo: return 2;
102 case FmtRear: return 2;
103 case FmtQuad: return 4;
104 case FmtX51: return 6;
105 case FmtX61: return 7;
106 case FmtX71: return 8;
108 return 0;
110 static __inline ALuint FrameSizeFromFmt(enum FmtType type, enum FmtChannels chans)
112 return BytesFromFmt(type) * ChannelsFromFmt(chans);
116 typedef struct ALbuffer
118 ALvoid *data;
119 ALsizei size;
121 ALsizei Frequency;
122 enum FmtType FmtType;
123 enum FmtChannels FmtChannels;
125 ALenum OriginalFormat;
126 ALsizei OriginalSize;
127 ALsizei OriginalAlign;
129 ALsizei LoopStart;
130 ALsizei LoopEnd;
132 ALuint refcount; // Number of sources using this buffer (deletion can only occur when this is 0)
134 // Index to itself
135 ALuint buffer;
136 } ALbuffer;
138 ALvoid ReleaseALBuffers(ALCdevice *device);
140 #ifdef __cplusplus
142 #endif
144 #endif