/* 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; }
int main(void) { PortAudioStream *stream; PaError err; paTestData data; int i; int totalSamps; printf("PortAudio Test: output sine sweep. ask for %d buffers\n", NUM_BUFFERS ); /* initialise sinusoidal wavetable */ for( i=0; i<TABLE_SIZE; i++ ) { data.sine[i] = (float) sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. ); } data.sine[TABLE_SIZE] = data.sine[0]; // set guard point data.left_phase = data.right_phase = 0.0; data.phase_increment = CalcPhaseIncrement(MIN_FREQ); data.framesToGo = totalSamps = NUM_SECONDS * SAMPLE_RATE; /* Play for a few seconds. */ printf("totalSamps = %d\n", totalSamps ); err = Pa_Initialize(); if( err != paNoError ) goto error; printf("PortAudio Test: output device = %d\n", OUTPUT_DEVICE ); err = Pa_OpenStream( &stream, paNoDevice, 0, /* no input */ paFloat32, /* 32 bit floating point input */ NULL, OUTPUT_DEVICE, 2, /* stereo output */ paFloat32, /* 32 bit floating point output */ NULL, SAMPLE_RATE, FRAMES_PER_BUFFER, NUM_BUFFERS, /* number of buffers, if zero then use default minimum */ paClipOff|paDitherOff, /* we won't output out of range samples so don't bother clipping them */ patestCallback, &data ); if( err != paNoError ) goto error; err = Pa_StartStream( stream ); if( err != paNoError ) goto error; printf("Is callback being called?\n"); for( i=0; i<((NUM_SECONDS+1)*1000); i+=SLEEP_DUR ) { printf("data.framesToGo = %d\n", data.framesToGo ); fflush(stdout); Pa_Sleep( SLEEP_DUR ); } /* Stop sound until ENTER hit. */ printf("Call Pa_StopStream()\n"); err = Pa_StopStream( stream ); if( err != paNoError ) goto error; Pa_Terminate(); printf("Test finished.\n"); return err; error: Pa_Terminate(); fprintf( stderr, "An error occured while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; }
/* 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; }
PaError TestStart( PortAudioStream **streamPtr, PaDeviceID devID, paTestData *data ) { PortAudioStream *stream; PaError err; int i; /* initialise sinusoidal wavetable */ for( i=0; i<TABLE_SIZE; i++ ) { data->sine[i] = (float) sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. ); } data->sine[TABLE_SIZE] = data->sine[0]; // set guard point data->left_phase = data->right_phase = 0.0; data->phase_increment = CalcPhaseIncrement(MIN_FREQ); printf("PortAudio Test: output device = %d\n", devID ); err = Pa_OpenStream( &stream, paNoDevice, 0, /* no input */ paFloat32, /* 32 bit floating point input */ NULL, devID, 2, /* stereo output */ paFloat32, /* 32 bit floating point output */ NULL, SAMPLE_RATE, FRAMES_PER_BUFFER, NUM_BUFFERS, /* number of buffers, if zero then use default minimum */ paClipOff|paDitherOff, /* we won't output out of range samples so don't bother clipping them */ patestCallback, data ); if( err != paNoError ) goto error; err = Pa_StartStream( stream ); if( err != paNoError ) goto error; *streamPtr = stream; return 0; error: return err; }
int main(void) { PaStream *stream; PaStreamParameters outputParameters; PaError err; paTestData data; int i; int done = 0; printf("PortAudio Test: enter letter then hit ENTER.\n" ); /* initialise sinusoidal wavetable */ for( i=0; i<TABLE_SIZE; i++ ) { data.sine[i] = 0.90f * (float) sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. ); } data.sine[TABLE_SIZE] = data.sine[0]; /* set guard point. */ data.left_phase = data.right_phase = 0.0; data.phase_increment = CalcPhaseIncrement(MIN_FREQ); err = Pa_Initialize(); if( err != paNoError ) goto error; printf("PortAudio Test: output device = %d\n", OUTPUT_DEVICE ); outputParameters.device = OUTPUT_DEVICE; outputParameters.channelCount = 2; /* stereo output */ outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */ outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency; outputParameters.hostApiSpecificStreamInfo = NULL; printf("Requested output latency = %.4f seconds.\n", outputParameters.suggestedLatency ); printf("%d frames per buffer.\n.", FRAMES_PER_BUFFER ); err = Pa_OpenStream( &stream, NULL, /* no input */ &outputParameters, SAMPLE_RATE, FRAMES_PER_BUFFER, paClipOff|paDitherOff, /* we won't output out of range samples so don't bother clipping them */ patestCallback, &data ); if( err != paNoError ) goto error; err = Pa_StartStream( stream ); if( err != paNoError ) goto error; printf("Play ASCII keyboard. Hit 'q' to stop. (Use RETURN key on Mac)\n"); fflush(stdout); while ( !done ) { float freq; int index; char c; do { c = getchar(); } while( c < ' '); /* Strip white space and control chars. */ if( c == 'q' ) done = 1; index = c % 26; freq = MIN_FREQ + (index * 40.0); data.phase_increment = CalcPhaseIncrement(freq); } printf("Call Pa_StopStream()\n"); err = Pa_StopStream( stream ); if( err != paNoError ) goto error; Pa_Terminate(); printf("Test finished.\n"); return err; error: Pa_Terminate(); fprintf( stderr, "An error occured while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; }
int main(void) { PortAudioStream *stream; PaError err; paTestData data; int i; int done = 0; printf("PortAudio Test: enter letter then hit ENTER. numBuffers = %d\n", NUM_BUFFERS ); /* initialise sinusoidal wavetable */ for( i=0; i<TABLE_SIZE; i++ ) { data.sine[i] = 0.90f * (float) sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. ); } data.sine[TABLE_SIZE] = data.sine[0]; // set guard point data.left_phase = data.right_phase = 0.0; data.phase_increment = CalcPhaseIncrement(MIN_FREQ); err = Pa_Initialize(); if( err != paNoError ) goto error; printf("PortAudio Test: output device = %d\n", OUTPUT_DEVICE ); err = Pa_OpenStream( &stream, paNoDevice, 0, /* no input */ paFloat32, /* 32 bit floating point input */ NULL, OUTPUT_DEVICE, 2, /* stereo output */ paFloat32, /* 32 bit floating point output */ NULL, SAMPLE_RATE, FRAMES_PER_BUFFER, NUM_BUFFERS, /* number of buffers, if zero then use default minimum */ paClipOff|paDitherOff, /* we won't output out of range samples so don't bother clipping them */ patestCallback, &data ); if( err != paNoError ) goto error; err = Pa_StartStream( stream ); if( err != paNoError ) goto error; printf("Play ASCII keyboard. Hit 'q' to stop. (Use RETURN key on Mac)\n"); fflush(stdout); while ( !done ) { float freq; int index; char c; do { c = getchar(); } while( c < ' '); /* Strip white space and control chars. */ if( c == 'q' ) done = 1; index = c % 26; freq = MIN_FREQ + (index * 40.0); data.phase_increment = CalcPhaseIncrement(freq); } printf("Call Pa_StopStream()\n"); err = Pa_StopStream( stream ); if( err != paNoError ) goto error; Pa_Terminate(); printf("Test finished.\n"); return err; error: Pa_Terminate(); fprintf( stderr, "An error occured while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; }