diff --git a/include/FileLoop.h b/include/FileLoop.h index c9950e2..6cfe0c7 100644 --- a/include/FileLoop.h +++ b/include/FileLoop.h @@ -95,7 +95,7 @@ class FileLoop : protected FileWvIn corresponds to file cycles per second. The frequency can be negative, in which case the loop is read in reverse order. */ - void setFrequency( StkFloat frequency ) { this->setRate( file_.fileSize() * frequency / Stk::sampleRate() ); }; + void setFrequency( StkFloat frequency ) { this->setRate( fileSize_ * frequency / Stk::sampleRate() ); }; //! Increment the read pointer by \e time samples, modulo file size. void addTime( StkFloat time ); diff --git a/include/FileWvIn.h b/include/FileWvIn.h index edb112c..378663f 100644 --- a/include/FileWvIn.h +++ b/include/FileWvIn.h @@ -89,7 +89,7 @@ public: virtual void normalize( StkFloat peak ); //! Return the file size in sample frames. - virtual unsigned long getSize( void ) const { return file_.fileSize(); }; + virtual unsigned long getSize( void ) const { return fileSize_; }; //! Return the input file sample rate in Hz (not the data read rate). /*! @@ -171,6 +171,7 @@ protected: bool chunking_; StkFloat time_; StkFloat rate_; + unsigned long fileSize_; unsigned long chunkThreshold_; unsigned long chunkSize_; long chunkPointer_; diff --git a/src/FileLoop.cpp b/src/FileLoop.cpp index cc34b6b..ba84985 100644 --- a/src/FileLoop.cpp +++ b/src/FileLoop.cpp @@ -77,6 +77,10 @@ void FileLoop :: openFile( std::string fileName, bool raw, bool doNormalize ) // Resize our lastOutputs container. lastFrame_.resize( 1, file_.channels() ); + // Close the file unless chunking + fileSize_ = file_.fileSize(); + if ( !chunking_ ) file_.close(); + // Set default rate based on file sampling rate. this->setRate( data_.dataRate() / Stk::sampleRate() ); @@ -98,29 +102,27 @@ void FileLoop :: addTime( StkFloat time ) // Add an absolute time in samples. time_ += time; - StkFloat fileSize = file_.fileSize(); while ( time_ < 0.0 ) - time_ += fileSize; - while ( time_ >= fileSize ) - time_ -= fileSize; + time_ += fileSize_; + while ( time_ >= fileSize_ ) + time_ -= fileSize_; } void FileLoop :: addPhase( StkFloat angle ) { // Add a time in cycles (one cycle = fileSize). - StkFloat fileSize = file_.fileSize(); - time_ += fileSize * angle; + time_ += fileSize_ * angle; while ( time_ < 0.0 ) - time_ += fileSize; - while ( time_ >= fileSize ) - time_ -= fileSize; + time_ += fileSize_; + while ( time_ >= fileSize_ ) + time_ -= fileSize_; } void FileLoop :: addPhaseOffset( StkFloat angle ) { // Add a phase offset in cycles, where 1.0 = fileSize. - phaseOffset_ = file_.fileSize() * angle; + phaseOffset_ = fileSize_ * angle; } StkFloat FileLoop :: tick( unsigned int channel ) @@ -134,20 +136,18 @@ StkFloat FileLoop :: tick( unsigned int channel ) // Check limits of time address ... if necessary, recalculate modulo // fileSize. - StkFloat fileSize = file_.fileSize(); - while ( time_ < 0.0 ) - time_ += fileSize; - while ( time_ >= fileSize ) - time_ -= fileSize; + time_ += fileSize_; + while ( time_ >= fileSize_ ) + time_ -= fileSize_; StkFloat tyme = time_; if ( phaseOffset_ ) { tyme += phaseOffset_; while ( tyme < 0.0 ) - tyme += fileSize; - while ( tyme >= fileSize ) - tyme -= fileSize; + tyme += fileSize_; + while ( tyme >= fileSize_ ) + tyme -= fileSize_; } if ( chunking_ ) { @@ -162,8 +162,8 @@ StkFloat FileLoop :: tick( unsigned int channel ) } while ( time_ > (StkFloat) ( chunkPointer_ + chunkSize_ - 1 ) ) { // positive rate chunkPointer_ += chunkSize_ - 1; // overlap chunks by one frame - if ( chunkPointer_ + chunkSize_ > file_.fileSize() ) { // at end of file - chunkPointer_ = file_.fileSize() - chunkSize_ + 1; // leave extra frame at end of buffer + if ( chunkPointer_ + chunkSize_ > fileSize_ ) { // at end of file + chunkPointer_ = fileSize_ - chunkSize_ + 1; // leave extra frame at end of buffer // Now fill extra frame with first frame data. for ( unsigned int j=0; jsetRate( data_.dataRate() / Stk::sampleRate() ); @@ -146,7 +150,7 @@ void FileWvIn :: setRate( StkFloat rate ) // If negative rate and at beginning of sound, move pointer to end // of sound. - if ( (rate_ < 0) && (time_ == 0.0) ) time_ = file_.fileSize() - 1.0; + if ( (rate_ < 0) && (time_ == 0.0) ) time_ = fileSize_ - 1.0; if ( fmod( rate_, 1.0 ) != 0.0 ) interpolate_ = true; else interpolate_ = false; @@ -158,8 +162,8 @@ void FileWvIn :: addTime( StkFloat time ) time_ += time; if ( time_ < 0.0 ) time_ = 0.0; - if ( time_ > file_.fileSize() - 1.0 ) { - time_ = file_.fileSize() - 1.0; + if ( time_ > fileSize_ - 1.0 ) { + time_ = fileSize_ - 1.0; for ( unsigned int i=0; i (StkFloat) ( file_.fileSize() - 1.0 ) ) { + if ( time_ < 0.0 || time_ > (StkFloat) ( fileSize_ - 1.0 ) ) { for ( unsigned int i=0; i (StkFloat) ( chunkPointer_ + chunkSize_ - 1 ) ) { // positive rate chunkPointer_ += chunkSize_ - 1; // overlap chunks by one frame - if ( chunkPointer_ + chunkSize_ > file_.fileSize() ) // at end of file - chunkPointer_ = file_.fileSize() - chunkSize_; + if ( chunkPointer_ + chunkSize_ > fileSize_ ) // at end of file + chunkPointer_ = fileSize_ - chunkSize_; } // Load more data.