端口音频导致 50% 的测试发出响亮的嗡嗡声

Port Audio causing Loud Buzzing 50% of Tests

本文关键字:测试 响亮 嗡嗡声 音频      更新时间:2023-10-16

我正在将端口音频与现有的MacOSX应用程序集成。这是我到目前为止的代码:

static int coreAudioCallback( const void *inputBuffer, void *outputBuffer,
                             unsigned long framesPerBuffer,
                             const PaStreamCallbackTimeInfo* timeInfo,
                             PaStreamCallbackFlags statusFlags,
                             void *userData ){
    /*(V3dAudioListener * pCallingListener = (V3dAudioListener*)userData;
    Aquila::SampleType *out = (Aquila::SampleType*)outputBuffer;
    pCallingListener->updateEQVals(out, framesPerBuffer);*/
    if (statusFlags & paInputOverflow) {
        printf("Input underflow");
    }
    if(statusFlags & paInputOverflow){
        printf("Input overflow");
    }
    if (statusFlags & paOutputUnderflowed) {
        printf("Output underflowed");
    }
    if (statusFlags & paOutputOverflow) {
        printf("Output overflow");
    }
    return 0;
}
void V3dAudioListener::start(){
    PaError error = Pa_Initialize();
    if(error != paNoError){
        throw std::invalid_argument("Failed to initialize port audio.");
    };
    PaStream *stream;
    /* Open an audio I/O stream. */
    error = Pa_OpenDefaultStream( &stream,
                                 0,          /* no input channels */
                                 2,          /* stereo output */
                                 paFloat32,  /* 32 bit floating point output */
                                 _sampleRate,
                                 _framesPerBuffer,        /* frames per buffer, i.e. the number
                                                           of sample frames that PortAudio will
                                                           request from the callback. Many apps
                                                           may want to use
                                                           paFramesPerBufferUnspecified, which
                                                           tells PortAudio to pick the best,
                                                           possibly changing, buffer size.*/
                                 coreAudioCallback, /* this is your callback function */
                                 this); /*This is a pointer that will be passed to
                                         your callback*/
    if( error != paNoError ){
        throw std::invalid_argument("Failed to set up port audio stream.");
    }
    error = Pa_StartStream(stream);
    if( error != paNoError ){
        throw std::invalid_argument("Failed to start port audio stream.");
    }
}
void V3dAudioListener::stop(){
    int error = Pa_Terminate();
    if(error != paNoError){
        throw std::invalid_argument("Failed to terminate port audio.");
    };
}

大约一半的时间,代码运行时,它会从输出音频设备产生响亮的嗡嗡声。嗡嗡声不会在每次运行期间开始或结束,但从初始启动开始就存在或不存在。是什么原因造成的?是否有所需的最小延迟来避免缓冲区溢出?在回调中放置 sleep(1) 似乎可以解决问题,除非在回调中完成了额外的工作。

其他信息:OSX 版本:10.11.3_sampleRate: 44100_framesPerBuffer: 256

解决方案是增加我们传递给输出流的_framesPerBuffer值。值 1024 允许回调中出现更大的延迟,从而防止发出嗡嗡声。