...is a cross-platform audio API. I'm trying to get to grips with it by executing the following in a Win32 Console App:
Code:
/*
* pa_cosine.c
* Generate a cosine wave
*
* Author: Christopher Dobrian
*
* This program uses the PortAudio Portable Audio Library.
* For more information see: http://www.portaudio.com
*
*/
#include <stdio.h>
#include <math.h>
#include "portaudio.h"
#include "pa_host.h"
#define NUM_SECONDS (4)
#define SAMPLE_RATE (44100)
#define BUFFER_SIZE (256)
#define TWOPI (6.283185307179586)
#define FREQUENCY 1000.
typedef struct {
float amplitude;
float frequency;
float phase;
unsigned long count;
} paAudioData;
/* This routine will be called by the PortAudio engine when audio is needed. */
static int cosineCallback( void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, PaTimestamp outTime, void *userData );
static int cosineCallback( void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, PaTimestamp outTime, void *userData )
{
/* Cast data passed through stream to the format of the local structure. */
paAudioData *data = (paAudioData*)userData;
// float *in = (float*)inputBuffer; // input buffer only needed for input
float *out = (float*)outputBuffer;
unsigned int i; // just a counter
float A = data->amplitude;
float twopiFoverR = TWOPI*data->frequency/SAMPLE_RATE;
float phase = data->phase;
float y; // temp variable for output sample
for( i = 0 ; i < framesPerBuffer ; i++ )
{
y = A*cos(twopiFoverR*(data->count++)+phase);
*out++ = y; /* left channel */
*out++ = y; /* right channel*/
}
return 0;
}
/*******************************************************************/
static paAudioData data;
int main(void);
int main(void)
{
PortAudioStream *stream;
PaError err;
printf("PortAudio: Cosine Wave, %.2f Hz.\n", FREQUENCY);
/* Initialize data for use by callback. */
data.amplitude = 0.5;
data.frequency = FREQUENCY;
data.phase = 0.;
/* Initialize library before making any other calls. */
err = Pa_Initialize();
if( err != paNoError ) goto error;
/* Open an audio I/O stream. */
err = Pa_OpenDefaultStream(
&stream,
0, /* no input channels */
2, /* stereo output */
paFloat32, /* 32 bit floating point output */
SAMPLE_RATE,
BUFFER_SIZE, /* frames per buffer */
0, /* number of buffers, if zero then use default minimum */
cosineCallback,
&data );
if( err != paNoError ) goto error;
err = Pa_StartStream( stream );
if( err != paNoError ) goto error;
/* Sleep for several seconds. */
Pa_Sleep(NUM_SECONDS*1000);
err = Pa_StopStream( stream );
if( err != paNoError ) goto error;
err = Pa_CloseStream( stream );
if( err != paNoError ) goto error;
Pa_Terminate();
printf("Calculated %ld samples.\n", data.count);
printf("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;
}
I've added the necessary files to the project (pa_lib.cpp, pa_host.h and portaudio.h) but I get 19 linker errors - all reporting unresolved externals.
Does anyone have experience of Port Audio? Or maybe someone can help with these error messages...