void appendBuffer( AudioBuffer* aBuffer ) { int bufferSize = aBuffer->bufferSize; if ( DiskWriter::cachedBuffer == 0 ) generateOutputBuffer(); // TODO: currently MONO ONLY !! SAMPLE_TYPE* channelBuffer = aBuffer->getBufferForChannel( 0 ); int writerIndex = DiskWriter::outputWriterIndex; int MAX_VALUE = 32767; // convert floats to shorts // write floats as short values for ( int i = 0; i < bufferSize; ++i ) { short int sample = ( short int )( channelBuffer[ i ] * MAX_VALUE ); if ( sample > MAX_VALUE ) sample = MAX_VALUE; else if ( sample < -MAX_VALUE ) sample = -MAX_VALUE; DiskWriter::cachedBuffer[ writerIndex + i ] = sample; } DiskWriter::outputWriterIndex = writerIndex + bufferSize; }
/** * prepare a new iteration of recording */ void prepare( std::string aOutputDir, int aBufferSize, int amountOfChannels ) { outputDirectory = aOutputDir; outputBufferSize = aBufferSize; generateOutputBuffer( amountOfChannels ); }
/** * append a AudioBuffer into the write buffer */ void appendBuffer( AudioBuffer* aBuffer ) { int bufferSize = aBuffer->bufferSize; int channelAmount = aBuffer->amountOfChannels; if ( DiskWriter::cachedBuffer == 0 ) generateOutputBuffer(); int writerIndex = DiskWriter::outputWriterIndex; int MAX_VALUE = 32767; // convert samples to shorts // write samples into PCM short buffer for ( int i = 0; i < bufferSize; ++i, writerIndex += channelAmount ) { for ( int c = 0; c < channelAmount; ++c ) { SAMPLE_TYPE* channelBuffer = aBuffer->getBufferForChannel( c ); short int sample = ( short int )( channelBuffer[ i ] * MAX_VALUE ); if ( sample > MAX_VALUE ) sample = MAX_VALUE; else if ( sample < -MAX_VALUE ) sample = -MAX_VALUE; DiskWriter::cachedBuffer[ writerIndex + c ] = sample; } } DiskWriter::outputWriterIndex = writerIndex; }
/** * append an AudioBuffer into the write buffer */ void appendBuffer( AudioBuffer* aBuffer ) { int bufferSize = aBuffer->bufferSize; int channelAmount = aBuffer->amountOfChannels; if ( cachedBuffer == 0 ) generateOutputBuffer( channelAmount ); cachedBuffer->mergeBuffers( aBuffer, 0, outputWriterIndex, MAX_PHASE ); outputWriterIndex += bufferSize; }
/** * append the actual output buffer from the engine * into the write buffer */ void appendBuffer( float* aBuffer, int aBufferSize, int amountOfChannels ) { if ( cachedBuffer == 0 ) generateOutputBuffer( amountOfChannels ); // write samples into cache buffers for ( int i = 0, c = 0; i < aBufferSize; ++i, ++outputWriterIndex, c += amountOfChannels ) { for ( int ci = 0; ci < amountOfChannels; ++ci ) cachedBuffer->getBufferForChannel( ci )[ outputWriterIndex ] = aBuffer[ c + ci ]; } }