[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15815] branches/sound-branch/extern/ tinySND/core/SND_WavReader.cpp: halfway done wave reader
Robert Holcomb
bob_holcomb at hotmail.com
Sun Jul 27 19:59:31 CEST 2008
Revision: 15815
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15815
Author: scourage
Date: 2008-07-27 19:59:20 +0200 (Sun, 27 Jul 2008)
Log Message:
-----------
halfway done wave reader
Modified Paths:
--------------
branches/sound-branch/extern/tinySND/core/SND_WavReader.cpp
Modified: branches/sound-branch/extern/tinySND/core/SND_WavReader.cpp
===================================================================
--- branches/sound-branch/extern/tinySND/core/SND_WavReader.cpp 2008-07-27 17:50:52 UTC (rev 15814)
+++ branches/sound-branch/extern/tinySND/core/SND_WavReader.cpp 2008-07-27 17:59:20 UTC (rev 15815)
@@ -1,5 +1,4 @@
#include <stdint.h>
-#include <string.h>
#include <stdio.h>
#include "SND_WavReader.h"
@@ -39,6 +38,24 @@
sample 1 for channel 0
sample 1 for channel 1
*/
+
+typedef struct
+{
+ char typeStr[4];
+ int32_t fileLength;
+ char subTypeStr[4];
+ char formatStr[4];
+ int32_t lengthFmtData;
+ int16_t format;
+ int16_t numChannels;
+ int32_t sampleRate;
+ int32_t bytesPerSecond;
+ int16_t blockAlign;
+ int16_t bitsPerSample;
+ char dataBlockStr[4];
+ int32_t lengthData;
+} riffHeader;
+
SND_WavReader::SND_WavReader( char *filename )
{
mIsSupported = false;
@@ -159,21 +176,77 @@
fclose(f);
return;
}
+
+ mData = new char[dataLen];
+ if( fread(mData, 1, dataLen, f)!=dataLen)
+ {
+ fclose(f);
+ return;
+ }
+
mNumFrames = dataLen/mBitRate/8/mNumChannels;
mDuration = float(mNumFrames)/float(mSampleRate);
mIsSeekable = true;
-
- //mIsSupported = true;
+ mIsSupported = true;
+
+ fclose(f);
}
SND_WavReader::SND_WavReader( char *data, int size )
{
- // !!!! NOT IMPLEMENTED YET !!!!
+ char* buffer=data;
+ riffHeader* header;
+ if(size<44) {
+ printf("SND_WavReader-incorrect header size");
+ return;
+ }
+
+ //line up header on data
+ header=(riffHeader*)data;
+ buffer=data+sizeof(riffHeader);
+
+ if(strncmp(header->typeStr, "RIFF", 4) != 0 ) {
+ printf("SND_WavReader-Not a RIFF file");
+ return;
+ }
+
+ if( strncmp(header->subTypeStr, "WAVE", 4) != 0 ){
+ printf("SND_WavReader-Not a WAVE file");
+ return;
+ }
+
+ if( strncmp(header->formatStr, "fmt ", 4) != 0 ){
+ printf("SND_WavReader-No format tag");
+ return;
+ }
+
+ if(header->format!=1){
+ printf("SND_WaveReader-Only PCM Data supported");
+ return;
+ }
+
+ if( strncmp(header->dataBlockStr, "data", 4) != 0 ){
+ printf("SND_WaveReader-No data tag");
+ return;
+ }
+
+ memcpy(mData, buffer, header->dataLength);
+
+ //TODO get data
+
+ mNumChannels = header->numChannels;
+ mSampleRate=header->sampleRate;
+ mBitRate=header->bitsPerSample;
+ mNumFrames = header->dataLength/mBitRate/8/mNumChannels;
+ mDuration = float(mNumFrames)/float(mSampleRate);
+ mIsSeekable = true;
+ mIsSupported = true;
}
SND_WavReader::~SND_WavReader()
{
- // !!!! NOT IMPLEMENTED YET !!!!
+ if(mData!=NULL)
+ delete [] mData;
}
bool SND_WavReader::initialize(void)
@@ -183,11 +256,18 @@
void SND_WavReader::seek( int frameNum )
{
- // !!!! NOT IMPLEMENTED YET !!!!
+ assert( mData != 0 );
+ assert( mIsSeekable );
+
+
}
void SND_WavReader::fillBuffer( float *buffer, int framesNum )
{
- // !!!! NOT IMPLEMENTED YET !!!!
+ assert( mData != 0 );
+ assert( buffer != 0 );
+
+ //determine amount of data to write
+
}
More information about the Bf-blender-cvs
mailing list