Wednesday 15 February 2012

osx - FFT of samples from portAudio stream -



osx - FFT of samples from portAudio stream -

beginner here, (osx 10.9.5, xcode 6)

i have portaudio stream gives out noise. i'd random values generated in callback , run them through fftw plan. far know, fftw needs executed in main. how can show numbers callback main? have feeling has pointers that's uneducated guess...

i'm having difficulty joining 2 different libraries. little help appreciated, give thanks you!

#include <stdio.h> #include <math.h> #include <stdlib.h> #include "portaudio.h" #include "fftw3.h" #define num_seconds (1) #define sample_rate (44100) typedef struct { float left_phase; float right_phase; } patestdata; static int patestcallback( const void *inputbuffer, void *outputbuffer, unsigned long framesperbuffer, const pastreamcallbacktimeinfo* timeinfo, pastreamcallbackflags statusflags, void *userdata ) { /* cast info passed through stream our structure. */ patestdata *data = (patestdata*)userdata; float *out = (float*)outputbuffer; unsigned int i; (void) inputbuffer; /* prevent unused variable warning. */ for( i=0; i<framesperbuffer; i++ ) { *out++ = data->left_phase; /* left */ *out++ = data->right_phase; /* right */ /* generate random value ranges between -1.0 , 1.0. */ data->left_phase = (((float)rand()/(float)(rand_max)) * 2) - 1 ; data->right_phase = (((float)rand()/(float)(rand_max)) * 2) - 1 ; printf("%f, %f\n", data->left_phase, data->right_phase); } homecoming 0; } /*******************************************************************/ static patestdata data; int main(void); int main(void) { pastream *stream; paerror err; printf("portaudio test: output noise.\n"); /* initialize our info utilize callback. */ data.left_phase = data.right_phase = 0.0; /* initialize library before making other calls. */ err = pa_initialize(); if( err != panoerror ) goto error; /* open sound i/o stream. */ err = pa_opendefaultstream( &stream, 0, /* no input channels */ 2, /* stereo output */ pafloat32, /* 32 bit floating point output */ sample_rate, 512, /* frames per buffer */ patestcallback, &data ); if( err != panoerror ) goto error; err = pa_startstream( stream ); if( err != panoerror ) goto error; /* sleep 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("test finished.\n"); homecoming err; error: pa_terminate(); fprintf( stderr, "an error occured while using portaudio stream\n" ); fprintf( stderr, "error number: %d\n", err ); fprintf( stderr, "error message: %s\n", pa_geterrortext( err ) ); homecoming err; }

you seek running stream in "blocking write" mode instead of using callback. utilize mode, pass null streamcallback parameter of pa_opendefaultstream , continually phone call pa_writestream in loop. phone call block necessary. pseudo code:

pa_openstream(&stream, 0, 2, pafloat32, sample_rate, 512, null, null); pa_startstream(stream); float interleavedsamples[2*512]; (int = 0 ; < sample_rate/512 ; i++) // approx 1 sec { generatenoise(&interleavedsamples, 2, 512, &data); runfft(interleavedsamples, ...); pawritestream(stream, interleavedsamples, 512); }

osx audio fftw portaudio

No comments:

Post a Comment