示例#1
0
void AudioStretcher::write( AudioFrame* frame ) {
    int readFrames = frame->size / (audio.channels*2);
    //convert s16 to float
    for( int i=0; i < readFrames; i++ )
        for( int c=0; c<audio.channels; c++ )
            buffer[c][i] = frame->data[i*audio.channels+c] / 32768.f;
    rubberband->process( buffer, readFrames, false );

    if( !audioOutput.empty() ) {
        int actualFrames = rubberband->retrieve( buffer, audio.frequency );
        AudioFrame* frame = new AudioFrame( actualFrames * (2*audio.channels) );
        //convert float to s16
        for( int i=0; i<actualFrames; i++ )
            for( int c=0; c<audio.channels; c++ )
                frame->data[i*audio.channels+c] = buffer[c][i] * 32768.f;
        foreach( AudioOutput* output, audioOutput ) output->write( frame->copy() );
        frame->free();
    }
    frame->free();
}