为了为我的 Linux PC 设置 USB 声卡,我开始学习 ALSA 和编写配置文件。经过一番努力,我终于能够编写一个并使其运行起来。以下是我.asoundrc
存储在我的主文件夹中的内容:
pcm.!default {
type plug
slave {
pcm "hw:1,0"
}
}
ctl.!default {
type hw
card 1
}
pcm_slave.maudiomtrackeight1 {
pcm "hw:1,0"
channels 8
rate 44100
buffer_size 4096
period_size 1024
}
pcm.outch1 {
type dshare
ipc_key 1111
slave maudiomtrackeight1
bindings [ 0 ]
hint.description "M-Audio M-Track Eight output/playback channel 1"
}
pcm.inch1 {
type dsnoop
ipc_key 1111
slave maudiomtrackeight1
bindings [ 0 ]
hint.description "M-Audio M-Track Eight input/capture channel 1"
}
pcm.outch2 {
type dshare
ipc_key 1111
slave maudiomtrackeight1
bindings [ 1 ]
hint.description "M-Audio M-Track Eight output/playback channel 2"
}
pcm.inch2 {
type dsnoop
ipc_key 1111
slave maudiomtrackeight1
bindings [ 1 ]
hint.description "M-Audio M-Track Eight input/capture channel 2"
}
pcm.outch3 {
type dshare
ipc_key 1111
slave maudiomtrackeight1
bindings [ 2 ]
hint.description "M-Audio M-Track Eight output/playback channel 3"
}
pcm.inch3 {
type dsnoop
ipc_key 1111
slave maudiomtrackeight1
bindings [ 2 ]
hint.description "M-Audio M-Track Eight input/capture channel 3"
}
pcm.outch4 {
type dshare
ipc_key 1111
slave maudiomtrackeight1
bindings [ 3 ]
hint.description "M-Audio M-Track Eight output/playback channel 4"
}
pcm.inch4 {
type dsnoop
ipc_key 1111
slave maudiomtrackeight1
bindings [ 3 ]
hint.description "M-Audio M-Track Eight input/capture channel 4"
}
pcm.outch5 {
type dshare
ipc_key 1111
slave maudiomtrackeight1
bindings [ 4 ]
hint.description "M-Audio M-Track Eight output/playback channel 5"
}
pcm.inch5 {
type dsnoop
ipc_key 1111
slave maudiomtrackeight1
bindings [ 4 ]
hint.description "M-Audio M-Track Eight input/capture channel 5"
}
pcm.outch6 {
type dshare
ipc_key 1111
slave maudiomtrackeight1
bindings [ 5 ]
hint.description "M-Audio M-Track Eight output/playback channel 6"
}
pcm.inch6 {
type dsnoop
ipc_key 1111
slave maudiomtrackeight1
bindings [ 5 ]
hint.description "M-Audio M-Track Eight input/capture channel 6"
}
pcm.outch7 {
type dshare
ipc_key 1111
slave maudiomtrackeight1
bindings [ 6 ]
hint.description "M-Audio M-Track Eight output/playback channel 7"
}
pcm.inch7 {
type dsnoop
ipc_key 1111
slave maudiomtrackeight1
bindings [ 6 ]
hint.description "M-Audio M-Track Eight input/capture channel 7"
}
pcm.outch8 {
type dshare
ipc_key 1111
slave maudiomtrackeight1
bindings [ 7 ]
hint.description "M-Audio M-Track Eight output/playback channel 8"
}
pcm.inch8 {
type dsnoop
ipc_key 1111
slave maudiomtrackeight1
bindings [ 7 ]
hint.description "M-Audio M-Track Eight input/capture channel 8"
}
虽然我能够掌握大部分概念,但我无法理解以下内容:
channels
:它代表音频通道号吗?就像我要使用单核细胞增多症或者立体声?假设我的声卡有 8 个输入端口和 8 个输出端口,如果我要使用单核细胞增多症配置我应该设置值 16 - 8 个输入 + 8 个输出或 8 - 8 个输入输出对(如果我要使用立体声配置中,我应该将值设置为 8 - 4 个输入 + 4 个输出还是 4 - 4 个输入-输出对)?buffer_size
:除了需要减小这些尺寸以确保更低的延迟之外,我什么都不知道。这到底是什么意思?period_size
:这又与延迟有关吗?bindings
:这些是将通道映射到端口的吗?为了单核细胞增多症我使用的配置[ <index_number> ]
。我可以[ <index_number1> <index_number2> ]
用于立体声配置也是如此?ipc_key
:我知道这是一个给定的唯一编号,对于从同一个从站定义的每个 PCM 设备来说都是相同的。假设我添加一个检测为 的新声卡hw:2,0
,并以与上述相同的方式继续定义 PCM 设备,我将必须为从新从设备定义的每个 PCM 设备分配一个不同的值(例如 2222)?
我可以尝试做一些实验来了解其余的内容,但仍然有一些东西无法清除。事实上,教程不多且缺乏良好的 ALSA 官方文档也无济于事。有人可以解释一下吗?
答案1
部分答案:
首先,我想说,您很可能根本不需要为 M-Track 编写配置。事实上,你设置的方式就是你的不大多数情况下都希望:您已将每个通道设置为单独的设备。这意味着当您尝试录制同时演奏的乐队时,可能会在通道(乐队成员)之间获得随机偏移,因为每个通道都是单独处理的。所以通常情况下,您只需将所有 8 个通道录制到单独的轨道中,然后将它们很好地同步并可以对其进行编辑。
如果您只想连接家庭 Hi-Fi 系统来播放音乐,情况也是如此:您需要左/右/中/低音炮/后置等的同步通道,而不是单独的设备。
我能想到的唯一情况是,如果出于某种原因,每个通道都连接到不同房间的扬声器,并且您想通过每个通道播放不同的音乐,那么制作单独的设备是否有意义。
此外,现代 ALSA 默认情况下会自动在硬件设备之上提供dshare
和dsnoop
插件,因此您无需明确指定它们。
也就是说,以下是解释:
channels
:同时录制/播放的通道数。 1 个用于单声道,2 个用于立体声,8 个用于您的卡。输入和输出是分开计算的,因此对于 8 个输入和 8 个输入通道,您只需说“8 个通道”即可。您设置设备inch
的方式outch
需要channels 1
为每个设备创建一个条目。bindings
:将从设备绑定的设备上的通道映射到该设备上的通道。假设您想通过在顶部放置一个插件来交换原始设备的左右声道,那么您会说bindings { 0 1 1 0 }
。ipc_key
:dmix
,dshare
并且dsnoop
插件允许多个客户端与单个源/接收器进行通信。此通信是通过此键完成的(IPC = 进程间通信)。因此,每个插件的密钥都需要不同,无论您是一个声卡有多个插件还是多个声卡每个插件都有一个插件,否则您会遇到麻烦。buffer_size
:音频数据在所谓的缓冲区中存储和传输,即用于存储多个样本的 RAM 块。如果将此方式设置得较高,则在处理数据之前将存储大量数据,因此会增加延迟。如果你把它设置得很低,处理的开销将阻止在下一个数据进入或必须输出之前处理所有数据,因此你会出现音频丢失。period_size
: 不知道。
还描述了所有 ALSA PCM 插件这里详细。
除非你真的知道自己在做什么,否则buffer_size
不要乱搞。period_size
如果延迟对您来说很重要(例如,如果您想使用计算机进行现场表演),那么首先要做的就是确保卸载 Pulseaudio,并将其用于jackd
所有音频。仅当你仍然遇到明显的延迟问题,您可以尝试不同的值buffer_size
。
答案2
本文对缓冲区和周期的关系有一个简短的解释:
声卡具有存储录制样本的硬件缓冲区。当缓冲区足够满时,它[声卡?]会生成一个中断。然后,内核声音驱动程序使用直接内存访问 (DMA) 将样本传输到内存中的应用程序缓冲区。 [...] 缓冲区可能非常大,并且在一次操作中传输它可能会导致不可接受的延迟,称为延迟。为了解决这个问题,ALSA 将缓冲区分成一系列周期(在 OSS/Free 中称为片段),并以周期为单位传输数据。
这听起来像:
- 音频样本存储在缓冲区中
- 内核将音频样本从缓冲区复制到应用程序内存
- 缓冲区可能太大而无法在一份副本中传输(导致延迟)
- 缓冲区被分段复制,称为
period
s
文章提供了一个图表。