使用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
    使用PortAudio检索设备_第1张图片

  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设备
    使用PortAudio检索设备_第2张图片

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

如下图为虚拟设备:
使用PortAudio检索设备_第3张图片

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

设备选择

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

额外问题

在银河麒麟上遇到了这样一个问题,下面是检索出来的设备
使用PortAudio检索设备_第4张图片

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

你可能感兴趣的:(音频参数设置)