| 148 | } |
| 149 | |
| 150 | BufferRef SourceFile::loadBuffer() |
| 151 | { |
| 152 | seek( 0 ); |
| 153 | |
| 154 | BufferRef result = make_shared<Buffer>( mNumFrames, getNumChannels() ); |
| 155 | |
| 156 | if( mConverter ) { |
| 157 | // TODO: need BufferView's in order to reduce number of copies |
| 158 | Buffer converterDestBuffer( mConverter->getDestMaxFramesPerBlock(), getNumChannels() ); |
| 159 | size_t readCount = 0; |
| 160 | while( true ) { |
| 161 | size_t framesNeeded = std::min( getMaxFramesPerRead(), mFileNumFrames - readCount ); |
| 162 | if( framesNeeded == 0 ) |
| 163 | break; |
| 164 | |
| 165 | // make sourceBuffer num frames match outNumFrames so that Converter doesn't think it has more |
| 166 | if( framesNeeded != mConverterReadBuffer.getNumFrames() ) |
| 167 | mConverterReadBuffer.setNumFrames( framesNeeded ); |
| 168 | |
| 169 | size_t outNumFrames = performRead( &mConverterReadBuffer, 0, framesNeeded ); |
| 170 | CI_ASSERT( outNumFrames == framesNeeded ); |
| 171 | |
| 172 | pair<size_t, size_t> count = mConverter->convert( &mConverterReadBuffer, &converterDestBuffer ); |
| 173 | result->copyOffset( converterDestBuffer, count.second, mReadPos, 0 ); |
| 174 | |
| 175 | readCount += outNumFrames; |
| 176 | mReadPos += count.second; |
| 177 | } |
| 178 | } |
| 179 | else { |
| 180 | size_t readCount = performRead( result.get(), 0, mNumFrames ); |
| 181 | mReadPos = readCount; |
| 182 | } |
| 183 | |
| 184 | return result; |
| 185 | } |
| 186 | |
| 187 | void SourceFile::seek( size_t readPositionFrames ) |
| 188 | { |
nothing calls this directly
no test coverage detected