diff --git a/include/Stk.h b/include/Stk.h index 7a050d4..9e753b0 100644 --- a/include/Stk.h +++ b/include/Stk.h @@ -373,6 +373,14 @@ public: */ void resize( size_t nFrames, unsigned int nChannels, StkFloat value ); + //! Copies a single channel + /*! + Copies the specified \c channel into \c destinationFrames's \c destinationChannel. \c destinationChannel must be between 0 and destination.channels() - 1 and + \c channel must be between 0 and channels() - 1. destination.frames() must be >= frames(). + No range checking is performed unless _STK_DEBUG_ is defined. + */ + StkFrames& copyChannel(unsigned int channel,StkFrames& destinationFrames, unsigned int destinationChannel) const; + //! Return the number of channels represented by the data. unsigned int channels( void ) const { return nChannels_; }; diff --git a/src/Stk.cpp b/src/Stk.cpp index 02079b3..7a2cf57 100644 --- a/src/Stk.cpp +++ b/src/Stk.cpp @@ -316,6 +316,34 @@ void StkFrames :: resize( size_t nFrames, unsigned int nChannels, StkFloat value for ( size_t i=0; i channels() - 1) { + std::ostringstream error; + error << "StkFrames::copyChannel invalid sourceChannel (" << sourceChannel << ")"; + Stk::handleError( error.str(), StkError::FUNCTION_ARGUMENT); + } + if (destinationChannel > destinationFrames.channels() - 1) { + std::ostringstream error; + error << "StkFrames::copyChannel invalid destinationChannel (" << destinationChannel << ")"; + Stk::handleError( error.str(), StkError::FUNCTION_ARGUMENT ); + } + if (destinationFrames.frames() < frames()) { + std::ostringstream error; + error << "StkFrames::copyChannel destination.frames() < frames()"; + Stk::handleError( error.str(), StkError::MEMORY_ACCESS); + } +#endif + int sourceHop = nChannels_; + int destinationHop = destinationFrames.nChannels_; + for (int i = sourceChannel, j= destinationChannel; i < nFrames_ * nChannels_; i+=sourceHop,j+=destinationHop) { + destinationFrames[j] = data_[i]; + } + return destinationFrames; + +} StkFloat StkFrames :: interpolate( StkFloat frame, unsigned int channel ) const {