c++ - 为什么使用 memcpy 复制到 portaudio 输入缓冲区会产生噪音?
问题描述
我只是想在回调函数中复制 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;
memcpy(&circularBuffer[data->write], inputBuffer, 1024); // Assuming samplesPerFrame = FRAME_SIZE
data->write = data->write + 1024;
(void) outputBuffer; /* Prevent unused variable warnings. */
(void) timeInfo;
(void) statusFlags;
(void) userData;
if( framesLeft < framesPerBuffer )
{
framesToCalc = framesLeft;
finished = paComplete;
}
else
{
framesToCalc = framesPerBuffer;
finished = paContinue;
}
data->frameIndex += framesToCalc;
return finished;
}
这是来自 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
{
for( i=0; i<framesToCalc; i++ )
{
*wptr++ = *rptr++; /* left */
if( NUM_CHANNELS == 2 ) *wptr++ = *rptr++; /* right */
}
}
data->frameIndex += framesToCalc;
return finished;
}
而我只是使用memcpy
而不是迭代指针。但是我录制的声音有很多噪音。我无法弄清楚问题所在。也许,我错过了频道(2 个频道),但我不确定。你有什么主意吗?
您可以从此处访问完整代码
解决方案
该方法是正确的,但我无法正确指定帧大小
而不是这个:
memcpy(&circularBuffer[data->write], inputBuffer, 1024); // 1024 = FRAME_SIZE
这会更好:
memcpy(&circularBuffer[data->write], inputBuffer, 1024*sizeof(float)); // Assuming 1024 = FRAME_SIZE
因为:
typedef float SAMPLE;
是 4 个字节。
推荐阅读
- android - Gradle 同步失败 Flutter 2.5.1
- r - 将时间序列与复制品进行统计比较
- node.js - 使用组件显示数组行
- javascript - SignalR hub.On 方法在刷新页面后起作用
- android-studio - cmd 提示符中的 Avd 管理器未显示列表中的任何设备
- gzip - GZIP 和 PKZIP 文件中的压缩字节是否兼容?
- r - 如何绘制对数似然图
- google-apps-script - 应用脚本很慢,调用次数多 同一个函数有几个范围,它调用 getValues
- laravel - 有没有办法按模型集合中的元素分组?
- android - Android Asyntask API 已弃用