2016-02-17 29 views
0

我正在将端口音频与现有的MacOSX应用程序集成。这是我到目前为止的代码:端口音频引起大声嗡嗡声50%的测试

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."); 
    }; 
} 

关于的代码运行一半的时候,它产生的输出音频设备响亮的蜂鸣声。嗡嗡声不会在每次运行过程中开始或结束,但是从最初的启动开始或结束。这是什么造成的?是否有必要的最小延迟以避免溢出缓冲区?在回调中放置睡眠(1)似乎可以解决问题,除非在回调中完成额外的工作。

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

回答

2

的解决方案是增加我们传递到输出流的_framesPerBuffer值。值为1024允许在回调中产生更大的延迟,从而避免了嗡嗡声。

+0

很高兴我偶然发现了这个!我使用的是framesPerBuffer值为256,因为这是PortAudio文档(http://portaudio.com/docs/v19-doxydocs/open_default_stream.html)中的“打开流”示例中的内容。这是*方式*太低,我只是听到噪音,不知道为什么。 –