Add StkFrames constructor that wraps pointer to existing buffer

This commit is contained in:
Grzegorz Szwoch (sound)
2021-03-08 09:26:15 +01:00
parent 7b94384705
commit 109f0bd9a8
2 changed files with 22 additions and 6 deletions

View File

@@ -285,6 +285,9 @@ public:
//! Overloaded constructor that initializes the frame data to the specified size with \c value. //! Overloaded constructor that initializes the frame data to the specified size with \c value.
StkFrames( const StkFloat& value, unsigned int nFrames, unsigned int nChannels ); StkFrames( const StkFloat& value, unsigned int nFrames, unsigned int nChannels );
//! Overloaded constructor that wraps the provided pointer to \c data.
StkFrames( StkFloat* data, unsigned int nFrames, unsigned int nChannels = 1 );
//! The destructor. //! The destructor.
~StkFrames(); ~StkFrames();
@@ -440,6 +443,7 @@ private:
unsigned int nChannels_; unsigned int nChannels_;
size_t size_; size_t size_;
size_t bufferSize_; size_t bufferSize_;
bool ownData_;
}; };

View File

@@ -229,7 +229,7 @@ void Stk :: handleError( std::string message, StkError::Type type )
// //
StkFrames :: StkFrames( unsigned int nFrames, unsigned int nChannels ) StkFrames :: StkFrames( unsigned int nFrames, unsigned int nChannels )
: data_( 0 ), nFrames_( nFrames ), nChannels_( nChannels ) : data_( 0 ), nFrames_( nFrames ), nChannels_( nChannels ), ownData_(true)
{ {
size_ = nFrames_ * nChannels_; size_ = nFrames_ * nChannels_;
bufferSize_ = size_; bufferSize_ = size_;
@@ -248,7 +248,7 @@ StkFrames :: StkFrames( unsigned int nFrames, unsigned int nChannels )
} }
StkFrames :: StkFrames( const StkFloat& value, unsigned int nFrames, unsigned int nChannels ) StkFrames :: StkFrames( const StkFloat& value, unsigned int nFrames, unsigned int nChannels )
: data_( 0 ), nFrames_( nFrames ), nChannels_( nChannels ) : data_( 0 ), nFrames_( nFrames ), nChannels_( nChannels ), ownData_(true)
{ {
size_ = nFrames_ * nChannels_; size_ = nFrames_ * nChannels_;
bufferSize_ = size_; bufferSize_ = size_;
@@ -266,13 +266,21 @@ StkFrames :: StkFrames( const StkFloat& value, unsigned int nFrames, unsigned in
dataRate_ = Stk::sampleRate(); dataRate_ = Stk::sampleRate();
} }
StkFrames :: StkFrames( StkFloat* data, unsigned int nFrames, unsigned int nChannels )
: data_( data ), nFrames_( nFrames ), nChannels_( nChannels ), ownData_(false)
{
size_ = nFrames_ * nChannels_;
bufferSize_ = size_;
dataRate_ = Stk::sampleRate();
}
StkFrames :: ~StkFrames() StkFrames :: ~StkFrames()
{ {
if ( data_ ) free( data_ ); if ( data_ && ownData_ ) free( data_ );
} }
StkFrames :: StkFrames( const StkFrames& f ) StkFrames :: StkFrames( const StkFrames& f )
: data_(0), size_(0), bufferSize_(0) : data_(0), size_(0), bufferSize_(0), ownData_(true)
{ {
resize( f.frames(), f.channels() ); resize( f.frames(), f.channels() );
dataRate_ = Stk::sampleRate(); dataRate_ = Stk::sampleRate();
@@ -281,7 +289,7 @@ StkFrames :: StkFrames( const StkFrames& f )
StkFrames& StkFrames :: operator= ( const StkFrames& f ) StkFrames& StkFrames :: operator= ( const StkFrames& f )
{ {
if ( data_ ) free( data_ ); if ( data_ && ownData_ ) free( data_ );
data_ = 0; data_ = 0;
size_ = 0; size_ = 0;
bufferSize_ = 0; bufferSize_ = 0;
@@ -298,15 +306,19 @@ void StkFrames :: resize( size_t nFrames, unsigned int nChannels )
size_ = nFrames_ * nChannels_; size_ = nFrames_ * nChannels_;
if ( size_ > bufferSize_ ) { if ( size_ > bufferSize_ ) {
if ( data_ ) free( data_ ); if ( data_ && ownData_ ) free( data_ );
data_ = (StkFloat *) malloc( size_ * sizeof( StkFloat ) ); data_ = (StkFloat *) malloc( size_ * sizeof( StkFloat ) );
#if defined(_STK_DEBUG_) #if defined(_STK_DEBUG_)
if ( data_ == NULL ) { if ( data_ == NULL ) {
std::string error = "StkFrames::resize: memory allocation error!"; std::string error = "StkFrames::resize: memory allocation error!";
Stk::handleError( error, StkError::MEMORY_ALLOCATION ); Stk::handleError( error, StkError::MEMORY_ALLOCATION );
} }
if ( ownData ) {
Stk::handleError( "Pointer to external data was lost after resize", StkError::WARNING );
}
#endif #endif
bufferSize_ = size_; bufferSize_ = size_;
ownData_ = true;
} }
} }