summaryrefslogtreecommitdiffstats
path: root/OpenAL32/Include/alSource.h
blob: ee2a5cd14e5861c5c6ec2fb98b96df834ed5af14 (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
#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

#define SRC_HISTORY_BITS   (6)
#define SRC_HISTORY_LENGTH (1<<SRC_HISTORY_BITS)
#define SRC_HISTORY_MASK   (SRC_HISTORY_LENGTH-1)

extern enum Resampler 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
{
    volatile ALfloat   flPitch;
    volatile ALfloat   flGain;
    volatile ALfloat   flOuterGain;
    volatile ALfloat   flMinGain;
    volatile ALfloat   flMaxGain;
    volatile ALfloat   flInnerAngle;
    volatile ALfloat   flOuterAngle;
    volatile ALfloat   flRefDistance;
    volatile ALfloat   flMaxDistance;
    volatile ALfloat   flRollOffFactor;
    volatile ALfloat   vPosition[3];
    volatile ALfloat   vVelocity[3];
    volatile ALfloat   vOrientation[3];
    volatile ALboolean bHeadRelative;
    volatile ALboolean bLooping;
    volatile enum DistanceModel DistanceModel;
    volatile ALboolean VirtualChannels;

    enum Resampler Resampler;

    volatile ALenum state;
    ALenum new_state;
    ALuint position;
    ALuint position_fraction;

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

    ALfloat DirectGain;
    ALfloat DirectGainHF;

    struct {
        struct ALeffectslot *Slot;
        ALfloat WetGain;
        ALfloat WetGainHF;
    } Send[MAX_SENDS];

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

    volatile ALfloat AirAbsorptionFactor;
    volatile ALfloat RoomRolloffFactor;
    volatile ALfloat DopplerFactor;

    ALint lOffset;
    ALint lOffsetType;

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

    ALuint NumChannels;
    ALuint SampleSize;

    /* HRTF info */
    ALboolean HrtfMoving;
    ALuint HrtfCounter;
    ALfloat HrtfHistory[MAXCHANNELS][SRC_HISTORY_LENGTH];
    ALfloat HrtfValues[MAXCHANNELS][HRIR_LENGTH][2];
    ALuint HrtfOffset;

    /* Current target parameters used for mixing */
    struct {
        MixerFunc DoMix;

        ALint Step;

        ALfloat HrtfGain;
        ALfloat HrtfDir[3];
        ALfloat HrtfCoeffs[MAXCHANNELS][HRIR_LENGTH][2];
        ALuint HrtfDelay[MAXCHANNELS][2];
        ALfloat HrtfCoeffStep[HRIR_LENGTH][2];
        ALint HrtfDelayStep[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 {
            struct ALeffectslot *Slot;
            ALfloat WetGain;
            FILTER iirFilter;
            ALfloat history[MAXCHANNELS];
        } Send[MAX_SENDS];
    } Params;
    volatile ALenum NeedsUpdate;

    ALvoid (*Update)(struct ALsource *self, const ALCcontext *context);

    // Index to itself
    ALuint source;
} ALsource;
#define ALsource_Update(s,a)                 ((s)->Update(s,a))

ALvoid SetSourceState(ALsource *Source, ALCcontext *Context, ALenum state);
ALboolean ApplyOffset(ALsource *Source);

ALvoid ReleaseALSources(ALCcontext *Context);

#ifdef __cplusplus
}
#endif

#endif