[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