Порт Audio вызывает громкое жужжание в 50 % тестов

Я занимаюсь интеграцией аудио порта с существующим приложением 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


person user1832287    schedule 17.02.2016    source источник


Ответы (1)


Решение состояло в том, чтобы увеличить значение _framesPerBuffer, которое мы передаем в выходной поток. Значение 1024 позволило увеличить задержку обратного вызова, что предотвратило жужжание.

person user1832287    schedule 17.02.2016
comment
Очень рада, что наткнулась на это! Я использовал значение framePerBuffer 256, потому что это то, что было в примере открытия потока в документации PortAudio (portaudio.com/docs/v19-doxydocs/open_default_stream.html). Это было намного слишком низко, я просто слышал шум и не мог понять, почему. - person Nick W.; 02.10.2016