25 |
#include <iostream> |
#include <iostream> |
26 |
#include <SDL_endian.h> |
#include <SDL_endian.h> |
27 |
|
|
28 |
#define SAMPLE_COUNT_PER_SLICE 8192 |
#define SAMPLE_COUNT_PER_SLICE 8192*8 |
29 |
|
#define INTERPOLATION_RANGE 65535 |
30 |
|
#define INTERPOLATION_BITS 16 |
31 |
|
|
32 |
#if SDL_BYTEORDER == SDL_LIL_ENDIAN |
#if SDL_BYTEORDER == SDL_LIL_ENDIAN |
33 |
#define OGG_BYTEORDER 0 |
#define OGG_BYTEORDER 0 |
40 |
static void initInterpolationTable(void) |
static void initInterpolationTable(void) |
41 |
{ |
{ |
42 |
double l = static_cast<double>(SAMPLE_COUNT_PER_SLICE-1); |
double l = static_cast<double>(SAMPLE_COUNT_PER_SLICE-1); |
43 |
double m = 65535; |
double m = INTERPOLATION_RANGE; |
44 |
double a = - (2) / (l * l * l); |
double a = - (2) / (l * l * l); |
45 |
double b = (3) / (l * l); |
double b = (3) / (l * l); |
46 |
for (unsigned i=0; i<SAMPLE_COUNT_PER_SLICE; i++) |
for (unsigned i=0; i<SAMPLE_COUNT_PER_SLICE; i++) |
72 |
// read first ogg |
// read first ogg |
73 |
rest = len; |
rest = len; |
74 |
p = reinterpret_cast<char *>(track0); |
p = reinterpret_cast<char *>(track0); |
75 |
|
ogg_int64_t firstPos = ov_pcm_tell(mixer->tracks[mixer->actTrack]); |
76 |
while(rest > 0) |
while(rest > 0) |
77 |
{ |
{ |
78 |
int bs; |
int bs; |
92 |
} |
} |
93 |
|
|
94 |
// read second ogg |
// read second ogg |
|
ogg_int64_t firstPos = ov_pcm_tell(mixer->tracks[mixer->actTrack]); |
|
95 |
ov_pcm_seek(mixer->tracks[mixer->nextTrack], firstPos); |
ov_pcm_seek(mixer->tracks[mixer->nextTrack], firstPos); |
96 |
rest = len; |
rest = len; |
97 |
p = reinterpret_cast<char *>(track1); |
p = reinterpret_cast<char *>(track1); |
116 |
// mix |
// mix |
117 |
for (unsigned i=0; i<nsamples; i++) |
for (unsigned i=0; i<nsamples; i++) |
118 |
{ |
{ |
119 |
Sint16 t0 = track0[i]; |
int t0 = track0[i]; |
120 |
Sint16 t1 = track1[i]; |
int t1 = track1[i]; |
121 |
int intI = interpolationTable[i]; |
int intI = interpolationTable[i]; |
122 |
int val = (intI*t0+((65535-intI)*t1))>>16; |
int val = (intI*t1+((INTERPOLATION_RANGE-intI)*t0))>>INTERPOLATION_BITS; |
123 |
mix[i] = (val * vol)>>8; |
mix[i] = (val * vol)>>8; |
124 |
} |
} |
125 |
|
|
154 |
// volume & fading |
// volume & fading |
155 |
if (mixer->mode == SoundMixer::MODE_NORMAL) |
if (mixer->mode == SoundMixer::MODE_NORMAL) |
156 |
{ |
{ |
157 |
for (unsigned i=0; i<nsamples; i++) |
if (vol != 255) |
158 |
{ |
for (unsigned i=0; i<nsamples; i++) |
159 |
int t = mix[i]; |
{ |
160 |
mix[i] = (t * vol) >> 8; |
int t = mix[i]; |
161 |
} |
mix[i] = (t * vol) >> 8; |
162 |
|
} |
163 |
} |
} |
164 |
else if (mixer->mode == SoundMixer::MODE_START) |
else if (mixer->mode == SoundMixer::MODE_START) |
165 |
{ |
{ |
166 |
for (unsigned i=0; i<nsamples; i++) |
for (unsigned i=0; i<nsamples; i++) |
167 |
{ |
{ |
168 |
int t = mix[i]; |
int t = mix[i]; |
169 |
t = (interpolationTable[i]*t) >> 16; |
t = (interpolationTable[i]*t) >> INTERPOLATION_BITS; |
170 |
mix[i] = (t * vol) >> 8; |
mix[i] = (t * vol) >> 8; |
171 |
} |
} |
172 |
mixer->mode = SoundMixer::MODE_NORMAL; |
mixer->mode = SoundMixer::MODE_NORMAL; |
177 |
{ |
{ |
178 |
int t = mix[i]; |
int t = mix[i]; |
179 |
int intI = interpolationTable[i]; |
int intI = interpolationTable[i]; |
180 |
t = ((65535-intI)*t) >> 16; |
t = ((INTERPOLATION_RANGE-intI)*t) >> INTERPOLATION_BITS; |
181 |
mix[i] = (t * vol) >> 8; |
mix[i] = (t * vol) >> 8; |
182 |
} |
} |
183 |
mixer->mode = SoundMixer::MODE_STOPPED; |
mixer->mode = SoundMixer::MODE_STOPPED; |
265 |
return -2; |
return -2; |
266 |
} |
} |
267 |
|
|
268 |
|
SDL_LockAudio(); |
269 |
tracks.push_back(oggFile); |
tracks.push_back(oggFile); |
270 |
|
SDL_UnlockAudio(); |
271 |
|
|
272 |
return (int)tracks.size()-1; |
return (int)tracks.size()-1; |
273 |
} |
} |
274 |
|
|
276 |
{ |
{ |
277 |
if ((soundEnabled) && (volume) && (i<tracks.size())) |
if ((soundEnabled) && (volume) && (i<tracks.size())) |
278 |
{ |
{ |
279 |
|
SDL_LockAudio(); |
280 |
|
|
281 |
// Select next tracks |
// Select next tracks |
282 |
if (actTrack >= 0) |
if (actTrack >= 0) |
283 |
nextTrack = i; |
nextTrack = i; |
294 |
{ |
{ |
295 |
mode = MODE_EARLY_CHANGE; |
mode = MODE_EARLY_CHANGE; |
296 |
} |
} |
297 |
|
|
298 |
|
SDL_UnlockAudio(); |
299 |
} |
} |
300 |
} |
} |
301 |
|
|