[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20355] trunk/blender/source/blender/src/ seqaudio.c: == Sequencer ==
Peter Schlaile
peter at schlaile.de
Sat May 23 09:37:02 CEST 2009
Revision: 20355
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20355
Author: schlaile
Date: 2009-05-23 09:37:02 +0200 (Sat, 23 May 2009)
Log Message:
-----------
== Sequencer ==
This fixes:
[#18373] WAV with IPO CURVE: Clicking in playback
by adding linear interpolation between frames. (Old IPOs were only calculated
once per frame which will lead to clicking on steep curves)
Modified Paths:
--------------
trunk/blender/source/blender/src/seqaudio.c
Modified: trunk/blender/source/blender/src/seqaudio.c
===================================================================
--- trunk/blender/source/blender/src/seqaudio.c 2009-05-23 07:19:31 UTC (rev 20354)
+++ trunk/blender/source/blender/src/seqaudio.c 2009-05-23 07:37:02 UTC (rev 20355)
@@ -101,6 +101,9 @@
called while we have G.scene changed!)
*/
+#define AFRA2TIME(a) ((((double) audio_scene->r.frs_sec_base) * (a)) / audio_scene->r.frs_sec)
+#define ATIME2FRA(a) ((((double) audio_scene->r.frs_sec) * (a)) / audio_scene->r.frs_sec_base)
+
/////
//
/* local protos ------------------- */
@@ -235,23 +238,27 @@
}
-static void audio_levels(uint8_t *buf, int len, float db, float facf, float pan)
+static void audio_levels(uint8_t *buf, int len, float db,
+ float facf_start, float facf_end, float pan)
{
int i;
+ double m = (facf_end - facf_start) / len;
float facl, facr, fac;
signed short *sample;
if (pan>=0) { facr = 1.0; facl = 1.0-pan; }
else { facr = pan+1.0; facl = 1.0; }
- fac = pow(10.0, ((-(db+audio_scene->audio.main))/20.0)) / facf;
- facl /= fac;
- facr /= fac;
-
+ fac = pow(10.0, ((-(db+audio_scene->audio.main))/20.0));
+
for (i=0; i<len; i+=4) {
+ float facf = facf_start + ((double) i) * m;
+ float f_l = facl / (fac / facf);
+ float f_r = facr / (fac / facf);
+
sample = (signed short*)(buf+i);
- sample[0] = (short) ((float)sample[0] * facl);
- sample[1] = (short) ((float)sample[1] * facr);
+ sample[0] = (short) ((float)sample[0] * f_l);
+ sample[1] = (short) ((float)sample[1] * f_r);
}
}
@@ -299,13 +306,61 @@
}
#ifndef DISABLE_SDL
+
+static int fra2curpos(Sequence * seq, int cfra)
+{
+ return (int)( (AFRA2TIME(((double) cfra) -
+ ((double) seq->start) +
+ ((double)
+ seq->anim_startofs))
+ * ((float)audio_scene
+ ->audio.mixrate)
+ * 4 ));
+}
+
+static int curpos2fra(Sequence * seq, int curpos)
+{
+ return ((int) floor(
+ ATIME2FRA(
+ ((double) curpos) / 4
+ /audio_scene->audio.mixrate)))
+ - seq->anim_startofs + seq->start;
+}
+
+static void do_audio_seq_ipo(Sequence * seq, int len, float * facf_start,
+ float * facf_end)
+{
+ int cfra_start = curpos2fra(seq, seq->curpos);
+ int cfra_end = cfra_start + 1;
+ int ipo_curpos_start = fra2curpos(seq, curpos2fra(seq, seq->curpos));
+ int ipo_curpos_end = fra2curpos(seq, cfra_end);
+ double ipo_facf_start;
+ double ipo_facf_end;
+ double m;
+
+ do_seq_ipo(seq, cfra_start);
+ ipo_facf_start = seq->facf0;
+
+ do_seq_ipo(seq, cfra_end);
+ ipo_facf_end = seq->facf0;
+
+ m = (ipo_facf_end- ipo_facf_start)/(ipo_curpos_end - ipo_curpos_start);
+
+ *facf_start = ipo_facf_start + (seq->curpos - ipo_curpos_start) * m;
+ *facf_end = ipo_facf_start + (seq->curpos + len-ipo_curpos_start) * m;
+}
+
+#endif
+
+#ifndef DISABLE_SDL
static void audio_fill_ram_sound(Sequence *seq, void * mixdown,
uint8_t * sstream, int len,
int cfra)
{
uint8_t* cvtbuf;
bSound* sound;
- float facf;
+ float facf_start;
+ float facf_end;
sound = seq->sound;
audio_makestream(sound);
@@ -313,14 +368,15 @@
(seq->startdisp <= cfra) && ((seq->enddisp) > cfra))
{
if(seq->ipo && seq->ipo->curve.first) {
- do_seq_ipo(seq, cfra);
- facf = seq->facf0;
+ do_audio_seq_ipo(seq, len, &facf_start, &facf_end);
} else {
- facf = 1.0;
+ facf_start = 1.0;
+ facf_end = 1.0;
}
cvtbuf = malloc(len);
memcpy(cvtbuf, ((uint8_t*)sound->stream)+(seq->curpos & (~3)), len);
- audio_levels(cvtbuf, len, seq->level, facf, seq->pan);
+ audio_levels(cvtbuf, len, seq->level, facf_start, facf_end,
+ seq->pan);
if (!mixdown) {
SDL_MixAudio(sstream, cvtbuf, len, SDL_MIX_MAXVOLUME);
} else {
@@ -338,16 +394,17 @@
int len, int cfra)
{
uint8_t* cvtbuf;
- float facf;
+ float facf_start;
+ float facf_end;
if ((seq->curpos >= 0) &&
(seq->startdisp <= cfra) && ((seq->enddisp) > cfra))
{
if(seq->ipo && seq->ipo->curve.first) {
- do_seq_ipo(seq, cfra);
- facf = seq->facf0;
+ do_audio_seq_ipo(seq, len, &facf_start, &facf_end);
} else {
- facf = 1.0;
+ facf_start = 1.0;
+ facf_end = 1.0;
}
cvtbuf = malloc(len);
@@ -356,7 +413,8 @@
audio_scene->audio.mixrate,
2,
len / 4);
- audio_levels(cvtbuf, len, seq->level, facf, seq->pan);
+ audio_levels(cvtbuf, len, seq->level, facf_start, facf_end,
+ seq->pan);
if (!mixdown) {
SDL_MixAudio(sstream,
cvtbuf, len, SDL_MIX_MAXVOLUME);
More information about the Bf-blender-cvs
mailing list