在回调中解释输入缓冲区的值



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

这就是我初始化输入参数的方式:

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;

这个问题与从音频输入回调函数(未回答)打印浮点数有些关系。

回调的inputBuffer参数是一个void*。基础缓冲区的实际类型取决于传递给 Pa_OpenStream 的参数和标志。

如果您指定了paFloat32那么某处将有一个float*。但是,有两种可能性:

  1. 交错:inputParameters.sampleFormat = paFloat32;
  2. 非交错:inputParameters.sampleFormat = paFloat32|paNonInterleaved;

您指定了交错选项。在这种情况下,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计数而不是样本。帧包含来自每个通道的一个样本。例如,在立体声流中,帧同时包含左声道和右声道样本。

最新更新