summaryrefslogtreecommitdiffstats
path: root/OpenAL32/Include/alSource.h
blob: 1b9d92ad04e67ff7cf12f13ebb6bf0de8ad6b15a (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
#ifndef _AL_SOURCE_H_
#define _AL_SOURCE_H_

#define MAX_SENDS                 4

#include "alFilter.h"
#include "alu.h"
#include "AL/al.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef enum {
    POINT_RESAMPLER = 0,
    LINEAR_RESAMPLER,
    CUBIC_RESAMPLER,

    RESAMPLER_MAX,
    RESAMPLER_MIN = -1,
    RESAMPLER_DEFAULT = LINEAR_RESAMPLER
} resampler_t;
extern resampler_t DefaultResampler;

extern const ALsizei ResamplerPadding[RESAMPLER_MAX];
extern const ALsizei ResamplerPrePadding[RESAMPLER_MAX];


typedef struct ALbufferlistitem
{
    struct ALbuffer         *buffer;
    struct ALbufferlistitem *next;
    struct ALbufferlistitem *prev;
} ALbufferlistitem;

typedef struct ALsource
{
    ALfloat      flPitch;
    ALfloat      flGain;
    ALfloat      flOuterGain;
    ALfloat      flMinGain;
    ALfloat      flMaxGain;
    ALfloat      flInnerAngle;
    ALfloat      flOuterAngle;
    ALfloat      flRefDistance;
    ALfloat      flMaxDistance;
    ALfloat      flRollOffFactor;
    ALfloat      vPosition[3];
    ALfloat      vVelocity[3];
    ALfloat      vOrientation[3];
    ALboolean    bHeadRelative;
    ALboolean    bLooping;
    ALenum       DistanceModel;

    resampler_t  Resampler;

    ALenum       state;
    ALuint       position;
    ALuint       position_fraction;

    struct ALbuffer *Buffer;

    ALbufferlistitem *queue; // Linked list of buffers in queue
    ALuint BuffersInQueue;   // Number of buffers in queue
    ALuint BuffersPlayed;    // Number of buffers played on this loop

    ALfilter DirectFilter;

    struct {
        struct ALeffectslot *Slot;
        ALfilter WetFilter;
    } Send[MAX_SENDS];

    ALboolean DryGainHFAuto;
    ALboolean WetGainAuto;
    ALboolean WetGainHFAuto;
    ALfloat   OuterGainHF;

    ALfloat AirAbsorptionFactor;
    ALfloat RoomRolloffFactor;
    ALfloat DopplerFactor;

    ALint  lOffset;
    ALint  lOffsetType;

    // Source Type (Static, Streaming, or Undetermined)
    ALint  lSourceType;

    /* HRTF info */
    ALfloat HrtfHistory[MAXCHANNELS][HRTF_LENGTH];
    ALuint HrtfOffset;

    // Current target parameters used for mixing
    ALboolean NeedsUpdate;
    struct {
        ALint Step;

        ALfloat HrtfCoeffs[MAXCHANNELS][HRTF_LENGTH][2];

        /* A mixing matrix. First subscript is the channel number of the input
         * data (regardless of channel configuration) and the second is the
         * channel target (eg. FRONT_LEFT) */
        ALfloat DryGains[MAXCHANNELS][MAXCHANNELS];
        FILTER iirFilter;
        ALfloat history[MAXCHANNELS*2];

        struct {
            ALfloat WetGain;
            FILTER iirFilter;
            ALfloat history[MAXCHANNELS];
        } Send[MAX_SENDS];
    } Params;

    ALvoid (*Update)(struct ALsource *self, const ALCcontext *context);
    ALvoid (*DoMix)(struct ALsource *self, ALCdevice *Device,
                    const ALvoid *RESTRICT data,
                    ALuint *DataPosInt, ALuint *DataPosFrac,
                    ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize);
    ALvoid (*DoHrtfMix)(struct ALsource *self, ALCdevice *Device,
                        const ALvoid *RESTRICT data,
                        ALuint *DataPosInt, ALuint *DataPosFrac,
                        ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize);

    // Index to itself
    ALuint source;
} ALsource;
#define ALsource_Update(s,a)                 ((s)->Update(s,a))
#define ALsource_DoMix(s,a,b,c,d,e,f,g)      ((s)->DoMix(s,a,b,c,d,e,f,g))
#define ALsource_DoHrtfMix(s,a,b,c,d,e,f,g)  ((s)->DoHrtfMix(s,a,b,c,d,e,f,g))

ALvoid ReleaseALSources(ALCcontext *Context);

#ifdef __cplusplus
}
#endif

#endif