[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11677] branches/soc-2007-hcube/intern/ tinySND/blender: Added global frame counter handling, and added sound wave drawing feature's skeleton.
Csaba Hruska
csaba.hruska at gmail.com
Sun Aug 19 12:31:28 CEST 2007
Revision: 11677
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11677
Author: hcube
Date: 2007-08-19 12:31:28 +0200 (Sun, 19 Aug 2007)
Log Message:
-----------
Added global frame counter handling, and added sound wave drawing feature's skeleton.
Modified Paths:
--------------
branches/soc-2007-hcube/intern/tinySND/blender/SND_C-api.cpp
branches/soc-2007-hcube/intern/tinySND/blender/SND_C-api.h
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-19 10:29:50 UTC (rev 11676)
+++ branches/soc-2007-hcube/intern/tinySND/blender/SND_C-api.cpp 2007-08-19 10:31:28 UTC (rev 11677)
@@ -7,13 +7,13 @@
#include "SND_FXMixer.h"
#include "SND_FXSRC.h"
#include "SND_FXDuplicator.h"
-#include "SND_WavProvider.h"
-#include "SND_AiffProvider.h"
+#include "SND_WavReader.h"
+#include "SND_AiffReader.h"
#include "SDLDevice.h"
#include "portaudioDevice.h"
-#include "sndfileProvider.h"
-#include "ffmpegProvider.h"
+#include "sndfileReader.h"
+#include "ffmpegReader.h"
#ifdef WIN32
#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
@@ -27,16 +27,27 @@
SND_DataCache *mDataCache;
SND_FXDuplicator *mDuplicator;
+ char *mVisualWaveBuffer;
+
std::vector<SND_FXSample*> mSamples;
std::vector<SND_FXSRC*> mSRCs;
std::vector<SND_FXMixer*> mTargets;
};
-static std::vector<SND_Sound*> gSounds;
-static SND_Device *gDevice = 0;
-static SND_FXMixer *gFXMixerLeft = 0;
-static SND_FXMixer *gFXMixerRight = 0;
+static int gGlobalFrameCounter = 0;
+static std::vector<SND_Sound*> gSounds;
+static SND_Device *gDevice = 0;
+static SND_DataMultiplexer *gDataMultiplexer = 0;
+static SND_FXMixer *gFXMixerLeft = 0;
+static SND_FXMixer *gFXMixerRight = 0;
+// callback for global frame counter
+static void gGlobalFrameCounter_cb( int framesNum, void *userData1, void *userData2 )
+{
+ gGlobalFrameCounter += framesNum;
+}
+
+
int SND_IsInitialized(void)
{
return gDevice != 0;
@@ -46,16 +57,26 @@
{
assert( gDevice == 0 );
+ gGlobalFrameCounter = 0;
+
gDevice = new SDLDevice();
// gDevice = new portaudioDevice();
gDevice->initialize();
+ gDataMultiplexer = new SND_DataMultiplexer();
+ gDataMultiplexer->setNumChannels( gDevice->getNumChannels() );
+ gDataMultiplexer->setSampleFormat( gDevice->getSampleFormat() );
+
gSounds.clear();
gFXMixerLeft = new SND_FXMixer();
gFXMixerRight = new SND_FXMixer();
- gDevice->assignSoundToChannel( 0, gFXMixerLeft );
- gDevice->assignSoundToChannel( 1, gFXMixerRight );
+ gDataMultiplexer->assignSoundToChannel( gFXMixerLeft, 0 );
+ gDataMultiplexer->assignSoundToChannel( gFXMixerRight, 1 );
+
+ gDevice->setInput( gDataMultiplexer );
+ // add callback for global frame counter
+ gDevice->setCallback( gGlobalFrameCounter_cb );
}
void SND_Finalize(void)
@@ -66,6 +87,7 @@
delete gFXMixerLeft;
delete gFXMixerRight;
+ delete gDataMultiplexer;
delete gDevice;
gDevice = 0;
@@ -78,6 +100,16 @@
return (int)gDevice->getSampleRate();
}
+int SND_GetGlobalFrameCounter(void)
+{
+ return gGlobalFrameCounter;
+}
+
+void SND_ClearGlobalFrameCounter(void)
+{
+ gGlobalFrameCounter = 0;
+}
+
// sound handling
// hides various DataProvider backends
@@ -94,27 +126,27 @@
///////////////////////////////////////////////////////////////////
// try Wav
- dataProvider = new SND_WavProvider( filename );
+ dataProvider = new SND_WavReader( filename );
if( !dataProvider->isFormatSupported() )
{
delete dataProvider;
// try Aiff
- dataProvider = new SND_AiffProvider( filename );
+ dataProvider = new SND_AiffReader( filename );
}
if( !dataProvider->isFormatSupported() )
{
delete dataProvider;
// try ffmpeg
- dataProvider = new ffmpegProvider( filename );
+ dataProvider = new ffmpegReader( filename );
}
if( !dataProvider->isFormatSupported() )
{
delete dataProvider;
// try sndfile
- dataProvider = new sndfileProvider( filename );
+ dataProvider = new sndfileReader( filename );
}
// no lib can open this file
@@ -136,11 +168,14 @@
sound->mDataProvider = dataProvider;
sound->mDataCache = new SND_DataCache( dataProvider );
sound->mDuplicator = 0;
+ sound->mVisualWaveBuffer = 0;
+
for( int i = 0 ; i < channelNum ; ++i )
{
fxsample = new SND_FXSample( sound->mDataCache, i );
fxsrc = new SND_FXSRC();
+ fxsrc->setConverterType( SRC_LINEAR );
fxsrc->setInput( fxsample );
fxsrc->setSampleRate( gDevice->getSampleRate() );
@@ -211,6 +246,11 @@
delete sound->mDuplicator;
}
+ if( sound->mVisualWaveBuffer != 0 )
+ {
+ delete sound->mVisualWaveBuffer;
+ }
+
delete sound->mDataCache;
delete sound->mDataProvider;
delete sound;
@@ -312,6 +352,27 @@
sndInfo->frameRate = sound->mDataProvider->getSampleRate();
}
+char* SND_GetVisualPCMData( SND_SoundIHandle soundHandle, int channelIdx )
+{
+ assert( soundHandle != 0 );
+
+ SND_Sound *sound = (SND_Sound*)soundHandle;
+
+ // providing pcm data for wave drawing
+ // generate visual data if not available
+ if( sound->mVisualWaveBuffer == 0 )
+ {
+ // 4 KHz = 4000 sample/sec
+ int size = (int)(4000.0 * sound->mDataProvider->getDuration());
+ sound->mVisualWaveBuffer = new char[ size ];
+ }
+
+ // !!!! UNIMPLEMENTED YET !!!!
+ // fill the buffer
+
+ return sound->mVisualWaveBuffer;
+}
+
void SND_StopAllSounds(void)
{
assert( gDevice != 0 );
Modified: branches/soc-2007-hcube/intern/tinySND/blender/SND_C-api.h
===================================================================
--- branches/soc-2007-hcube/intern/tinySND/blender/SND_C-api.h 2007-08-19 10:29:50 UTC (rev 11676)
+++ branches/soc-2007-hcube/intern/tinySND/blender/SND_C-api.h 2007-08-19 10:31:28 UTC (rev 11677)
@@ -14,34 +14,40 @@
typedef struct
{
- int channelsNum;
- int framesNum;
- int bitRate;
- float frameRate;
+ int channelsNum;
+ int framesNum;
+ int bitRate;
+ float frameRate;
} SND_SoundInfo;
// general
-extern int SND_IsInitialized(void);
-extern void SND_Initialize(void);
-extern void SND_Finalize(void);
-extern int SND_GetMixRate(void);
+extern int SND_IsInitialized(void);
+extern void SND_Initialize(void);
+extern void SND_Finalize(void);
+extern int SND_GetMixRate(void);
+
+extern int SND_GetGlobalFrameCounter(void);
+extern void SND_ClearGlobalFrameCounter(void);
+
// sound handling
extern SND_SoundIHandle SND_NewSound( char *filename ); // hides various DataProvider backends
-extern void SND_DeleteSound( SND_SoundIHandle soundHandle );
+extern void SND_DeleteSound( SND_SoundIHandle soundHandle );
-extern int SND_IsPlayingSound( SND_SoundIHandle soundHandle );
-extern void SND_PlaySound( SND_SoundIHandle soundHandle );
-extern void SND_StopSound( SND_SoundIHandle soundHandle );
+extern int SND_IsPlayingSound( SND_SoundIHandle soundHandle );
+extern void SND_PlaySound( SND_SoundIHandle soundHandle );
+extern void SND_StopSound( SND_SoundIHandle soundHandle );
-extern void SND_SeekSound( SND_SoundIHandle soundHandle, int frameNum );
-extern int SND_GetSoundFramePos( SND_SoundIHandle soundHandle );
+extern void SND_SeekSound( SND_SoundIHandle soundHandle, int frameNum );
+extern int SND_GetSoundFramePos( SND_SoundIHandle soundHandle );
-extern void SND_GetSoundInfo( SND_SoundIHandle soundHandle, SND_SoundInfo *sndInfo );
+extern void SND_GetSoundInfo( SND_SoundIHandle soundHandle, SND_SoundInfo *sndInfo );
-extern void SND_StopAllSounds(void);
+extern char* SND_GetVisualPCMData( SND_SoundIHandle soundHandle, int channelIdx );
+extern void SND_StopAllSounds(void);
+
#ifdef __cplusplus
}
#endif
More information about the Bf-blender-cvs
mailing list