![禁用内核空间的 ALSA 重采样](https://linux22.com/image/212948/%E7%A6%81%E7%94%A8%E5%86%85%E6%A0%B8%E7%A9%BA%E9%97%B4%E7%9A%84%20ALSA%20%E9%87%8D%E9%87%87%E6%A0%B7.png)
我目前正在开发一个声卡项目,该声卡由 ~12 Mhz 时钟和 ~24Mhz 时钟驱动来播放 44.1 和 48khz 音频。我使用 GPIO 切换这些时钟。这意味着我不希望发生任何重采样。我的问题是:有什么方法可以禁用内核空间的重采样吗?
我知道如何使用 asoundrc.conf 从用户空间禁用它,但我更喜欢从内核空间执行此操作,因为我不希望任何用户能够更改此配置文件,从而启用/禁用重采样,甚至 root 也不行。
谢谢
答案1
默认情况下,ALSA 不会重新采样,特别是内核驱动程序不会重新采样。
因此,无法禁用内核空间中的重采样。
ALSA 通过插件进行重采样(在用户空间中,rate
或plug
)。 ALSA 默认情况plug
下提供非重采样hw
,我想可能有一种方法可以配置 ALSA 默认情况下不这样做,但它可能会影响所有声卡。
但我更愿意从内核空间执行此操作,因为我不希望任何用户能够更改此配置文件,从而启用/禁用重采样,甚至 root 也不行。
他们只需使用正确的设备来避免重新采样,无需更改其配置。而且,这是用户的决定,而不是您的决定。
最后,Pulseaudio 在各处进行重新采样,并且相当多的用户会在 ALSA 之上运行 Pulseaudio。
虽然它是一个插件,但 ALSA 确实告诉该插件默认重新采样。
不,事实并非如此。该插件rate
专门用于重新采样,并且该插件与其他插件一起plug
使用。 rate
“ALSA 告诉插件重新采样”的想法是完全错误的。
我需要知道内核在哪里决定输出哪种比特率。
所有 ALSA 内核驱动程序都指定了这一点。
最后,这不是用户决定的,它是一个 Hi-Fi 流媒体设备。
但构建他想要的任何插件链是用户的决定。包括重采样。如果我想重新采样,而你以某种方式阻止我这样做(你实际上不能),作为用户我会非常生气。
我有一个需要激活的开关时钟。这也意味着我需要告诉 ALSA 编解码器的系统频率已更改。
没关系,您可以通过查看获得的比特率在内核中执行此操作。您不必担心重新采样。
你的回答并没有真正帮助我......
我认为你误解了一些基本概念,我希望能让它们更清楚一些。如果你仍然坚持以某种方式“禁用内核中 ALSA 的重采样”:我祝你一切顺利,但我只能强烈建议尝试理解它是如何工作的,那么你会发现这是没有意义的。
您正在谈论用户空间,这与我的用例无关。
您正在谈论重采样,这与内核空间无关。重采样仅发生在用户空间中。
当频率改变时,不可能告诉 ALSA 切换 GPIO,
当然如此。内核模块通告支持的比特率。您可以根据音频发送到内核模块时获得的比特率来设置 GPIO。也就是说,如果您的 GPIO 选择 12 MHz 播放 44.1kHz 音频,选择 24 MHz 播放 48kHz 音频,并且您不会处于相反的情况,即 12/24 MHz 的变化超出了您的控制范围,那么您必须相应地调整音频播放。
如果你是后一种情况,那就没有什么好的解决办法了。 ALSA 不希望硬件音频输出在音频播放过程中改变其比特率。
这意味着我还需要告诉内核空间中的所有驱动程序频率已更改(MCASP、声音编解码器、PCM)
那么你是否处于相反的情况呢?因为这是我能想到这个要求有意义的唯一情况。
那么我想,如果您坚持不重新采样,您能做的最好的事情就是从当前音频流中出错,将新的比特率宣传为唯一的比特率,并依靠用户空间重新启动音频。这应该是可行的,因为它是一个嵌入式系统,并且您完全控制用户空间(所有这些信息首先应该是问题的一部分)。
但对实际问题和问题情况的良好描述确实会有帮助。