2014-11-06 4 views
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; 
} 

답변

0

콜백을 사용하는 대신 스트림을 "쓰기 금지"모드로 시도해 볼 수 있습니다. 이 모드를 사용하려면 streamCallback 매개 변수에 NULL을 전달하고 Pa_OpenDefaultStream 매개 변수를 지정하면 루프에서 Pa_WriteStream을 계속 호출합니다. 전화는 필요한 경우 차단됩니다. 이 의사 코드와 같은 것 :

Pa_OpenStream(&stream, 0, 2, paFloat32, SAMPLE_RATE, 512, NULL, NULL); 
Pa_StartStream(stream); 
float interleavedSamples[2*512]; 
for (int i = 0 ; i < SAMPLE_RATE/512 ; i++) // approx 1 second 
{ 
    GenerateNoise(&interleavedSamples, 2, 512, &data); 
    RunFft(interleavedSamples, ...); 
    PaWriteStream(stream, interleavedSamples, 512); 
} 
+0

감사합니다. – biduramk