cannam@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ cannam@0: cannam@0: /* cannam@0: QM DSP Library cannam@0: cannam@0: Centre for Digital Music, Queen Mary, University of London. cannam@0: This file copyright 2005-2006 Christian Landone. cannam@0: All rights reserved. cannam@0: */ cannam@0: cannam@0: #include "Framer.h" cannam@0: #include cannam@0: cannam@0: ////////////////////////////////////////////////////////////////////// cannam@0: // Construction/Destruction cannam@0: ////////////////////////////////////////////////////////////////////// cannam@0: cannam@0: Framer::Framer() cannam@0: { cannam@0: m_dataFrame = NULL; cannam@0: m_strideFrame = NULL; cannam@0: } cannam@0: cannam@0: Framer::~Framer() cannam@0: { cannam@0: if( m_dataFrame != NULL ) cannam@0: delete [] m_dataFrame; cannam@0: cannam@0: if( m_strideFrame != NULL ) cannam@0: delete [] m_strideFrame; cannam@0: } cannam@0: cannam@0: void Framer::configure( unsigned int frameLength, unsigned int hop ) cannam@0: { cannam@0: m_frameLength = frameLength; cannam@0: m_stepSize = hop; cannam@0: cannam@0: resetCounters(); cannam@0: cannam@0: if( m_dataFrame != NULL ) cannam@0: { cannam@0: delete [] m_dataFrame; cannam@0: m_dataFrame = NULL; cannam@0: } cannam@0: m_dataFrame = new double[ m_frameLength ]; cannam@0: cannam@0: if( m_strideFrame != NULL ) cannam@0: { cannam@0: delete [] m_strideFrame; cannam@0: m_strideFrame = NULL; cannam@0: } cannam@0: m_strideFrame = new double[ m_stepSize ]; cannam@0: } cannam@0: cannam@0: void Framer::getFrame(double *dst) cannam@0: { cannam@0: cannam@0: if( (m_ulSrcIndex + ( m_frameLength) ) < m_ulSampleLen ) cannam@0: { cannam@0: for( unsigned int u = 0; u < m_frameLength; u++) cannam@0: { cannam@0: dst[ u ] = m_srcBuffer[ m_ulSrcIndex++ ]; cannam@0: } cannam@0: m_ulSrcIndex -= ( m_frameLength - m_stepSize ); cannam@0: } cannam@0: else cannam@0: { cannam@0: unsigned int rem = (m_ulSampleLen - m_ulSrcIndex ); cannam@0: unsigned int zero = m_frameLength - rem; cannam@0: cannam@0: for( unsigned int u = 0; u < rem; u++ ) cannam@0: { cannam@0: dst[ u ] = m_srcBuffer[ m_ulSrcIndex++ ]; cannam@0: } cannam@0: cannam@0: for( unsigned int u = 0; u < zero; u++ ) cannam@0: { cannam@0: dst[ rem + u ] = 0; cannam@0: } cannam@0: cannam@0: m_ulSrcIndex -= (( rem - m_stepSize ) ); cannam@0: } cannam@0: cannam@0: m_framesRead++; cannam@0: } cannam@0: cannam@0: void Framer::resetCounters() cannam@0: { cannam@0: m_framesRead = 0; cannam@0: m_ulSrcIndex = 0; cannam@0: } cannam@0: cannam@0: unsigned int Framer::getMaxNoFrames() cannam@0: { cannam@0: return m_maxFrames; cannam@0: } cannam@0: cannam@0: void Framer::setSource(double *src, unsigned int length) cannam@0: { cannam@0: m_srcBuffer = src; cannam@0: m_ulSampleLen = length; cannam@0: cannam@0: m_maxFrames = (unsigned int)ceil( (double)m_ulSampleLen/(double)m_stepSize ) ; cannam@0: }