架构
音频软件架构高层次图示
以下是音频软件架构的主要组件:
PulseAudio
一个针对POSIX操作系统(主要是Linux)的声音服务器,充当硬件设备驱动程序和单个或多个主机上的应用程序之间的代理和路由器。
平台音频层(PAL)
提供更高层次的音频特定API,以访问底层音频硬件和驱动程序,从而基于TinyALSA API启用丰富的音频用例。
音频图管理器(AGM)
提供接口,允许基于TinyALSA的混音控制和PCM/压缩插件进行交互,以启用各种音频用例。
AudioReach图形服务(ARGS)
由图形服务层(GSL)、通用数据包路由器(GPR)和ACDB管理层(AML)模块组成。处理图形的初始化和创建,以及创建数据包以发送命令系列到SPF。
音频校准数据库(ACDB)
包含关于各种音频用例的信息,如用例图、模块校准数据等。APPS处理器解析ACDB文件,以检索SPF使用的用例图信息,以实例化用例。
信号处理框架(SPF)
在LPAI DSP上运行的模块化框架。提供设置、配置和执行音频用例信号处理模块的手段。
高通音频校准工具(QACT™平台)
基于PC的软件,提供用于音频系统设计师可视化、配置和存储音频图的图形用户界面(GUI),以便用于预期的音频用例。
API和例子APP
本节提供音频播放和录音功能的音频特定API和示例应用的高层次概述。
GStreamer
GStreamer是一个开源多媒体框架。高通将GStreamer插件作为QIMP SDK的一部分提供。
GStreamer 插件
- 音频解码器和编码器的 GStreamer 插件是 QIMSDK 的一部分。下载整个 QIMSDK 可以使用 pulsesrc 和 pulsesink。
- 高通智能多媒体产品 (QIMP) SDK 快速入门指南描述了如何下载和构建 QIMP SDK。
GStreamer 示例应用
音频用例的示例 GStreamer 应用是 QIMP SDK 的一部分。在运行示例应用之前,请确保满足以下前提条件。
有两种方法可以运行音频用例:
PulseAudio
PulseAudio是一个通用的声音服务器,旨在作为应用程序与硬件设备之间的中间件运行。
PulseAudio的源代码位于 build-qcom-wayland/workspace/sources/pulseaudio/opensource/pulseaudio。
以下是一些常用的PulseAudio API,完整的API描述请参见开源PulseAudio文档。
pa_stream_new
创建一个新的未连接流,指定名称和采样类型。
pa_stream* pa_stream_new (
pa_context * c,
const char *name,
const pa_sample_spec * ss,
const pa_channel_map *map)
参数
c:创建流的上下文
name:流的名称
ss:采样格式
map:通道映射,或为NULL以使用默认值
返回值
pa_stream* 句柄
pa_stream_get_state
返回流的当前状态。
pa_stream_state_t pa_stream_get_state(
const pa_stream *p)
参数
p:pa_stream handle
返回值
返回 pa_stream_state_t
pa_stream_get_device_name
返回该流连接到的服务器中的接收器或源的名称。
const char* pa_stream_get_device_name(const pa_stream *s)
参数
s:pa_stream handle
返回值
设备名称
pa_stream_connect_playback
将流连接到接收器。
int pa_stream_connect_playback (
pa_stream * s,
const char * dev,
const pa_buffer_attr *attr,
pa_stream_flags_t flags,
const pa_cvolume *volume,
pa_stream *sync_stream)
参数
s:要连接到接收器的流
dev:要连接的接收器名称,或为NULL以让服务器决定
attr:缓冲属性,或为NULL使用默认值
flags:附加标志,或为0使用默认值
volume:初始音量,或为NULL使用默认值
sync_stream:将此流与指定流同步,或为NULL表示独立流
返回值
成功时返回零。
pa_stream_connect_record
将流连接到源。
int pa_stream_connect_record(
pa_stream *s,
const char * dev,
const pa_buffer_attr * attr,
pa_stream_flags_t flags)
参数
s:要连接到源的流
dev:要连接的源名称,或为NULL以让服务器决定
attr:缓冲属性,或为NULL使用默认值
flags:附加标志,或为0使用默认值
返回值
成功时返回零。
pa_stream_write
将数据写入服务器(用于播放流)。
int pa_stream_write(
pa_stream * p,
const void * data,
size_t nbytes,
pa_free_cb_t free_cb,
int64_t offset,
pa_seek_mode_t seek)
参数
p:要使用的流
data:要写入的数据
nbytes:要写入的数据长度(字节)。必须是流的采样规格帧大小的倍数。
free_cb:数据的清理例程,或为NULL请求内部复制
offset:用于定位的偏移量。对于上传流,必须为0。必须是流的采样规格帧大小的倍数。
seek:定位模式。对于上传流,必须是PA_SEEK_RELATIVE。
返回值
成功时返回零。
pa_stream_set_write_callback
设置当新数据可能被写入流时调用的回调函数。
void pa_stream_set_write_callback(
pa_stream * p,
pa_stream_request_cb_t cb,
void *userdata)
参数
p:要使用的流
cb:要设置的回调函数
userdata:发送到回调的用户数据
返回值
无
pa_stream_set_read_callback
设置当流中有新数据可用时调用的回调函数。
void pa_stream_set_read_callback(
pa_stream * p,
pa_stream_request_cb_t cb,
void *userdata)
参数
p:要使用的流
cb:要设置的回调函数
userdata:发送到回调的用户数据
返回值
无
pa_stream_disconnect
将流从源/接收器断开。
int pa_stream_disconnect(pa_stream *s)
参数
s:pa_stream句柄
返回值
成功时返回零。
有关更多信息,请参见PulseAudio API文档。
基于PulseAudio的应用
PAREC应用程序从PulseAudio级别捕获音频。例如:
ssh root@ip-addr
setenforce 0
#pactl set-source-port regular2 handset-mic
#parec -v --rate=48000 --format=s16le --channels=1 --file-format=wav /opt/test.wav --device=regular2
支持的格式包括 s16le、s24le、s32le、s24-32le。采样率可以是 8000、16000、22050、24000、32000、44100、48000、88200、96000、17640、19200、35280 和 38400。
此示例从常规源捕获48 kHz、16位单声道音频,并将其保存为 /opt/test.wav 的 wav 文件。
paplay 应用程序从 PulseAudio 级别播放音频。
要进行播放,可以使用以下命令将 wav 文件推送到设备:
scp test.wav root@[ip-addr]:/data/
例如:
setenforce 0
#paplay /opt/test.wav -v
此示例以所有默认配置播放音频文件 /opt/test.wav。