[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11733] branches/soc-2007-hcube/intern/ tinySND/blender/SND_C-api.cpp: Added sound gain, pan, mute functions implemntation.

Csaba Hruska csaba.hruska at gmail.com
Mon Aug 20 12:50:45 CEST 2007


Revision: 11733
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11733
Author:   hcube
Date:     2007-08-20 12:50:45 +0200 (Mon, 20 Aug 2007)

Log Message:
-----------
Added sound gain, pan, mute functions implemntation.

Modified Paths:
--------------
    branches/soc-2007-hcube/intern/tinySND/blender/SND_C-api.cpp

Modified: branches/soc-2007-hcube/intern/tinySND/blender/SND_C-api.cpp
===================================================================
--- branches/soc-2007-hcube/intern/tinySND/blender/SND_C-api.cpp	2007-08-20 10:08:59 UTC (rev 11732)
+++ branches/soc-2007-hcube/intern/tinySND/blender/SND_C-api.cpp	2007-08-20 10:50:45 UTC (rev 11733)
@@ -1,5 +1,6 @@
 #include <vector>
 #include <assert.h>
+#include <math.h>
 
 #include "SND_C-api.h"
 #include "SND_Device.h"
@@ -24,15 +25,22 @@
 {
 public:
 
-	SND_DataProvider	*mDataProvider;
-	SND_DataCache		*mDataCache;
-	SND_FXDuplicator	*mDuplicator;
+	SND_DataProvider			*mDataProvider;
+	SND_DataCache				*mDataCache;
+	SND_FXDuplicator			*mDuplicator;
 	
-	char				*mVisualWaveBuffer;
+	SND_FXMixer					*mMixerLeft;
+	SND_FXMixer					*mMixerRight;
+
+	char						*mVisualWaveBuffer;
 	
 	std::vector<SND_FXSample*>	mSamples;
 	std::vector<SND_FXSRC*>		mSRCs;
-	std::vector<SND_FXMixer*>	mTargets;
+	
+	// sound attributes
+	float						mGain;	// in dB
+	float						mPan;	// -1.0 ... 1.0
+	bool						mIsMuted;
 };
 
 enum PlayTarget
@@ -102,6 +110,7 @@
 {
     assert( gDevice != 0 );
 
+	gDevice->setCallback( 0 );
     gDevice->finalize();
 	
 	delete gFXMixerLeft;
@@ -246,58 +255,63 @@
 	
 	// we'll try all DataProvider we have ill one can open the file, if any then return 0
 	// if load succed we attach the FXSample to a FXMixer and return with new FXSample handle
-	SND_DataProvider *dataProvider;
+	SND_DataProvider *dataReader;
 
 	///////////////////////////////////////////////////////////////////
 	// data provider fallback: Wav -> Aiff -> ffmpeg -> sndfile
 	///////////////////////////////////////////////////////////////////
 	
 	// try Wav
-	dataProvider = new SND_WavReader( filename );
-	if( !dataProvider->isFormatSupported() )
+	dataReader = new SND_WavReader( filename );
+	if( !dataReader->isFormatSupported() )
 	{
-		delete dataProvider;
+		delete dataReader;
 
 		// try Aiff
-		dataProvider = new SND_AiffReader( filename );
+		dataReader = new SND_AiffReader( filename );
 	}
-	if( !dataProvider->isFormatSupported() )
+	if( !dataReader->isFormatSupported() )
 	{
-		delete dataProvider;
+		delete dataReader;
 
 		// try ffmpeg
-		dataProvider = new ffmpegReader( filename );
+		dataReader = new ffmpegReader( filename );
 	}
-	if( !dataProvider->isFormatSupported() )
+	if( !dataReader->isFormatSupported() )
 	{
-		delete dataProvider;
+		delete dataReader;
 
 		// try sndfile
-		dataProvider = new sndfileReader( filename );
+		dataReader = new sndfileReader( filename );
 	}
 	
 	// no lib can open this file
-	if( !dataProvider->isFormatSupported() )
+	if( !dataReader->isFormatSupported() )
 	{
-		delete dataProvider;
+		delete dataReader;
 		return (SND_SoundIHandle)0;
 	}
 
-	///////////////////////////////////////////////////////////////////
-	// DataProvider -> FXSound -> FXSRC -> FXMixer -> devices'channel
-	///////////////////////////////////////////////////////////////////
+	//////////////////////////////////////////////////////////////////////////////////////////////////
+	// DataProvider -> FXSound -> FXSRC -> FXDuplicator(if necessary) -> FXMixer(local:left,right) ->
+	// -> FXMixer(global:left,right) -> DataMultiplexer -> DataConsumer(audio device or file)
+	//////////////////////////////////////////////////////////////////////////////////////////////////
 	SND_Sound *sound = new SND_Sound;
 	SND_FXSample *fxsample;
 	SND_FXSRC *fxsrc;
-	int channelNum = dataProvider->getNumChannels();
+	int channelNum = dataReader->getNumChannels();
 	
 	//setup SND_Sound
-	sound->mDataProvider = dataProvider;
-	sound->mDataCache = new SND_DataCache( dataProvider );
+	sound->mDataProvider = dataReader;
+	sound->mDataCache = new SND_DataCache( dataReader );
+	sound->mMixerLeft = new SND_FXMixer();
+	sound->mMixerRight = new SND_FXMixer();
 	sound->mDuplicator = 0;
 	sound->mVisualWaveBuffer = 0;
+	sound->mGain = 0.0;
+	sound->mPan = 0.0;
+	sound->mIsMuted = false;
 
-	
 	for( int i = 0 ; i < channelNum ; ++i )
 	{
 		fxsample = new SND_FXSample( sound->mDataCache, i );
@@ -319,29 +333,27 @@
 			sound->mDuplicator = fxduplicator;
 
 			// add to left channel
-			gFXMixerLeft->addSound( fxduplicator );
-			sound->mTargets.push_back( gFXMixerLeft );
+			sound->mMixerLeft->addSound( fxduplicator );
 
 			// add to right channel
-			gFXMixerRight->addSound( fxduplicator );
-			sound->mTargets.push_back( gFXMixerRight );
+			sound->mMixerRight->addSound( fxduplicator );
 		}
 		else
 		{
 			// multi channel
 			if( i & (long)1 == 0 )
 			{
-				gFXMixerLeft->addSound( fxsrc );
-				sound->mTargets.push_back( gFXMixerLeft );
+				sound->mMixerLeft->addSound( fxsrc );
 			}
 			else
 			{
-				gFXMixerRight->addSound( fxsrc );
-				sound->mTargets.push_back( gFXMixerRight );
+				sound->mMixerRight->addSound( fxsrc );
 			}
 		}
 	}
 	
+	gFXMixerLeft->addSound( sound->mMixerLeft );
+	gFXMixerRight->addSound( sound->mMixerRight );
 	gSounds.push_back( sound );
 	
 	return (SND_SoundIHandle)sound;
@@ -353,12 +365,16 @@
 	
 	SND_Sound *sound = (SND_Sound*)soundHandle;
 	
-	// remove from sound chain and delete SRCs
-	std::vector<SND_FXMixer*>::const_iterator iFXMixer;
-	iFXMixer = sound->mTargets.begin();
-	for( std::vector<SND_FXSRC*>::iterator i = sound->mSRCs.begin() ; i != sound->mSRCs.end() ; ++i, ++iFXMixer )
+	gFXMixerLeft->removeSound( sound->mMixerLeft );
+	gFXMixerRight->removeSound( sound->mMixerRight );
+	
+	// delete left and right mixers
+	delete sound->mMixerLeft;
+	delete sound->mMixerRight;
+
+	// delete mSRCs
+	for( std::vector<SND_FXSRC*>::iterator i = sound->mSRCs.begin() ; i != sound->mSRCs.end() ; ++i )
 	{
-		(*iFXMixer)->removeSound( (*i) );
 		delete (*i);
 	}
 
@@ -467,8 +483,8 @@
 	assert( soundHandle != 0 );
 
 	SND_Sound *sound = (SND_Sound*)soundHandle;
-	// !!!! UNIMPLEMENTED YET !!!! 
-	return 0.0;
+
+	return sound->mGain;
 }
 
 void SND_SoundSetGain( SND_SoundIHandle soundHandle, float gain )
@@ -476,7 +492,21 @@
 	assert( soundHandle != 0 );
 
 	SND_Sound *sound = (SND_Sound*)soundHandle;
-	// !!!! UNIMPLEMENTED YET !!!! 
+	
+	if( sound->mGain != gain )
+	{
+		// calculate value in linear scale
+		float linearGain = (float)pow( 10, gain / 10.0 );
+
+		std::vector<SND_FXSample*>::const_iterator i;
+
+		for( i = sound->mSamples.begin() ; i != sound->mSamples.end() ; ++i )
+		{
+			(*i)->setGain( linearGain );
+		}
+
+		sound->mGain = gain;
+	}
 }
 
 float SND_SoundGetPan( SND_SoundIHandle soundHandle )
@@ -484,8 +514,8 @@
 	assert( soundHandle != 0 );
 
 	SND_Sound *sound = (SND_Sound*)soundHandle;
-	// !!!! UNIMPLEMENTED YET !!!! 
-	return 0.0;
+
+	return sound->mPan;
 }
 
 void SND_SoundSetPan( SND_SoundIHandle soundHandle, float pan )
@@ -493,7 +523,39 @@
 	assert( soundHandle != 0 );
 
 	SND_Sound *sound = (SND_Sound*)soundHandle;
-	// !!!! UNIMPLEMENTED YET !!!! 
+
+	if( sound->mPan != pan )
+	{
+		float gainLeft;
+		float gainRight;
+		
+		if( pan < 0.0 )
+		{
+			gainLeft = 1.0;
+			gainRight = 1.0 + pan;
+		}
+		else
+		{
+			gainLeft = 1.0 - pan;
+			gainRight = 1.0;
+		}
+
+		if( sound->mDuplicator != 0 )
+		{
+			if( gainLeft == 0.0 && gainRight != 0.0 || gainLeft != 0.0 && gainRight == 0.0 )
+			{
+				sound->mDuplicator->setNumCopy( 1 );
+			}
+			else
+			{
+				sound->mDuplicator->setNumCopy( 2 );
+			}
+		}
+		
+		sound->mMixerLeft->setGain( gainLeft );
+		sound->mMixerRight->setGain( gainRight );
+		sound->mPan = pan;
+	}
 }
 
 int SND_SoundIsMuted( SND_SoundIHandle soundHandle )
@@ -501,9 +563,8 @@
 	assert( soundHandle != 0 );
 
 	SND_Sound *sound = (SND_Sound*)soundHandle;
-	// !!!! UNIMPLEMENTED YET !!!! 
 
-	return false;
+	return sound->mIsMuted;
 }
 
 void SND_SoundSetMute( SND_SoundIHandle soundHandle, int mute )
@@ -511,7 +572,18 @@
 	assert( soundHandle != 0 );
 
 	SND_Sound *sound = (SND_Sound*)soundHandle;
-	// !!!! UNIMPLEMENTED YET !!!! 
+
+	if( sound->mIsMuted != (bool)mute )
+	{
+		std::vector<SND_FXSample*>::const_iterator i;
+
+		for( i = sound->mSamples.begin() ; i != sound->mSamples.end() ; ++i )
+		{
+			(*i)->setMute( (bool)mute );
+		}
+
+		sound->mIsMuted = (bool)mute;
+	}
 }
 
 void SND_SoundGetInfo( SND_SoundIHandle soundHandle, SND_SoundInfo *sndInfo )





More information about the Bf-blender-cvs mailing list