From 109f0bd9a8953354767d5426092c3cf061ccbdc3 Mon Sep 17 00:00:00 2001 From: "Grzegorz Szwoch (sound)" Date: Mon, 8 Mar 2021 09:26:15 +0100 Subject: [PATCH] Add StkFrames constructor that wraps pointer to existing buffer --- include/Stk.h | 4 ++++ src/Stk.cpp | 24 ++++++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/include/Stk.h b/include/Stk.h index 015aaec..d271618 100644 --- a/include/Stk.h +++ b/include/Stk.h @@ -285,6 +285,9 @@ public: //! Overloaded constructor that initializes the frame data to the specified size with \c value. 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. ~StkFrames(); @@ -440,6 +443,7 @@ private: unsigned int nChannels_; size_t size_; size_t bufferSize_; + bool ownData_; }; diff --git a/src/Stk.cpp b/src/Stk.cpp index 8126285..ed2fe93 100644 --- a/src/Stk.cpp +++ b/src/Stk.cpp @@ -229,7 +229,7 @@ void Stk :: handleError( std::string message, StkError::Type type ) // 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_; 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 ) - : data_( 0 ), nFrames_( nFrames ), nChannels_( nChannels ) + : data_( 0 ), nFrames_( nFrames ), nChannels_( nChannels ), ownData_(true) { size_ = nFrames_ * nChannels_; bufferSize_ = size_; @@ -266,13 +266,21 @@ StkFrames :: StkFrames( const StkFloat& value, unsigned int nFrames, unsigned in 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() { - if ( data_ ) free( data_ ); + if ( data_ && ownData_ ) free( data_ ); } StkFrames :: StkFrames( const StkFrames& f ) - : data_(0), size_(0), bufferSize_(0) + : data_(0), size_(0), bufferSize_(0), ownData_(true) { resize( f.frames(), f.channels() ); dataRate_ = Stk::sampleRate(); @@ -281,7 +289,7 @@ StkFrames :: StkFrames( const StkFrames& f ) StkFrames& StkFrames :: operator= ( const StkFrames& f ) { - if ( data_ ) free( data_ ); + if ( data_ && ownData_ ) free( data_ ); data_ = 0; size_ = 0; bufferSize_ = 0; @@ -298,15 +306,19 @@ void StkFrames :: resize( size_t nFrames, unsigned int nChannels ) size_ = nFrames_ * nChannels_; if ( size_ > bufferSize_ ) { - if ( data_ ) free( data_ ); + if ( data_ && ownData_ ) free( data_ ); data_ = (StkFloat *) malloc( size_ * sizeof( StkFloat ) ); #if defined(_STK_DEBUG_) if ( data_ == NULL ) { std::string error = "StkFrames::resize: memory allocation error!"; Stk::handleError( error, StkError::MEMORY_ALLOCATION ); } + if ( ownData ) { + Stk::handleError( "Pointer to external data was lost after resize", StkError::WARNING ); + } #endif bufferSize_ = size_; + ownData_ = true; } }