0
초보자 (OSX 10.9.5, Xcode 6)portAudio 스트림의 샘플 FFT
나는 소리를내는 portAudio 스트림이 있습니다. 이제 콜백에서 생성 된 임의 값을 가져와 fftw 계획을 통해 실행하고 싶습니다. 내가 아는 한, fftw는 메인에서 실행되어야합니다. 콜백에서 주 번호를 어떻게 표시 할 수 있습니까? 포인터와 관련이 있다는 느낌이 들지만 그것은 매우 무식한 추측입니다 ...
두 개의 서로 다른 라이브러리에 가입하는 데 어려움이 있습니다. 작은 도움이 크게 감사하겠습니다, 감사합니다!
#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 data passed through stream to 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 that ranges between -1.0 and 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);
}
return 0;
}
/*******************************************************************/
static paTestData data;
int main(void);
int main(void)
{
PaStream *stream;
PaError err;
printf("PortAudio Test: output noise.\n");
/* Initialize our data for use by callback. */
data.left_phase = data.right_phase = 0.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,
512, /* frames per buffer */
patestCallback,
&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("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;
}
감사합니다. – biduramk