Обратные вызовы PortAudio не непрерывны? - PullRequest
0 голосов
/ 26 апреля 2018

У меня проблема с использованием PortAudio, и я не уверен, что я не совсем понимаю, как работают обратные вызовы, или я сделал что-то не так. Мое предположение состояло в том, что обратные вызовы должны запускаться непрерывно «на галочке», содержащих текущие выборки, но кажется, что я получаю только несколько обратных вызовов, когда открываю и запускаю поток, и тогда я больше не получу обратных вызовов. Мой код:

PaStreamParameters inputP, outputP;
inputP.device = DeviceIndex;
inputP.channelCount = CardInfo->maxInputChannels;
inputP.sampleFormat = paFloat32;
inputP.suggestedLatency = CardInfo->defaultLowInputLatency;
inputP.hostApiSpecificStreamInfo = NULL;

outputP.device = DeviceIndex;
outputP.channelCount = CardInfo->maxOutputChannels;
outputP.sampleFormat = paFloat32;
outputP.suggestedLatency = CardInfo->defaultLowOutputLatency;
outputP.hostApiSpecificStreamInfo = NULL;

PaError err = Pa_OpenStream(
    &AudioStream,
    &inputP,
    &outputP,
    SAMPLE_RATE,
    FRAMES_PER_BUFFER,
    paClipOff,
    &CAudio::AudioCallback,
    this
);

err = Pa_StartStream(AudioStream);

Я использовал следующие константы

#define SAMPLE_RATE 44100
#define FRAMES_PER_BUFFER 64

Обратный звонок:

int CAudio::AudioCallback(const void* pInputBuffer, void* pOutputBuffer, unsigned long iFramesPerBuffer, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void* userData)
{
    CAudio* AudioInterface = (CAudio*)userData;

    const float* buffer = (const float*)pInputBuffer;

    printf("Callback: %d frames per buffer %d t %f\n", AudioInterface->CallbackIndex, iFramesPerBuffer, Pa_GetStreamTime(AudioInterface->AudioStream));
AudioInterface->CallbackIndex++;

    return paContinue;
}

Что произойдет, если я открою и запущу поток, я получу ровно шесть обратных вызовов, следующий вывод журнала

Opening audio stream on 'USB PnP Sound Device: Audio (hw:1,0)'
Opened audio stream, starting it...
Callback: 0 frames per buffer 64 t 21812.485122
Callback: 1 frames per buffer 64 t 21812.497681
Callback: 2 frames per buffer 64 t 21812.514483
Callback: 3 frames per buffer 64 t 21812.525110
Callback: 4 frames per buffer 64 t 21812.626489
Callback: 5 frames per buffer 64 t 21812.635590

Я что-то не так делаю или мое понимание того, что происходит с обратными вызовами, неправильное?

1 Ответ

0 голосов
/ 27 апреля 2018

Хорошо, сейчас я исправил это, используя API блокировки, захватывая поток и записывая его в буфер в цикле while, работающем в другом std :: thread, который работает довольно хорошо.

...