Входной буфер Portaudio всегда пуст - PullRequest
1 голос
/ 07 августа 2020

Я пытаюсь изучить программирование DSP, чтобы попытаться создать свои собственные гитарные эффекты, и я использую библиотеку Portaudio, чтобы это произошло. Проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, что я делаю, всякий раз, когда я читаю входной буфер в обратном вызове, он пуст. Я пробовал несколько различных программ-примеров portaudio, но все они ничего не делают. Я также пробовал разные входы, от моего аудиоинтерфейса до моего внутреннего микрофона.

Basi c код обратного вызова, который я пробовал:

#define SAMPLE_RATE         (44100)
#define PA_SAMPLE_TYPE      paFloat32
#define FRAMES_PER_BUFFER   (64)

static int paCallback(  const void *inputBuffer, 
                            void *outputBuffer,
                            unsigned long framesPerBuffer,
                            const PaStreamCallbackTimeInfo* timeInfo,
                            PaStreamCallbackFlags statusFlags,
                            void *userData )
{
    float *out = (float*)outputBuffer;
    const float *in = (const float*)inputBuffer;

    //unused variables
    (void) timeInfo;
    (void) statusFlags;
    (void) userData;

    for (int i = 0; i < FRAMES_PER_BUFFER; i+=2){
        printf("%.1f ", in[i]);
    }
    printf("\r");

    return paContinue;
}

Сначала я попытался записать входной буфер в выходной буфер, чтобы просто воспроизвести то, что он получал, затем попытался просто распечатать его, чтобы увидеть, получает ли он вообще какие-либо данные. Всегда 0,0 или -0,0.

Некоторые вещи, которые могут быть важны:

  • Я использую macos Catalina.
  • Пример кода для воспроизведения работал нормально, мог генерировать пилообразную волну и слышать ее.
  • Я использую аудиоинтерфейс USB с двумя стереовходами и двумя стереовыходами.
  • Я перепробовал все устройства, доступные на Pa_GetDeviceCount ( ) и повторение через Pa_GetDeviceInfo (i).
  • Я возвращаюсь в C / C ++ после большого перерыва в любой работе разработчика, и это было с C# и JS, поэтому я ' я забыл много вещей нижнего уровня.

Мой код для инициализации потока:

PaStreamParameters getInputParameters(){
    // input parameters
    PaStreamParameters inPar;
    inPar.device = Pa_GetDefaultInputDevice();// choose_device();

    inPar.channelCount = 2; // stereo
    inPar.sampleFormat = PA_SAMPLE_TYPE;
    inPar.suggestedLatency = Pa_GetDeviceInfo( inPar.device )->defaultLowInputLatency;
    inPar.hostApiSpecificStreamInfo = NULL;

    return inPar;
}

PaError err;
    printf("Initialising\n");
    err = Pa_Initialize();
    if( err != paNoError ) { printf(  "PortAudio error: %s\n", Pa_GetErrorText( err ) ); }

    printf("Getting parameters\n");
    PaStreamParameters inputParameters = getInputParameters();
    PaStreamParameters outputParameters = getOutputParameters();

    printf("Opening stream\n");
    PaStream *stream;
    /* Open an audio I/O stream. */
    err = Pa_OpenStream(    &stream,
                            &inputParameters,
                            &outputParameters,
                            SAMPLE_RATE,
                            FRAMES_PER_BUFFER,
                            0, //paclipoff
                            paCallback,
                            NULL
    );
    if( err != paNoError ) { printf(  "PortAudio error: %s\n", Pa_GetErrorText( err ) ); }

    ... // wait for input, close stream, etc
}

Что-то не так с моим кодом или моей настройкой, что могло бы вызвать это быть так?

1 Ответ

1 голос
/ 07 августа 2020

Похоже, эта проблема была вызвана запуском приложения через мою IDE. У Каталины строгие разрешения, а коду Visual Studio не был предоставлен доступ (или запрос доступа) к микрофону. Когда я запускаю исполняемый файл напрямую, он работает так, как задумано.

...