232
static void audio_levels(uint8_t *buf, int len, float db, float facf, float pan)
247
static void audio_levels(uint8_t *buf, int len, float db,
248
float facf_start, float facf_end, float pan)
251
double m = (facf_end - facf_start) / len;
235
252
float facl, facr, fac;
236
253
signed short *sample;
238
255
if (pan>=0) { facr = 1.0; facl = 1.0-pan; }
239
256
else { facr = pan+1.0; facl = 1.0; }
241
fac = pow(10.0, ((-(db+G.scene->audio.main))/20.0)) / facf;
245
for (i=0; i<len; i+=4) {
258
fac = pow(10.0, ((-(db+audio_scene->audio.main))/20.0));
260
for (i = 0; i < len; i += SAMPLE_SIZE) {
261
float facf = facf_start + ((double) i) * m;
262
float f_l = facl / (fac / facf);
263
float f_r = facr / (fac / facf);
246
265
sample = (signed short*)(buf+i);
247
sample[0] = (short) ((float)sample[0] * facl);
248
sample[1] = (short) ((float)sample[1] * facr);
266
sample[0] = (short) ((float)sample[0] * f_l);
267
sample[1] = (short) ((float)sample[1] * f_r);
265
284
ratio = (float)G.scene->audio.mixrate / (float)sound->sample->rate;
266
sound->streamlen = (int) ( (float)sound->sample->len * ratio * 2.0/((float)sound->sample->channels) );
285
sound->streamlen = (int) ( (float)sound->sample->len * ratio
287
/ ((float)sound->sample->channels) );
267
288
sound->stream = malloc((int) ((float)sound->streamlen * 1.05));
268
289
if (sound->sample->rate == G.scene->audio.mixrate) {
269
if (sound->sample->channels == 2) {
270
memcpy(sound->stream, sound->sample->data, sound->streamlen);
290
if (sound->sample->channels == AUDIO_CHANNELS) {
291
memcpy(sound->stream,
292
sound->sample->data, sound->streamlen);
294
} else if (sound->sample->channels == 1) {
273
295
for (source = (signed short*)(sound->sample->data),
274
296
dest = (signed short*)(sound->stream),
276
i<sound->streamlen/4;
277
dest += 2, source++, i++) dest[0] = dest[1] = source[0];
298
i<sound->streamlen/SAMPLE_SIZE;
299
dest += 2, source++, i++) {
301
for (j = 0; j < AUDIO_CHANNELS; j++) {
307
fprintf(stderr, "audio_makestream: "
308
"FIXME: can't handle number of channels %d\n",
309
sound->sample->channels);
281
313
if (sound->sample->channels == 1) {
282
for (dest=(signed short*)(sound->stream), i=0, source=(signed short*)(sound->sample->data);
283
i<(sound->streamlen/4); dest+=2, i++)
284
dest[0] = dest[1] = source[(int)((float)i/ratio)];
314
for (dest = (signed short*)(sound->stream), i=0,
315
source = (signed short*)(sound->sample->data);
316
i<(sound->streamlen/SAMPLE_SIZE);
317
dest += AUDIO_CHANNELS, i++) {
319
int s = source[(int)((float)i/ratio)];
320
for (j = 0; j < AUDIO_CHANNELS; j++) {
286
325
else if (sound->sample->channels == 2) {
287
for (dest=(signed short*)(sound->stream), i=0, source=(signed short*)(sound->sample->data);
288
i<(sound->streamlen/2); dest+=2, i+=2) {
326
for (dest=(signed short*)(sound->stream), i=0,
327
source = (signed short*)(sound->sample->data);
328
i<(sound->streamlen / 2); dest += AUDIO_CHANNELS, i+=2) {
289
329
dest[1] = source[(int)((float)i/ratio)];
290
dest[0] = source[(int)((float)i/ratio)+1];
330
dest[0] = source[(int)((float)i/ratio)+1];
295
335
#ifndef DISABLE_SDL
337
static int fra2curpos(Sequence * seq, int cfra)
339
return (int)( (AFRA2TIME(((double) cfra) -
340
((double) seq->start) +
343
* ((float)audio_scene
348
static int curpos2fra(Sequence * seq, int curpos)
352
((double) curpos) / SAMPLE_SIZE
353
/audio_scene->audio.mixrate)))
354
- seq->anim_startofs + seq->start;
357
static int get_curpos(Sequence * seq, int cfra)
360
(((int)((FRA2TIME(((double) cfra)
361
- ((double) audio_scene->r.cfra)
362
- ((double) seq->start)
363
+ ((double) seq->anim_startofs))
364
* ((float)audio_scene->audio.mixrate)
366
& (~(SAMPLE_SIZE - 1))); /* has to be sample aligned! */
369
static void do_audio_seq_ipo(Sequence * seq, int len, float * facf_start,
370
float * facf_end, int cfra)
372
int seq_curpos = get_curpos(seq, cfra);
373
int cfra_start = curpos2fra(seq, seq_curpos);
374
int cfra_end = cfra_start + 1;
375
int ipo_curpos_start = fra2curpos(seq, curpos2fra(seq, seq_curpos));
376
int ipo_curpos_end = fra2curpos(seq, cfra_end);
377
double ipo_facf_start;
381
do_seq_ipo(seq, cfra_start);
382
ipo_facf_start = seq->facf0;
384
do_seq_ipo(seq, cfra_end);
385
ipo_facf_end = seq->facf0;
387
m = (ipo_facf_end- ipo_facf_start)/(ipo_curpos_end - ipo_curpos_start);
389
*facf_start = ipo_facf_start + (seq_curpos - ipo_curpos_start) * m;
390
*facf_end = ipo_facf_start + (seq_curpos + len-ipo_curpos_start) * m;
296
396
static void audio_fill_ram_sound(Sequence *seq, void * mixdown,
297
uint8_t * sstream, int len)
397
uint8_t * sstream, int len,
404
int seq_curpos = get_curpos(seq, cfra);
406
/* catch corner case at the beginning of strip */
407
if (seq_curpos < 0 && (seq_curpos + len > 0)) {
410
sstream += seq_curpos;
303
414
sound = seq->sound;
304
415
audio_makestream(sound);
305
if ((seq->curpos<sound->streamlen -len) && (seq->curpos>=0) &&
306
(seq->startdisp <= CFRA) && ((seq->enddisp) > CFRA))
416
if ((seq_curpos < sound->streamlen -len) && (seq_curpos >= 0) &&
417
(seq->startdisp <= cfra) && ((seq->enddisp) > cfra))
308
419
if(seq->ipo && seq->ipo->curve.first) {
309
do_seq_ipo(seq, CFRA);
420
do_audio_seq_ipo(seq, len, &facf_start, &facf_end,
314
426
cvtbuf = malloc(len);
315
memcpy(cvtbuf, ((uint8_t*)sound->stream)+(seq->curpos & (~3)), len);
316
audio_levels(cvtbuf, len, seq->level, facf, seq->pan);
427
memcpy(cvtbuf, ((uint8_t*)sound->stream)+(seq_curpos), len);
428
audio_levels(cvtbuf, len, seq->level, facf_start, facf_end,
318
431
SDL_MixAudio(sstream, cvtbuf, len, SDL_MIX_MAXVOLUME);
328
440
#ifndef DISABLE_SDL
329
441
static void audio_fill_hd_sound(Sequence *seq,
330
442
void * mixdown, uint8_t * sstream,
336
if ((seq->curpos >= 0) &&
337
(seq->startdisp <= CFRA) && ((seq->enddisp) > CFRA))
448
int seq_curpos = get_curpos(seq, cfra);
450
/* catch corner case at the beginning of strip */
451
if (seq_curpos < 0 && (seq_curpos + len > 0)) {
454
sstream += seq_curpos;
458
if ((seq_curpos >= 0) &&
459
(seq->startdisp <= cfra) && ((seq->enddisp) > cfra))
339
461
if(seq->ipo && seq->ipo->curve.first) {
340
do_seq_ipo(seq, CFRA);
462
do_audio_seq_ipo(seq, len, &facf_start, &facf_end,
345
468
cvtbuf = malloc(len);
347
470
sound_hdaudio_extract(seq->hdaudio, (short*) cvtbuf,
349
G.scene->audio.mixrate,
352
audio_levels(cvtbuf, len, seq->level, facf, seq->pan);
471
seq_curpos / SAMPLE_SIZE,
472
audio_scene->audio.mixrate,
475
audio_levels(cvtbuf, len, seq->level, facf_start, facf_end,
354
478
SDL_MixAudio(sstream,
355
479
cvtbuf, len, SDL_MIX_MAXVOLUME);
367
static void audio_fill_seq(Sequence * seq, void * mixdown,
368
uint8_t *sstream, int len, int advance_only)
490
static void audio_fill_seq(Sequence * seq, void * mixdown,
491
uint8_t *sstream, int len, int cfra);
493
static void audio_fill_scene_strip(Sequence * seq, void * mixdown,
494
uint8_t *sstream, int len, int cfra)
498
/* prevent eternal loop */
499
seq->scene->r.scemode |= R_RECURS_PROTECTION;
504
int sce_cfra = seq->sfra + seq->anim_startofs
505
+ cfra - seq->startdisp;
507
audio_fill_seq(ed->seqbasep->first,
509
sstream, len, sce_cfra);
513
seq->scene->r.scemode &= ~R_RECURS_PROTECTION;
518
static void audio_fill_seq(Sequence * seq, void * mixdown,
519
uint8_t *sstream, int len, int cfra)
371
522
if (seq->type == SEQ_META &&
372
523
(!(seq->flag & SEQ_MUTE))) {
373
if (seq->startdisp <= CFRA && seq->enddisp > CFRA) {
374
audio_fill_seq(seq->seqbase.first,
375
mixdown, sstream, len,
378
audio_fill_seq(seq->seqbase.first,
379
mixdown, sstream, len,
524
if (seq->startdisp <= cfra && seq->enddisp > cfra) {
525
audio_fill_seq(seq->seqbase.first,
526
mixdown, sstream, len,
530
if (seq->type == SEQ_SCENE
531
&& (!(seq->flag & SEQ_MUTE))
533
&& (seq->scene->r.scemode & R_DOSEQ)
534
&& !(seq->scene->r.scemode & R_RECURS_PROTECTION)) {
535
if (seq->startdisp <= cfra && seq->enddisp > cfra) {
536
audio_fill_scene_strip(
537
seq, mixdown, sstream, len,
383
541
if ( (seq->type == SEQ_RAM_SOUND) &&
385
543
(!(seq->flag & SEQ_MUTE))) {
389
audio_fill_ram_sound(
390
seq, mixdown, sstream, len);
544
audio_fill_ram_sound(seq, mixdown, sstream, len, cfra);
393
546
if ( (seq->type == SEQ_HD_SOUND) &&
394
547
(!(seq->flag & SEQ_MUTE))) {
399
char name[FILE_MAXDIR+FILE_MAXFILE];
401
strncpy(name, seq->strip->dir,
404
seq->strip->stripdata->name,
406
BLI_convertstringcode(name, G.sce);
408
seq->hdaudio= sound_open_hdaudio(name);
411
audio_fill_hd_sound(seq, mixdown,
549
char name[FILE_MAXDIR+FILE_MAXFILE];
551
BLI_join_dirfile(name, seq->strip->dir, seq->strip->stripdata->name);
552
BLI_convertstringcode(name, G.sce);
554
seq->hdaudio= sound_open_hdaudio(name);
557
audio_fill_hd_sound(seq, mixdown, sstream, len,