在回调中解释inputBuffer的值

时间:2016-02-25 23:24:45

标签: callback portaudio

我的代码基于Portaudio的paex_record_file.c示例。回调中的一个参数是inputBuffer,我想用它的数据来计算double / float类型的其他数字。我将文件从.raw更改为.txt,但记事本仍然无法读取它,导致我认为其数据实际上并未编码为数字。如何将数据存储在inputBuffer中,如何对其进行算术运算(加,乘,除等)?

这是我初始化inputParameters的方法:

inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */
if (inputParameters.device == paNoDevice) {
    fprintf(stderr,"Error: No default input device.\n");
    goto error;
}
inputParameters.channelCount = 2;                    /* stereo input */
inputParameters.sampleFormat = paFloat32;
inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultLowInputLatency;
inputParameters.hostApiSpecificStreamInfo = NULL;

这个问题与print floats from audio input callback function(未答复)有些相关。

1 个答案:

答案 0 :(得分:2)

回调的inputBuffer参数是void*。底层缓冲区的实际类型取决于您传递给Pa_OpenStream的参数和标志。

如果您指定了paFloat32,那么某处会有float*。然而,有两种可能性:

  1. Interleaved: inputParameters.sampleFormat = paFloat32;
  2. 非交错: inputParameters.sampleFormat = paFloat32|paNonInterleaved;
  3. 您指定了 interleaved 选项。在这种情况下,inputBuffer指向交错浮点的单个缓冲区。所以你可以写:

    float *samples = (float*)inputBuffer;
    

    在双通道流中,samples将包含交错的左右样本,例如:

    samples[0]; // first left sample
    samples[1]; // first right sample
    samples[2]; // second left sample
    samples[3]; // second right sample
    // etc.
    

    为了完整性:如果它是非交错流,则inputBuffer指向指向单通道缓冲区的指针数组。要提取缓冲区指针,您可以编写如下内容:

    float *left = ((float **) inputBuffer)[0];
    float *right = ((float **) inputBuffer)[1];
    

    请注意,在所有情况下,framesPerBuffer计算而不是样本。帧包括来自每个通道的一个样本。例如,在立体声流中,帧包括左和右声道样本。