[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11719] branches/soc-2007-hcube/source/ blender/src/seqaudio.c: seqaudio_update is now static internal function, called via audiosystem's callback.
Csaba Hruska
csaba.hruska at gmail.com
Mon Aug 20 01:04:39 CEST 2007
Revision: 11719
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11719
Author: hcube
Date: 2007-08-20 01:04:34 +0200 (Mon, 20 Aug 2007)
Log Message:
-----------
seqaudio_update is now static internal function, called via audiosystem's callback. added sound attribute handling, gain, pan, mute. ready for sound ipo implementation.
Modified Paths:
--------------
branches/soc-2007-hcube/source/blender/src/seqaudio.c
Modified: branches/soc-2007-hcube/source/blender/src/seqaudio.c
===================================================================
--- branches/soc-2007-hcube/source/blender/src/seqaudio.c 2007-08-19 23:02:22 UTC (rev 11718)
+++ branches/soc-2007-hcube/source/blender/src/seqaudio.c 2007-08-19 23:04:34 UTC (rev 11719)
@@ -40,87 +40,18 @@
SeqAudioState gSeqAudioState = SEQAUDIO_STOP;
int gSequenceStartFrame = 0;
int gScrubCounter = 0;
+int gAudioFrameCounter = 0;
////////////////////////////////////
// sequencing code NEW
////////////////////////////////////
-// this will be called before mixing has been done by tinySND
-static void do_seqaudio_update_cb( int framesNum, void *userData1, void *userData2 )
+static void do_seqaudio_update( Sequence *seq )
{
- /*
- Sequence *seq = (Sequence*)userData1;
- float facf;
-
- if( seq->ipo && seq->ipo->curve.first )
- {
- do_seq_ipo(seq);
- facf = seq->facf0;
- }
- else
- {
- facf = 1.0;
- }
- */
+ int sndMute;
+ float sndPan;
+ float sndGain;
- // do scrubbing
- gScrubCounter--;
- if( gScrubCounter <= 0 )
- {
- gScrubCounter = 0;
-
- if( gSeqAudioState == SEQAUDIO_SCRUB )
- {
- seqaudio_stop();
- }
- }
-}
-
-void seqaudio_initialize(void)
-{
- gSeqAudioState = SEQAUDIO_STOP;
- gSequenceStartFrame = 0;
- audio_setcallback( do_seqaudio_update_cb, 0, 0 );
-}
-
-void seqaudio_finalize(void)
-{
-}
-
-void seqaudio_play(void)
-{
- if( !audio_isinitialized() )
- {
- return;
- }
-
- audio_clearglobalframecounter();
- gSequenceStartFrame = CFRA;
-
- gSeqAudioState = SEQAUDIO_PLAY;
- seqaudio_update();
-}
-
-void seqaudio_stop(void)
-{
- if( !audio_isinitialized() )
- {
- return;
- }
- gSeqAudioState = SEQAUDIO_STOP;
- seqaudio_update();
-}
-
-static void do_seqaudio_update( Sequence *seq )
-{
-/*
- if(seq->startofs && seq->startstill) seq->startstill= 0;
- if(seq->endofs && seq->endstill) seq->endstill= 0;
-
- seq->startdisp= seq->start + seq->startofs - seq->startstill;
- seq->enddisp= seq->start+seq->len - seq->endofs + seq->endstill;
-*/
-
while( seq )
{
if( seq->type == SEQ_META )
@@ -157,6 +88,27 @@
audio_sound_play( seq->sound );
audio_sound_setframeposition( seq->sound, (int)startPos );
}
+
+ // update sounds attributes: gain, pan, mute
+ // Sequence members
+ //float level, pan; // level in dB (0=full), pan -1..1
+
+ sndGain = seq->level;
+ sndPan = seq->pan;
+ sndMute = seq->flag & SEQ_MUTE;
+
+ if( seq->ipo && seq->ipo->curve.first )
+ {
+ do_seq_ipo( seq );
+
+ // modify sound attributes according sound ipo type
+
+ //facf = seq->facf0;
+ }
+
+ audio_sound_setgain( seq->sound, sndGain );
+ audio_sound_setpan( seq->sound, sndPan );
+ audio_sound_setmute( seq->sound, sndMute );
}
else
{
@@ -172,25 +124,87 @@
}
}
-void seqaudio_update(void)
+static void seqaudio_update(void)
{
Editing *ed;
- assert( gSeqAudioState == SEQAUDIO_STOP || gSeqAudioState == SEQAUDIO_PLAY || gSeqAudioState == SEQAUDIO_SCRUB );
ed = G.scene->ed;
- if( !audio_isinitialized() || !ed )
+ if( ed != NULL )
{
+ do_seqaudio_update( ed->seqbasep->first );
+ }
+}
+
+// this will be called before mixing has been done by tinySND
+static void do_seqaudio_update_cb( int framesNum, void *userData1, void *userData2 )
+{
+ seqaudio_update();
+
+ // do scrubbing
+ --gScrubCounter;
+ if( gScrubCounter <= 0 )
+ {
+ gScrubCounter = 0;
+
+ if( gSeqAudioState == SEQAUDIO_SCRUB )
+ {
+ seqaudio_stop();
+ }
+ }
+
+ gAudioFrameCounter += framesNum;
+}
+
+void seqaudio_initialize(void)
+{
+ gSeqAudioState = SEQAUDIO_STOP;
+ gSequenceStartFrame = 0;
+ gAudioFrameCounter = 0;
+
+ audio_setcallback( do_seqaudio_update_cb, 0, 0 );
+}
+
+void seqaudio_finalize(void)
+{
+ audio_setcallback( 0, 0, 0 );
+}
+
+void seqaudio_play(void)
+{
+ assert( gSeqAudioState == SEQAUDIO_STOP || gSeqAudioState == SEQAUDIO_PLAY || gSeqAudioState == SEQAUDIO_SCRUB );
+
+ if( !audio_isinitialized() )
+ {
return;
}
- do_seqaudio_update( ed->seqbasep->first );
+
+ gAudioFrameCounter = 0;
+ gSequenceStartFrame = CFRA;
+
+ gSeqAudioState = SEQAUDIO_PLAY;
+
+ seqaudio_update();
}
+void seqaudio_stop(void)
+{
+ assert( gSeqAudioState == SEQAUDIO_STOP || gSeqAudioState == SEQAUDIO_PLAY || gSeqAudioState == SEQAUDIO_SCRUB );
+
+ if( !audio_isinitialized() )
+ {
+ return;
+ }
+
+ gSeqAudioState = SEQAUDIO_STOP;
+ seqaudio_update();
+}
+
int seqaudio_getframeposition(void)
{
float pos;
//pos = (int)( ((float)(audio_pos-U.mixbufsize)/( G.scene->audio.mixrate*4 ))*(float)G.scene->r.frs_sec );
- pos = ((float)gSequenceStartFrame) + ((float)audio_getglobalframecounter()) / ((float)audio_getmixrate()) * ((float)G.scene->r.frs_sec);
+ pos = ((float)gSequenceStartFrame) + ((float)gAudioFrameCounter) / ((float)audio_getmixrate()) * ((float)G.scene->r.frs_sec);
if( pos < 1.0 )
{
@@ -208,7 +222,7 @@
{
return;
}
-
+
// setup scrub state
// calculate how many seconds should be played
@@ -220,7 +234,7 @@
gSeqAudioState = SEQAUDIO_SCRUB;
}
- audio_clearglobalframecounter();
+ gAudioFrameCounter = 0;
gSequenceStartFrame = CFRA;
seqaudio_update();
}
@@ -229,6 +243,8 @@
{
int oldCFRA;
+ assert( gSeqAudioState == SEQAUDIO_STOP );
+
// open file sound target
if( !audio_file_openforwrite( fileName, sampleRate ) )
{
@@ -244,6 +260,7 @@
while( CFRA < EFRA )
{
seqaudio_update();
+
CFRA = seqaudio_getframeposition();
audio_file_writeframes( 64 );
More information about the Bf-blender-cvs
mailing list