【问题标题】:Portaudio Input Buffer is Always EmptyPortaudio 输入缓冲区始终为空
【发布时间】:2020-11-27 08:42:42
【问题描述】:

我正在尝试学习 DSP 编程以尝试创建自己的吉他效果,并且我正在使用 Portaudio 库来实现它。我遇到的问题是,无论我做什么,每当我在回调中读取输入缓冲区时,它都是空的。我已经尝试了几个不同的 portaudio 示例程序,但它们都什么都不做。我还尝试了不同的输入,从我的音频接口到我的内置麦克风。

我试过的基本回调代码:

#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
}

我的代码或我的设置有什么问题会导致这种情况吗?

【问题讨论】:

    标签: c++ macos audio signal-processing portaudio


    【解决方案1】:

    在我看来,这个问题是由通过我的 IDE 运行应用程序引起的。 Catalina 具有严格的权限,并且没有授予 Visual Studio 代码访问(或提示访问)麦克风的权限。当我直接运行可执行文件时,它会按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2014-09-26
      • 2021-08-31
      • 1970-01-01
      相关资源
      最近更新 更多