使用PortAudio检索设备

背景

在项目中,有个定制的银河麒麟x86系统,我们的终端软件放上去后,总是采集不到音频,经定位发现,系统中有多个音频设备,但是默认的选用的音频设备采集不到声音,但选择一个USB的音频采集设备就可以采集到声音。
而我们的终端软件又没有提供音频采集,回放设备的选择功能。所以需要加入这个功能,终端软件需要跨平台,兼容windows与linux实在是比较繁琐。所以直接选用了PortAudio库,来屏蔽这些细节,将这些烦人的细节丢给PortAudio库去解决吧。

PortAudio is a free, cross-platform, open-source, audio I/O library. It lets you write simple audio programs in ‘C’ or C++ that will compile and run on many platforms including Windows, Macintosh OS X, and Unix (OSS/ALSA). It is intended to promote the exchange of audio software between developers on different platforms. Many applications use PortAudio for Audio I/O

PortAudio提供的采集,回放API的使用比较简单,看一下tutorials就知道怎么用了。

实现选择音频设备,第一步就是需要检索系统设备,这里有些细节需要注意。

设备检索

windows

windows下的音频设备API有几套,WASAPI,WDM,MME,DirectorSound

在PortAudio编译时有几个宏,如下图:

在这里插入图片描述

  1. 这几个宏设置了PortAudio支持哪套体系的API。这个差异会直接体现在设备检索时,设置了哪个就会检索出对应的支持的设备,设置多个也会列出多个。可以通过host api(可通过PortAudio的API获取)知道对应的设备支持哪一套体系,如下图所示,标红框的,host api是MME
    在这里插入图片描述

  2. 对设备名,如果有中文,不同体系的API检索时,设备名的编码格式也会不一样。比如设置了PA_USE_WMME=1检索的设备都是ANSI编码,而PA_USE_WASAPI=1则是UTF-8编码。

linux

linux下都是使用的alsa。设备检索时,使用PortAudio会检索出一大堆设备,并且有些设备名字很奇怪。这是因为PortAudio将系统中真实的声卡,虚拟设备全部检索了出来。检索的结果是 aplay/arecord -l和-L的和。

  1. 通过ALSA的alsa-utils中 aplay -l,检索真实回放设备
**** PLAYBACK 硬體裝置清單 ****
card 0: PCH [HDA Intel PCH], device 0: ALC3234 Analog [ALC3234 Analog]
  子设备: 1/1
  子设备 #0: subdevice #0
card 1: HDMI [HDA ATI HDMI], device 3: HDMI 0 [HDMI 0]
  子设备: 1/1
  子设备 #0: subdevice #0
card 1: HDMI [HDA ATI HDMI], device 7: HDMI 1 [HDMI 1]
  子设备: 1/1
  子设备 #0: subdevice #0

  1. 通过 通过ALSA的alsa-utils中aplay -L,检索所有的PCM回放设备

PCM是指:

A PCM device is something like an abstract soundcard. It can either be a hardware device or a PCM plugin layer device

  1. 通过PortAudio检索时,会检索所有的设备,包括真实的声卡设备和PCM设备
    在这里插入图片描述

如上图所示,检索出了12个设备,但是真实的声卡设备只有5个,它们的名字最后都有一个hw:X,Y的标识用于表明是哪个声卡的第几个设备,X–>Crad,Y–>Device。其它的设备都是虚拟设备,依托于真实设备。

如下图为虚拟设备:
在这里插入图片描述

其中 device #10是默认的采集及回放设备。它是个虚拟设备

设备选择

在PortAudio中如果不指定采集及回放设备,会采用默认的设备。指定设备时,只需在OpenStream中指定设备序号即可。

额外问题

在银河麒麟上遇到了这样一个问题,下面是检索出来的设备
在这里插入图片描述

默认设备名是 default,是个虚拟设备。支持采集和回放,支持8000采样率的采集及回放。我们的终端软件使用的采集回放参数是采样率为8k,声道为1。看参数是支持的,使用该设备进行回放时是有声音的,但是采集时却没声音? PortAudio的取数据时一直报错,或是取不到数据?一直找不到原因,但是在更新了声卡驱动后,又可以采集到声音了。那么这个是PortAudio的问题?还是驱动的问题?

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mo4776

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值