了解 .asoundrc 中的“channels”、“buffer_size”、“period_size”、“bindings”和“ipc_key”代表什么

了解 .asoundrc 中的“channels”、“buffer_size”、“period_size”、“bindings”和“ipc_key”代表什么

为了为我的 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 默认情况下会自动在硬件设备之上提供dsharedsnoop插件,因此您无需明确指定它们。

也就是说,以下是解释:

  • channels:同时录制/播放的通道数。 1 个用于单声道,2 个用于立体声,8 个用于您的卡。输入和输出是分开计算的,因此对于 8 个输入和 8 个输入通道,您只需说“8 个通道”即可。您设置设备inch的方式outch需要channels 1为每个设备创建一个条目。

  • bindings:将从设备绑定的设备上的通道映射到该设备上的通道。假设您想通过在顶部放置一个插件来交换原始设备的左右声道,那么您会说bindings { 0 1 1 0 }

  • ipc_key: dmixdshare并且dsnoop插件允许多个客户端与单个源/接收器进行通信。此通信是通过此键完成的(IPC = 进程间通信)。因此,每个插件的密钥都需要不同,无论您是一个声卡有多个插件还是多个声卡每个插件都有一个插件,否则您会遇到麻烦。

  • buffer_size:音频数据在所谓的缓冲区中存储和传输,即用于存储多个样本的 RAM 块。如果将此方式设置得较高,则在处理数据之前将存储大量数据,因此会增加延迟。如果你把它设置得很低,处理的开销将阻止在下一个数据进入或必须输出之前处理所有数据,因此你会出现音频丢失。

  • period_size: 不知道。

还描述了所有 ALSA PCM 插件这里详细。

除非你真的知道自己在做什么,否则buffer_size不要乱搞。period_size如果延迟对您来说很重要(例如,如果您想使用计算机进行现场表演),那么首先要做的就是确保卸载 Pulseaudio,并将其用于jackd所有音频。仅当你仍然遇到明显的延迟问题,您可以尝试不同的值buffer_size

答案2

本文对缓冲区和周期的关系有一个简短的解释:

声卡具有存储录制样本的硬件缓冲区。当缓冲区足够满时,它[声卡?]会生成一个中断。然后,内核声音驱动程序使用直接内存访问 (DMA) 将样本传输到内存中的应用程序缓冲区。 [...] 缓冲区可能非常大,并且在一次操作中传输它可能会导致不可接受的延迟,称为延迟。为了解决这个问题,ALSA 将缓冲区分成一系列周期(在 OSS/Free 中称为片段),并以周期为单位传输数据。

这听起来像:

  • 音频样本存储在缓冲区中
  • 内核将音频样本从缓冲区复制到应用程序内存
  • 缓冲区可能太大而无法在一份副本中传输(导致延迟)
  • 缓冲区被分段复制,称为periods

文章提供了一个图表

相关内容