#include "RtAudio.h" #include #include #include using namespace std; #define SAMPLE double #define MY_PIE 3.14159265358979 #define MY_SRATE 44100 // delay buffer SAMPLE * g_delay = NULL; // max delay length long g_delayMax = 200000; // delay length long g_delayLen = MY_SRATE; // read and write indices long g_reader = 0; long g_writer = 0; // callback int callme( char * buffer, int buffer_size, void * user_data ) { fprintf( stderr, "THOR" ); SAMPLE * buffy = (SAMPLE *)buffer; for( int i = 0; i < buffer_size; i++ ) { // write into the delay g_delay[g_writer] = buffy[i]; // read out of the buffer buffy[i] = g_delay[g_reader]; // increment g_writer++; g_reader++; // warp g_writer %= g_delayMax; g_reader %= g_delayMax; } return 0; } // entry point int main( int argc, char ** argv ) { // RtAudio pointer RtAudio * audio = NULL; // buffer size int buffer_size = 512; // create the RtAudio try { audio = new RtAudio( 0, // device number of output 1, // number of output channels 0, // device number for input 1, // number of input channels RTAUDIO_FLOAT64, // format MY_SRATE, // sample rate &buffer_size, // buffer size 8 // number of buffers ); } catch( RtError & err ) { err.printMessage(); exit(1); } // allocate delay g_delay = new SAMPLE[g_delayMax]; // zero out memset( g_delay, 0, sizeof(SAMPLE)*g_delayMax ); // sanity check assert( g_delayLen <= g_delayMax ); // set indices g_reader = g_writer - g_delayLen; // wrap if( g_reader < 0 ) g_reader += g_delayMax; // set the callback try { audio->setStreamCallback( &callme, NULL ); audio->startStream(); } catch( RtError & err ) { // do stuff err.printMessage(); goto cleanup; } // something needs to happen here while( true ) { usleep( 10000 ); } // if we get here, then stop! try { audio->stopStream(); } catch( RtError & err ) { // do stuff err.printMessage(); } cleanup: audio->closeStream(); delete audio; return 0; }