summaryrefslogtreecommitdiffstats
path: root/OpenAL32/Include/alBuffer.h
blob: c3835f9770c4079211c3a0020181155c935f8e45 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#ifndef _AL_BUFFER_H_
#define _AL_BUFFER_H_

#include "AL/al.h"

#ifdef __cplusplus
extern "C" {
#endif

/* Input formats (some are currently theoretical) */
enum SrcFmtType {
    SrcFmtByte,   /* AL_BYTE */
    SrcFmtUByte,  /* AL_UNSIGNED_BYTE */
    SrcFmtShort,  /* AL_SHORT */
    SrcFmtUShort, /* AL_UNSIGNED_SHORT */
    SrcFmtFloat,  /* AL_FLOAT */
    SrcFmtDouble, /* AL_DOUBLE */
    SrcFmtMulaw,  /* AL_MULAW */
};
enum SrcFmtChannels {
    SrcFmtMono,   /* AL_MONO */
    SrcFmtStereo, /* AL_STEREO */
    SrcFmtRear,   /* AL_REAR */
    SrcFmtQuad,   /* AL_QUAD */
    SrcFmtX51,    /* AL_5POINT1 (WFX order) */
    SrcFmtX61,    /* AL_6POINT1 (WFX order) */
    SrcFmtX71,    /* AL_7POINT1 (WFX order) */
};

void DecomposeInputFormat(ALenum format, enum SrcFmtType *type,
                          enum SrcFmtChannels *order);

static __inline ALuint BytesFromSrcFmt(enum SrcFmtType type)
{
    switch(type)
    {
    case SrcFmtByte: return sizeof(ALbyte);
    case SrcFmtUByte: return sizeof(ALubyte);
    case SrcFmtShort: return sizeof(ALshort);
    case SrcFmtUShort: return sizeof(ALushort);
    case SrcFmtFloat: return sizeof(ALfloat);
    case SrcFmtDouble: return sizeof(ALdouble);
    case SrcFmtMulaw: return sizeof(ALubyte);
    }
    return 0;
}
static __inline ALuint ChannelsFromSrcFmt(enum SrcFmtChannels chans)
{
    switch(chans)
    {
    case SrcFmtMono: return 1;
    case SrcFmtStereo: return 2;
    case SrcFmtRear: return 2;
    case SrcFmtQuad: return 4;
    case SrcFmtX51: return 6;
    case SrcFmtX61: return 7;
    case SrcFmtX71: return 8;
    }
    return 0;
}
static __inline ALuint FrameSizeFromSrcFmt(enum SrcFmtType type,
                                           enum SrcFmtChannels chans)
{
    return BytesFromSrcFmt(type) * ChannelsFromSrcFmt(chans);
}


/* Storable formats */
enum FmtType {
    FmtUByte,
    FmtShort,
    FmtFloat,
    FmtDouble,
};
enum FmtChannels {
    FmtMono,
    FmtStereo,
    FmtRear,
    FmtQuad,
    Fmt51ChanWFX,
    Fmt61ChanWFX,
    Fmt71ChanWFX,
};

void DecomposeFormat(ALenum format, enum FmtType *type, enum FmtChannels *order);

static __inline ALuint BytesFromFmt(enum FmtType type)
{
    switch(type)
    {
    case FmtUByte: return sizeof(ALubyte);
    case FmtShort: return sizeof(ALshort);
    case FmtFloat: return sizeof(ALfloat);
    case FmtDouble: return sizeof(ALdouble);
    }
    return 0;
}
static __inline ALuint ChannelsFromFmt(enum FmtChannels chans)
{
    switch(chans)
    {
    case FmtMono: return 1;
    case FmtStereo: return 2;
    case FmtRear: return 2;
    case FmtQuad: return 4;
    case Fmt51ChanWFX: return 6;
    case Fmt61ChanWFX: return 7;
    case Fmt71ChanWFX: return 8;
    }
    return 0;
}
static __inline ALuint FrameSizeFromFmt(enum FmtType type, enum FmtChannels chans)
{
    return BytesFromFmt(type) * ChannelsFromFmt(chans);
}


typedef struct ALbuffer
{
    ALvoid  *data;
    ALsizei  size;

    ALsizei          frequency;
    enum FmtType     FmtType;
    enum FmtChannels FmtChannels;

    ALenum   eOriginalFormat;
    ALsizei  OriginalSize;
    ALsizei  OriginalAlign;

    ALsizei  LoopStart;
    ALsizei  LoopEnd;

    ALuint   refcount; // Number of sources using this buffer (deletion can only occur when this is 0)

    // Index to itself
    ALuint buffer;
} ALbuffer;

ALvoid ReleaseALBuffers(ALCdevice *device);

#ifdef __cplusplus
}
#endif

#endif