在回调中解释 inputBuffer 的值
Interpreting inputBuffer's Value in a Callback
我的代码基于 Portaudio 的 paex_record_file.c 示例。回调中的参数之一是inputBuffer,我想用它的数据来计算其他double/float类型的数字。我将文件从 .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;
此问题与 print floats from audio input callback function(未回答)有些相关。
回调的 inputBuffer
参数是 void*
。底层缓冲区的实际类型取决于您传递给 Pa_OpenStream
.
的参数和标志
如果您指定了 paFloat32
,那么那里的某处就会有一个 float*
。然而,有两种可能性:
- 交错:
inputParameters.sampleFormat = paFloat32;
- 非交错:
inputParameters.sampleFormat = paFloat32|paNonInterleaved;
您指定了 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
计数 帧 而不是样本。一帧包括来自每个通道的一个样本。例如,在立体声流中,一个帧包括左右声道样本。
我的代码基于 Portaudio 的 paex_record_file.c 示例。回调中的参数之一是inputBuffer,我想用它的数据来计算其他double/float类型的数字。我将文件从 .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;
此问题与 print floats from audio input callback function(未回答)有些相关。
回调的 inputBuffer
参数是 void*
。底层缓冲区的实际类型取决于您传递给 Pa_OpenStream
.
如果您指定了 paFloat32
,那么那里的某处就会有一个 float*
。然而,有两种可能性:
- 交错:
inputParameters.sampleFormat = paFloat32;
- 非交错:
inputParameters.sampleFormat = paFloat32|paNonInterleaved;
您指定了 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
计数 帧 而不是样本。一帧包括来自每个通道的一个样本。例如,在立体声流中,一个帧包括左右声道样本。