~ubuntu-branches/ubuntu/saucy/openal-soft/saucy

« back to all changes in this revision

Viewing changes to OpenAL32/Include/alu.h

  • Committer: Bazaar Package Importer
  • Author(s): Andres Mejia
  • Date: 2011-04-22 18:30:58 UTC
  • mfrom: (7.1.3 sid)
  • Revision ID: james.westby@ubuntu.com-20110422183058-pgxqd8022xk3vwao
Tags: 1:1.13-2
Don't build with ALSA compatibility on non-Linux architectures.

Show diffs side-by-side

added added

removed removed

Lines of Context:
5
5
#include "AL/alc.h"
6
6
#include "AL/alext.h"
7
7
 
 
8
#include <limits.h>
8
9
#include <math.h>
9
10
#ifdef HAVE_FLOAT_H
10
11
#include <float.h>
71
72
    SIDE_LEFT,
72
73
    SIDE_RIGHT,
73
74
 
74
 
    OUTPUTCHANNELS
 
75
    MAXCHANNELS
75
76
} Channel;
76
77
 
77
 
#define BUFFERSIZE 16384
78
 
 
79
 
extern ALboolean DuplicateStereo;
80
 
 
81
 
/* NOTE: The AL_FORMAT_REAR* enums aren't handled here be cause they're
82
 
 *       converted to AL_FORMAT_QUAD* when loaded */
83
 
static __inline ALuint aluBytesFromFormat(ALenum format)
84
 
{
85
 
    switch(format)
86
 
    {
87
 
        case AL_FORMAT_MONO8:
88
 
        case AL_FORMAT_STEREO8:
89
 
        case AL_FORMAT_QUAD8_LOKI:
90
 
        case AL_FORMAT_QUAD8:
91
 
        case AL_FORMAT_51CHN8:
92
 
        case AL_FORMAT_61CHN8:
93
 
        case AL_FORMAT_71CHN8:
94
 
            return 1;
95
 
 
96
 
        case AL_FORMAT_MONO16:
97
 
        case AL_FORMAT_STEREO16:
98
 
        case AL_FORMAT_QUAD16_LOKI:
99
 
        case AL_FORMAT_QUAD16:
100
 
        case AL_FORMAT_51CHN16:
101
 
        case AL_FORMAT_61CHN16:
102
 
        case AL_FORMAT_71CHN16:
103
 
            return 2;
104
 
 
105
 
        case AL_FORMAT_MONO_FLOAT32:
106
 
        case AL_FORMAT_STEREO_FLOAT32:
107
 
        case AL_FORMAT_QUAD32:
108
 
        case AL_FORMAT_51CHN32:
109
 
        case AL_FORMAT_61CHN32:
110
 
        case AL_FORMAT_71CHN32:
111
 
            return 4;
112
 
 
113
 
        case AL_FORMAT_MONO_DOUBLE_EXT:
114
 
        case AL_FORMAT_STEREO_DOUBLE_EXT:
115
 
            return 8;
116
 
 
117
 
        default:
118
 
            return 0;
119
 
    }
120
 
}
121
 
static __inline ALuint aluChannelsFromFormat(ALenum format)
122
 
{
123
 
    switch(format)
124
 
    {
125
 
        case AL_FORMAT_MONO8:
126
 
        case AL_FORMAT_MONO16:
127
 
        case AL_FORMAT_MONO_FLOAT32:
128
 
        case AL_FORMAT_MONO_DOUBLE_EXT:
129
 
            return 1;
130
 
 
131
 
        case AL_FORMAT_STEREO8:
132
 
        case AL_FORMAT_STEREO16:
133
 
        case AL_FORMAT_STEREO_FLOAT32:
134
 
        case AL_FORMAT_STEREO_DOUBLE_EXT:
135
 
            return 2;
136
 
 
137
 
        case AL_FORMAT_QUAD8_LOKI:
138
 
        case AL_FORMAT_QUAD16_LOKI:
139
 
        case AL_FORMAT_QUAD8:
140
 
        case AL_FORMAT_QUAD16:
141
 
        case AL_FORMAT_QUAD32:
142
 
            return 4;
143
 
 
144
 
        case AL_FORMAT_51CHN8:
145
 
        case AL_FORMAT_51CHN16:
146
 
        case AL_FORMAT_51CHN32:
147
 
            return 6;
148
 
 
149
 
        case AL_FORMAT_61CHN8:
150
 
        case AL_FORMAT_61CHN16:
151
 
        case AL_FORMAT_61CHN32:
152
 
            return 7;
153
 
 
154
 
        case AL_FORMAT_71CHN8:
155
 
        case AL_FORMAT_71CHN16:
156
 
        case AL_FORMAT_71CHN32:
157
 
            return 8;
158
 
 
159
 
        default:
160
 
            return 0;
161
 
    }
162
 
}
163
 
 
164
 
static __inline ALint aluCart2LUTpos(ALfloat re, ALfloat im)
165
 
{
166
 
    ALint pos = 0;
167
 
    ALfloat denom = aluFabs(re) + aluFabs(im);
168
 
    if(denom > 0.0f)
169
 
        pos = (ALint)(QUADRANT_NUM*aluFabs(im) / denom + 0.5);
170
 
 
171
 
    if(re < 0.0)
172
 
        pos = 2 * QUADRANT_NUM - pos;
173
 
    if(im < 0.0)
174
 
        pos = LUT_NUM - pos;
175
 
    return pos%LUT_NUM;
176
 
}
177
 
 
178
 
ALvoid aluInitPanning(ALCcontext *Context);
 
78
#define BUFFERSIZE 4096
 
79
 
 
80
#define FRACTIONBITS (14)
 
81
#define FRACTIONONE  (1<<FRACTIONBITS)
 
82
#define FRACTIONMASK (FRACTIONONE-1)
 
83
 
 
84
/* Size for temporary stack storage of buffer data. Larger values need more
 
85
 * stack, while smaller values may need more iterations. The value needs to be
 
86
 * a sensible size, however, as it constrains the max stepping value used for
 
87
 * mixing.
 
88
 * The mixer requires being able to do two samplings per mixing loop. A 16KB
 
89
 * buffer can hold 512 sample frames for a 7.1 float buffer. With the cubic
 
90
 * resampler (which requires 3 padding sample frames), this limits the maximum
 
91
 * step to about 508. This means that buffer_freq*source_pitch cannot exceed
 
92
 * device_freq*508 for an 8-channel 32-bit buffer. */
 
93
#ifndef STACK_DATA_SIZE
 
94
#define STACK_DATA_SIZE  16384
 
95
#endif
 
96
 
 
97
 
 
98
static __inline ALdouble lerp(ALdouble val1, ALdouble val2, ALdouble mu)
 
99
{
 
100
    return val1 + (val2-val1)*mu;
 
101
}
 
102
static __inline ALdouble cubic(ALdouble val0, ALdouble val1, ALdouble val2, ALdouble val3, ALdouble mu)
 
103
{
 
104
    ALdouble mu2 = mu*mu;
 
105
    ALdouble a0 = -0.5*val0 +  1.5*val1 + -1.5*val2 +  0.5*val3;
 
106
    ALdouble a1 =      val0 + -2.5*val1 +  2.0*val2 + -0.5*val3;
 
107
    ALdouble a2 = -0.5*val0             +  0.5*val2;
 
108
    ALdouble a3 =                  val1;
 
109
 
 
110
    return a0*mu*mu2 + a1*mu2 + a2*mu + a3;
 
111
}
 
112
 
 
113
struct ALsource;
 
114
 
 
115
ALvoid aluInitPanning(ALCdevice *Device);
 
116
ALint aluCart2LUTpos(ALfloat re, ALfloat im);
 
117
 
 
118
ALvoid CalcSourceParams(struct ALsource *ALSource, const ALCcontext *ALContext);
 
119
ALvoid CalcNonAttnSourceParams(struct ALsource *ALSource, const ALCcontext *ALContext);
 
120
 
 
121
ALvoid MixSource(struct ALsource *Source, ALCdevice *Device, ALuint SamplesToDo);
 
122
 
179
123
ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size);
180
124
ALvoid aluHandleDisconnect(ALCdevice *device);
181
125