微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么使用 memcpy 复制到 portaudio 输入缓冲区会产生噪音?

如何解决为什么使用 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 *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 个频道),但我不确定。你有什么想法吗?

您可以从 here

访问完整代码

解决方法

方法是正确的,但我无法正确指定帧大小

取而代之的是:

memcpy(&circularBuffer[data->write],inputBuffer,1024); // 1024 = FRAME_SIZE

这样会更好:

memcpy(&circularBuffer[data->write],1024*sizeof(float)); // Assuming 1024 = FRAME_SIZE

因为:

typedef float SAMPLE; 是 4 个字节。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。