004_音频开发_基础篇_ALSA插件使用
文章目录
- 004_音频开发_基础篇_ALSA插件使用
-
- 创作背景
- [`/etc/asound.conf` 示例分析](#
/etc/asound.conf
示例分析) -
- 默认设备/默认控制器/`plug`插件
- [`softvol` 插件](#
softvol
插件) - 采样率转换插件
- pcm.audio_processing
创作背景
学历代表过去、能力代表现在、学习力代表将来。 一个良好的学习方法是通过输出来倒逼自己输入。写博客既是对过去零散知识点的总结和复盘,也是参加了 零声教育 写博客活动。
零声教育体验课:https://xxetb.xetslk.com/s/3fbO81
本文是开发过程中的知识点总结,供大家学习交流使用,如有任何错误或不足之处,请在评论区指出。
/etc/asound.conf
示例分析
如下为我的设备的 ALSA
配置文件:
shell
defaults.pcm.rate_converter "speexrate_medium"
pcm.!default{
type plug
slave.pcm "softvol"
slave.rate 48000
# slave.pcm both
}
ctl.!default{
type hw
card 0
}
pcm.softvol {
type softvol
# slave.pcm "rate_convert_to_48k"
# slave.pcm "both"
slave.pcm "dmixer_loopback"
# slave.pcm pcm_out1_file
control {
name "Master"
card 0
}
min_dB -32.0
max_dB 0.0
resolution 100
}
pcm.rate_convert_to_48k {
type rate
# slave.pcm "dmixer_loopback"
slave.pcm "both"
slave.rate 48000
converter "speexrate_medium"
}
pcm.dmixer_loopback {
type dmix
ipc_key 556670
slave {
pcm "hw:Loopback,0,0"
period_time 0
period_size 1024
buffer_size 8192
rate 48000
format S32_LE
}
}
ctl.dmixer_loopback {
type hw
card Loopback
}
pcm.loopback_capture {
type hw
card Loopback
device 1
subdevice 0
}
pcm.audio_processing {
type asym
playback.pcm "both_plug"
capture.pcm "loopback_capture"
}
pcm.pcm_out1_file {
type file
slave.pcm "both"
file "/data/pcm-%r-%c-%b-%f.wav" format "wav"
}
pcm.both_plug {
type plug
slave.pcm "both"
}
pcm.both {
type route
slave.pcm {
type multi
slaves {
a.pcm "hw:0,1"
b.pcm "hw:0,3"
a.channels 2
b.channels 2
}
bindings {
0.slave a
0.channel 0
1.slave a
1.channel 1
2.slave b
2.channel 0
3.slave b
3.channel 1
}
}
ttable.0.0 1
ttable.1.1 1
ttable.0.2 1
ttable.1.3 1
}
pcm.dmixer_out_i2s {
type dmix
ipc_key 8459
ipc_key_add_uid true
slave {
pcm "hw:0,1"
format S32_LE
}
}
pcm.dmixer_out_spdif {
type dmix
ipc_key 6532
ipc_key_add_uid true
slave {
pcm "hw:0,3"
format S32_LE
}
}
默认设备/默认控制器/plug
插件
shell
pcm.!default{
type plug
slave.pcm "softvol"
slave.rate 48000
# slave.pcm both
}
ctl.!default{
type hw
card 0
}
- 第一部分定义了默认的
PCM
(音频输出)设备。使用了一个插件类型为plug
的PCM
设备,用于对其他PCM
设备进行包装和处理。指定了子PCM
设备为softvol
,同时设置了音频采样率为48000 Hz
。 - 第二部分定义了默认的控制设备。指定了控制设备的类型为硬件(
hw
),并将card
设定为0
。这表示默认的控制设备将使用系统中的第一个硬件设备作为其card
。
softvol
插件
pcm.softvol {
type softvol
slave.pcm "rate_convert_to_48k"
slave.pcm "both"
slave.pcm "dmixer_loopback"
slave.pcm pcm_out1_file
control {
name "Master"
card 0
}
min_dB -32.0
max_dB 0.0
resolution 100
}
- 定义了一个名为
softvol
的PCM
设备。用软件音量控制的插件softvol
。 - 注释的
# slave.pcm "rate_convert_to_48k"
把音频传入到rate_convert_to_48k
虚拟设备,进行采样率转换(需要时使用)。 - 注释的
# slave.pcm "both"
直接输出到both
虚拟设备,both
再路由到2
个物理声卡设备。 slave.pcm "dmixer_loopback"
输出到loopback
虚拟声卡设备,供应用程序从loopback
再次读出。# slave.pcm pcm_out1_file
用于把音频直接写入到文件。- 控制设备的名称为
"Master"
,card
设定为0
。音量范围从-32.0
分贝到0.0
分贝,总共16
级,分辨率为100
(默认的设置范围为0-255
, 根据项目修改)。 - 这个插件在系统启动后,不会马上自动创建,需要使用声卡的时候,才创建,所以在用
Master
控制音量前要先打开一下声卡。
采样率转换插件
shell
pcm.rate_convert_to_48k {
type rate
# slave.pcm "dmixer_loopback"
slave.pcm "both"
slave.rate 48000
converter "speexrate_medium"
}
- 这个部分定义了一个名为
rate_convert_to_48k
的PCM
设备,用于进行音频采样率的转换。 - 用了一个
rate
类型的插件。设置了音频采样率为48000 Hz
,指定了转换算法为speexrate_medium
。
shell
pcm.both {
type route
slave.pcm {
type multi
slaves {
a.pcm "hw:0,1"
b.pcm "hw:0,3"
a.channels 2
b.channels 2
}
bindings {
0.slave a
0.channel 0
1.slave a
1.channel 1
2.slave b
2.channel 0
3.slave b
3.channel 1
}
}
ttable.0.0 1
ttable.1.1 1
ttable.0.2 1
ttable.1.3 1
}
pcm.dmixer_out_i2s {
type dmix
ipc_key 8459
ipc_key_add_uid true
slave {
pcm "hw:0,1"
format S32_LE
}
}
pcm.dmixer_out_spdif {
type dmix
ipc_key 6532
ipc_key_add_uid true
slave {
pcm "hw:0,3"
format S32_LE
}
}
定义了一个名为 both
的 PCM
设备,它是一个路由 (route
) 类型的 PCM
设备。
它的作用是将音频数据路由到2
个硬件设备上。
在这个配置中,使用了一个多声道 (multi
) 类型的 slave.pcm
,指定了两个子 PCM
设备:hw:0,1
和 hw:0,3
,分别对应着系统中的两个硬件设备。每个子 PCM
设备都配置了两个声道 (channels
),分别为 2
。bindings
部分定义了声道的路由关系,比如第一个声道 (0.channel
) 从第一个子 PCM
设备 (a
) 的第一个声道 (0.slave a
) 获取音频数据,第二个声道 (1.channel
) 从第一个子 PCM
设备 (a
) 的第二个声道 (1.slave a
) 获取音频数据,以此类推。ttable
部分定义了混音比例,例如 ttable.0.0 1
表示第一个声道的输出比例为 1
。
pcm.audio_processing
shell
pcm.audio_processing {
type asym
playback.pcm "both_plug"
capture.pcm "loopback_capture"
}
这部分定义了一个名为 audio_processing
的 PCM
设备,它是一个异步 (asym
) 设备。异步设备允许单独配置播放和捕获功能。在这个配置中,设置了播放音频数据传递给 both_plug
PCM
设备,即将处理后的音频数据输出到 both_plug
设备。捕获音频数据来自于 loopback_capture
PCM 设备,即从 loopback_capture
设备捕获音频数据进行处理。这样可以对输入和输出音频进行分开的处理和配置。