2016-03-12 57 views
1

由于我是PortAudio的新手,我尝试了一个来自Internet的示例程序。该程序能够通过回调函数记录麦克风的输入。PortAudio通过音频数据迭代

我想获得表示为数字值(例如浮子)所记录的音频的每一个样品。我无法确定麦克风录制数据的存储位置。

这是回调函数:

static int recordCallback(const void *inputBuffer, void *outputBuffer, 
    unsigned long framesPerBuffer, 
    const PaStreamCallbackTimeInfo* timeInfo, 
    PaStreamCallbackFlags statusFlags, 
    void *userData) 
{ 
    paTestData *data = (paTestData*)userData; 
    const SAMPLE *rptr = (const SAMPLE*)inputBuffer; 
    SAMPLE *wptr = &data->recordedSamples[data->frameIndex * NUM_CHANNELS]; 
    long framesToCalc; 
    long i; 
    int finished; 
    unsigned long framesLeft = data->maxFrameIndex - data->frameIndex; 

    (void)outputBuffer; /* Prevent unused variable warnings. */ 
    (void)timeInfo; 
    (void)statusFlags; 
    (void)userData; 
    if (framesLeft < framesPerBuffer) 
    { 
     framesToCalc = framesLeft; 
     finished = paComplete; 
    } 
    else 
    { 
     framesToCalc = framesPerBuffer; 
     finished = paContinue; 
    } 

    if (inputBuffer == NULL) 
    { 
     for (i = 0; i<framesToCalc; i++) 
     { 
      *wptr++ = SAMPLE_SILENCE; /* left */ 
      if (NUM_CHANNELS == 2) *wptr++ = SAMPLE_SILENCE; /* right */ 
     } 
    } 
    else 
    { 
     cout << endl << "SAMPLE" << endl; 
     for (i = 0; i<framesToCalc; i++) 
     { 
      *wptr++ = *rptr++; /* left */ 
      //cout << rptr<<endl; 
      if (NUM_CHANNELS == 2) *wptr++ = *rptr++; /* right */ 
     } 
    } 
    data->frameIndex += framesToCalc; 
    return finished; 
} 

音频输入流在这里初始化:

err = Pa_OpenStream(
     &stream, 
     &inputParameters, 
     NULL,     /* &outputParameters, */ 
     SAMPLE_RATE, 
     FRAMES_PER_BUFFER, 
     paClipOff,  /* we won't output out of range samples so don't bother clipping them */ 
     recordCallback, 
     &data); 

回答

2

输入数据被存储在inputBuffer指针回调。根据调用Pa_OpenStream时使用的inputParameters,应该能够将输入缓冲区转换为相应数据类型的数组(例如,如果使用paFloat32作为样本格式,则缓冲区可解释为const float*)。

建议您在回调函数中将传入数据复制到另一个缓冲区以供进一步处理(在回调之外)。

多通道采样在缓冲区中交错。例如,立体声输入inputBuffer[0]是左声道的第一个样本,inputBuffr[1]是右声道的第一个样本,inputBuffer[2]是左声道的第二个样本,等等。样本的总数由回调的参数framesPerBuffer提供。

+0

你能告诉我在初始化(第二代码剪切)的哪个参数是inputBuffer?我现在明白了它在回调中的位置。 – bingoStack

+0

@bingoStack初始化时没有输入缓冲区。它将通过回调函数传递给您。您可以通过inputParameters结构来调整,以告知您需要多少个通道以及示例格式,请参阅http://portaudio.com/docs/v19-doxydocs/structPaStreamParameters.html – Archie

+0

谢谢!虽然,我无法读取数据。我刚刚添加了'cout << *(float *)(inputBuffer)<< endl';在回调中返回完成之前,我得到0或+/- 3.0517e-005。哪里不对? – bingoStack