[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