mirror of
https://github.com/thestk/stk
synced 2026-02-07 09:46:16 +00:00
Fix for FileWvIn and FileLoop classes so that files are closed unless chunking.
This commit is contained in:
@@ -95,7 +95,7 @@ class FileLoop : protected FileWvIn
|
|||||||
corresponds to file cycles per second. The frequency can be
|
corresponds to file cycles per second. The frequency can be
|
||||||
negative, in which case the loop is read in reverse order.
|
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.
|
//! Increment the read pointer by \e time samples, modulo file size.
|
||||||
void addTime( StkFloat time );
|
void addTime( StkFloat time );
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ public:
|
|||||||
virtual void normalize( StkFloat peak );
|
virtual void normalize( StkFloat peak );
|
||||||
|
|
||||||
//! Return the file size in sample frames.
|
//! 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).
|
//! Return the input file sample rate in Hz (not the data read rate).
|
||||||
/*!
|
/*!
|
||||||
@@ -171,6 +171,7 @@ protected:
|
|||||||
bool chunking_;
|
bool chunking_;
|
||||||
StkFloat time_;
|
StkFloat time_;
|
||||||
StkFloat rate_;
|
StkFloat rate_;
|
||||||
|
unsigned long fileSize_;
|
||||||
unsigned long chunkThreshold_;
|
unsigned long chunkThreshold_;
|
||||||
unsigned long chunkSize_;
|
unsigned long chunkSize_;
|
||||||
long chunkPointer_;
|
long chunkPointer_;
|
||||||
|
|||||||
@@ -77,6 +77,10 @@ void FileLoop :: openFile( std::string fileName, bool raw, bool doNormalize )
|
|||||||
// Resize our lastOutputs container.
|
// Resize our lastOutputs container.
|
||||||
lastFrame_.resize( 1, file_.channels() );
|
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.
|
// Set default rate based on file sampling rate.
|
||||||
this->setRate( data_.dataRate() / Stk::sampleRate() );
|
this->setRate( data_.dataRate() / Stk::sampleRate() );
|
||||||
|
|
||||||
@@ -98,29 +102,27 @@ void FileLoop :: addTime( StkFloat time )
|
|||||||
// Add an absolute time in samples.
|
// Add an absolute time in samples.
|
||||||
time_ += time;
|
time_ += time;
|
||||||
|
|
||||||
StkFloat fileSize = file_.fileSize();
|
|
||||||
while ( time_ < 0.0 )
|
while ( time_ < 0.0 )
|
||||||
time_ += fileSize;
|
time_ += fileSize_;
|
||||||
while ( time_ >= fileSize )
|
while ( time_ >= fileSize_ )
|
||||||
time_ -= fileSize;
|
time_ -= fileSize_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileLoop :: addPhase( StkFloat angle )
|
void FileLoop :: addPhase( StkFloat angle )
|
||||||
{
|
{
|
||||||
// Add a time in cycles (one cycle = fileSize).
|
// Add a time in cycles (one cycle = fileSize).
|
||||||
StkFloat fileSize = file_.fileSize();
|
time_ += fileSize_ * angle;
|
||||||
time_ += fileSize * angle;
|
|
||||||
|
|
||||||
while ( time_ < 0.0 )
|
while ( time_ < 0.0 )
|
||||||
time_ += fileSize;
|
time_ += fileSize_;
|
||||||
while ( time_ >= fileSize )
|
while ( time_ >= fileSize_ )
|
||||||
time_ -= fileSize;
|
time_ -= fileSize_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileLoop :: addPhaseOffset( StkFloat angle )
|
void FileLoop :: addPhaseOffset( StkFloat angle )
|
||||||
{
|
{
|
||||||
// Add a phase offset in cycles, where 1.0 = fileSize.
|
// Add a phase offset in cycles, where 1.0 = fileSize.
|
||||||
phaseOffset_ = file_.fileSize() * angle;
|
phaseOffset_ = fileSize_ * angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
StkFloat FileLoop :: tick( unsigned int channel )
|
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
|
// Check limits of time address ... if necessary, recalculate modulo
|
||||||
// fileSize.
|
// fileSize.
|
||||||
StkFloat fileSize = file_.fileSize();
|
|
||||||
|
|
||||||
while ( time_ < 0.0 )
|
while ( time_ < 0.0 )
|
||||||
time_ += fileSize;
|
time_ += fileSize_;
|
||||||
while ( time_ >= fileSize )
|
while ( time_ >= fileSize_ )
|
||||||
time_ -= fileSize;
|
time_ -= fileSize_;
|
||||||
|
|
||||||
StkFloat tyme = time_;
|
StkFloat tyme = time_;
|
||||||
if ( phaseOffset_ ) {
|
if ( phaseOffset_ ) {
|
||||||
tyme += phaseOffset_;
|
tyme += phaseOffset_;
|
||||||
while ( tyme < 0.0 )
|
while ( tyme < 0.0 )
|
||||||
tyme += fileSize;
|
tyme += fileSize_;
|
||||||
while ( tyme >= fileSize )
|
while ( tyme >= fileSize_ )
|
||||||
tyme -= fileSize;
|
tyme -= fileSize_;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( chunking_ ) {
|
if ( chunking_ ) {
|
||||||
@@ -162,8 +162,8 @@ StkFloat FileLoop :: tick( unsigned int channel )
|
|||||||
}
|
}
|
||||||
while ( time_ > (StkFloat) ( chunkPointer_ + chunkSize_ - 1 ) ) { // positive rate
|
while ( time_ > (StkFloat) ( chunkPointer_ + chunkSize_ - 1 ) ) { // positive rate
|
||||||
chunkPointer_ += chunkSize_ - 1; // overlap chunks by one frame
|
chunkPointer_ += chunkSize_ - 1; // overlap chunks by one frame
|
||||||
if ( chunkPointer_ + chunkSize_ > file_.fileSize() ) { // at end of file
|
if ( chunkPointer_ + chunkSize_ > fileSize_ ) { // at end of file
|
||||||
chunkPointer_ = file_.fileSize() - chunkSize_ + 1; // leave extra frame at end of buffer
|
chunkPointer_ = fileSize_ - chunkSize_ + 1; // leave extra frame at end of buffer
|
||||||
// Now fill extra frame with first frame data.
|
// Now fill extra frame with first frame data.
|
||||||
for ( unsigned int j=0; j<firstFrame_.channels(); j++ )
|
for ( unsigned int j=0; j<firstFrame_.channels(); j++ )
|
||||||
data_( data_.frames() - 1, j ) = firstFrame_[j];
|
data_( data_.frames() - 1, j ) = firstFrame_[j];
|
||||||
|
|||||||
@@ -98,6 +98,10 @@ void FileWvIn :: openFile( std::string fileName, bool raw, bool doNormalize )
|
|||||||
// Resize our lastFrame container.
|
// Resize our lastFrame container.
|
||||||
lastFrame_.resize( 1, file_.channels() );
|
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.
|
// Set default rate based on file sampling rate.
|
||||||
this->setRate( data_.dataRate() / Stk::sampleRate() );
|
this->setRate( 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
|
// If negative rate and at beginning of sound, move pointer to end
|
||||||
// of sound.
|
// 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;
|
if ( fmod( rate_, 1.0 ) != 0.0 ) interpolate_ = true;
|
||||||
else interpolate_ = false;
|
else interpolate_ = false;
|
||||||
@@ -158,8 +162,8 @@ void FileWvIn :: addTime( StkFloat time )
|
|||||||
time_ += time;
|
time_ += time;
|
||||||
|
|
||||||
if ( time_ < 0.0 ) time_ = 0.0;
|
if ( time_ < 0.0 ) time_ = 0.0;
|
||||||
if ( time_ > file_.fileSize() - 1.0 ) {
|
if ( time_ > fileSize_ - 1.0 ) {
|
||||||
time_ = file_.fileSize() - 1.0;
|
time_ = fileSize_ - 1.0;
|
||||||
for ( unsigned int i=0; i<lastFrame_.size(); i++ ) lastFrame_[i] = 0.0;
|
for ( unsigned int i=0; i<lastFrame_.size(); i++ ) lastFrame_[i] = 0.0;
|
||||||
finished_ = true;
|
finished_ = true;
|
||||||
}
|
}
|
||||||
@@ -176,7 +180,7 @@ StkFloat FileWvIn :: tick( unsigned int channel )
|
|||||||
|
|
||||||
if ( finished_ ) return 0.0;
|
if ( finished_ ) return 0.0;
|
||||||
|
|
||||||
if ( time_ < 0.0 || time_ > (StkFloat) ( file_.fileSize() - 1.0 ) ) {
|
if ( time_ < 0.0 || time_ > (StkFloat) ( fileSize_ - 1.0 ) ) {
|
||||||
for ( unsigned int i=0; i<lastFrame_.size(); i++ ) lastFrame_[i] = 0.0;
|
for ( unsigned int i=0; i<lastFrame_.size(); i++ ) lastFrame_[i] = 0.0;
|
||||||
finished_ = true;
|
finished_ = true;
|
||||||
return 0.0;
|
return 0.0;
|
||||||
@@ -195,8 +199,8 @@ StkFloat FileWvIn :: tick( unsigned int channel )
|
|||||||
}
|
}
|
||||||
while ( time_ > (StkFloat) ( chunkPointer_ + chunkSize_ - 1 ) ) { // positive rate
|
while ( time_ > (StkFloat) ( chunkPointer_ + chunkSize_ - 1 ) ) { // positive rate
|
||||||
chunkPointer_ += chunkSize_ - 1; // overlap chunks by one frame
|
chunkPointer_ += chunkSize_ - 1; // overlap chunks by one frame
|
||||||
if ( chunkPointer_ + chunkSize_ > file_.fileSize() ) // at end of file
|
if ( chunkPointer_ + chunkSize_ > fileSize_ ) // at end of file
|
||||||
chunkPointer_ = file_.fileSize() - chunkSize_;
|
chunkPointer_ = fileSize_ - chunkSize_;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load more data.
|
// Load more data.
|
||||||
|
|||||||
Reference in New Issue
Block a user