[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