Аудио на порта, причиняващо силно бръмчене в 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
Много се радвам, че попаднах на това! Използвах стойност на framesPerBuffer от 256, защото това беше в примера за отваряне на поток в документите на PortAudio (portaudio.com/docs/v19-doxydocs/open_default_stream.html). Това беше много твърде ниско, просто получавах шум и не можех да разбера защо. - person Nick W.; 02.10.2016