【问题标题】:Portaudio on Raspberry Pi, cannot find device for input streamRaspberry Pi 上的 Portaudio,找不到输入流的设备
【发布时间】:2018-12-01 11:25:25
【问题描述】:

我是 Portaudio 的新手,我使用名为 Matrix Creator 的设备将它安装在 Raspberry Pi 上。 Matrix Creator 使用所有 GPIO 引脚连接 Pi,上面有 8 个麦克风。

我想使用 Portaudio 实现实时音频流(在录制的同时播放声音,或同时播放麦克风收集的任何内容)。

根据Portaudio website,它说我们必须知道 inputStream 和 outputStream 的设备 ID。我使用函数 Pa_GetDeviceCount 来检查 Pi 可以检测到什么,代码如下所示:

  int numDevices = Pa_GetDeviceCount();
  cout<<"Device num: "<<numDevices<<endl;
  const PaDeviceInfo * deviceInfo;
  for(int i = 0; i < numDevices; i++){ 
      deviceInfo = Pa_GetDeviceInfo(i);
      cout<<"Device info of "<<i<<"is :"<<deviceInfo;}

我得到的结果:

Device num: -10000

问题 1

有什么方法可以获取我的 Matrix 麦克风的设备信息?

问题 2

由于我无法获取输入设备 ID,并且我仍然想使用缓冲区将从 mics 接收到的数据作为我的 inputStream 传递,(我可以将 mics 接收到的所有信号放入 2D 缓冲区,code),如何实现实时音频采集和播放

【问题讨论】:

    标签: c++ raspberry-pi real-time audio-streaming portaudio


    【解决方案1】:

    看看那个特定的硬件,它似乎不应该充当单独的音频接口(以您的典型方式,如外部声卡)。这就是为什么 portaudio 不会专门识别它的原因。

    如果您查看链接的代码和 MATRIX 文档,整个软件运行在抽象层(HAL)之上。这使您可以使用 C++ 调用内核模块以从设备中读取值。因此,您可以通过 C++ 中的 HAL 内核模块(或更高级别的接口,如果您想使用不同的语言/可能使用MATRIX Core 进行更简单的设置)从硬件访问音频输入。

    这正是code you linked;通过 C++ 中的内核模块访问麦克风输入!

    所以:

    问题 1 - 有什么方法可以获取 Matrix 麦克风的设备信息?

    如果您可以单独访问每个麦克风的设备信息,我会感到惊讶,除非 HAL 支持这一点(尽管在查看后我没有在文档中看到任何内容)。

    问题 2 - 由于我无法获取输入设备 ID,并且我仍然想使用缓冲区将从 mics 接收到的数据作为我的 inputStream 传递,(我可以将 mics 接收到的所有信号放入 2D 缓冲区, 代码),如何实现音频的实时采集和播放?

    为 portaudio 设置音频输出是一项非常常见的任务,因此我相信您会在网上找到许多有关如何执行此操作的示例。对于初学者this source code 包含在portaudio 下载中,用于通过portaudio 选择的输出播放浮点数据(正弦波)。

    但是,对于实时,一般技术是write a callback function,当音频输出设备准备好接收更多音频时,它将运行回调函数以返回下一个音频缓冲区。在 portaudio 示例文件夹(即paex_fuzz.c 程序)中有更多这样的示例。

    在这个回调函数中,你可以做任何DSP处理,随心所欲地调整信号。

    请注意: portaudio 回调函数可以在中断级别调用,并且将非常快速地搜索新的输入块,所以我不确定像这样将音频发送到 portaudio 是多么可行(没有极端缓冲)。但是还没有看到 HAL 支持的另一种方式。

    我不确定你打算对瞬时播放做什么(除了通过波束成形的实时音频,这样你就可以听到 Alexa/Google Home 听到的声音?)我相信这个设备不是为此目的而设计的,但我希望这个可以帮忙!

    【讨论】:

    • micarray_recorder_direct.cpp 是我试图用来获取音频信号的文件。我希望使用由“mics.read()”提供的缓冲区。既然我想要无限的实时流,我应该把缓冲区放在哪里? (在主函数内部并将缓冲区传递给回调?还是在回调函数中读取麦克风?)在portaudio下的示例“paex_sine.c”中,似乎它们在main中生成数据并在回调中传递数据,以及回调函数只处理如何传递左右信号。
    猜你喜欢
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2016-06-13
    相关资源
    最近更新 更多