/* This routine will be called by the PortAudio engine when audio is needed. ** It may called at interrupt level on some machines so don't do anything ** that could mess up the system like calling malloc() or free(). */ static int patestCallback( void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, PaTimestamp outTime, void *userData ) { paTestData *data = (paTestData*)userData; float *out = (float*)outputBuffer; unsigned long i; int finished = 0; (void) outTime; /* Prevent unused variable warnings. */ (void) inputBuffer; for( i=0; i<framesPerBuffer; i++ ) { *out++ = LookupSine(data, data->left_phase); /* left */ *out++ = LookupSine(data, data->right_phase); /* right */ data->left_phase += data->phase_increment; if( data->left_phase >= 1.0f ) data->left_phase -= 1.0f; data->right_phase += (data->phase_increment * 1.5f); /* fifth above */ if( data->right_phase >= 1.0f ) data->right_phase -= 1.0f; /* sweep frequency then start over. */ data->phase_increment *= FREQ_SCALAR; if( data->phase_increment > CalcPhaseIncrement(MAX_FREQ) ) data->phase_increment = CalcPhaseIncrement(MIN_FREQ); } return 0; }
/* This routine will be called by the PortAudio engine when audio is needed. ** It may called at interrupt level on some machines so don't do anything ** that could mess up the system like calling malloc() or free(). */ static int patestCallback( void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, PaTimestamp outTime, void *userData ) { paTestData *data = (paTestData*)userData; float *out = (float*)outputBuffer; int framesToCalc; int i; int finished = 0; (void) outTime; /* Prevent unused variable warnings. */ (void) inputBuffer; if( data->framesToGo < framesPerBuffer ) { framesToCalc = data->framesToGo; data->framesToGo = 0; finished = 1; } else { framesToCalc = framesPerBuffer; data->framesToGo -= framesPerBuffer; } for( i=0; i<framesToCalc; i++ ) { *out++ = LookupSine(data, data->left_phase); /* left */ *out++ = LookupSine(data, data->right_phase); /* right */ data->left_phase += data->phase_increment; if( data->left_phase >= 1.0f ) data->left_phase -= 1.0f; data->right_phase += (data->phase_increment * 1.5f); /* fifth above */ if( data->right_phase >= 1.0f ) data->right_phase -= 1.0f; /* sweep frequency then start over. */ data->phase_increment *= FREQ_SCALAR; if( data->phase_increment > CalcPhaseIncrement(MAX_FREQ) ) data->phase_increment = CalcPhaseIncrement(MIN_FREQ); } /* zero remainder of final buffer */ for( ; i<(int)framesPerBuffer; i++ ) { *out++ = 0; /* left */ *out++ = 0; /* right */ } // Pa_Sleep( 3 * MSEC_PER_BUFFER / 4 ); // Pa_Sleep( MSEC_PER_BUFFER / 3 ); return finished; }
/* This routine will be called by the PortAudio engine when audio is needed. ** It may called at interrupt level on some machines so don't do anything ** that could mess up the system like calling malloc() or free(). */ static int patestCallback( const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void *userData ) { paTestData *data = (paTestData*)userData; float *out = (float*)outputBuffer; int i; (void) inputBuffer; /* Prevent unused variable warning. */ for( i=0; i<framesPerBuffer; i++ ) { *out++ = LookupSine(data, data->left_phase); /* left */ *out++ = LookupSine(data, data->right_phase); /* right */ data->left_phase += data->phase_increment; if( data->left_phase >= 1.0f ) data->left_phase -= 1.0f; data->right_phase += (data->phase_increment * 1.5f); /* fifth above */ if( data->right_phase >= 1.0f ) data->right_phase -= 1.0f; } return 0; }
/* This routine will be called by the PortAudio engine when audio is needed. ** It may called at interrupt level on some machines so don't do anything ** that could mess up the system like calling malloc() or free(). */ static int patestCallback(const void* inputBuffer, void* outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void* userData ) { paTestData *data = (paTestData*)userData; float *out = (float*)outputBuffer; float outSample; float scaler; int numForScale; unsigned long i; int j; int finished = 0; (void) inputBuffer; /* Prevent unused argument warning. */ /* Determine amplitude scaling factor */ numForScale = data->numSines; if( numForScale < 8 ) numForScale = 8; /* prevent pops at beginning */ scaler = 1.0f / numForScale; for( i=0; i<framesPerBuffer; i++ ) { float output = 0.0; float phaseInc = MIN_PHASE_INC; float phase; for( j=0; j<data->numSines; j++ ) { /* Advance phase of next oscillator. */ phase = data->phases[j]; phase += phaseInc; if( phase >= 1.0 ) phase -= 1.0; output += LookupSine(data, phase); data->phases[j] = phase; phaseInc *= 1.02f; if( phaseInc > MAX_PHASE_INC ) phaseInc = MIN_PHASE_INC; } outSample = (float) (output * scaler); *out++ = outSample; /* Left */ *out++ = outSample; /* Right */ } return finished; }