gpt4 book ai didi

c++ - Portaudio 输入缓冲区始终为空

转载 作者:行者123 更新时间:2023-12-02 10:11:42 25 4
gpt4 key购买 nike

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

#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 音频接口(interface)。
  • 我已经尝试了 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
    }
    我的代码或我的设置有什么问题会导致这种情况吗?

    最佳答案

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

    关于c++ - Portaudio 输入缓冲区始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63294540/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com