gpt4 book ai didi

c - ALSA hw_params 缓冲区大小是物理卡内存大小吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:57 24 4
gpt4 key购买 nike

我正在尝试加快 ALSA API 的速度,并且对这个广泛的 API 有一些疑问。我使用的是“hw”接口(interface)而不是“plughw”接口(interface)。

问题 #1:snd_hw_params_any() 例程是否检索默认/当前参数?一些文档/示例代码表明此例程使用一些值填充分配的 snd_pcm_hw_params_t 结构。这些是 card:device 当前配置的设置吗?

我感到困惑的原因是,如果该例程检索 hw_params 值,那么我应该能够使用 任何 snd_hw_params_get 例程来实际获取这些值。这适用于 snd_hw_params_get_channels() 例程。但是调用 snd_pcm_hw_params_get_format() 或 snd_pcm_hw_params_get_buffer_size() 将失败。如果我首先使用 set 例程设置格式或缓冲区大小,然后我可以调用 get 例程来检索值而不会出错。表达这个问题的另一种方式是:当我使用这个调用序列时,为什么 snd_pcm_hw_params_get_format() 和 snd_pcm_hw_parmas_get_buffer_size() 会失败:

snd_pcm_hw_params_alloca();snd_pcm_hw_params_any();snd_pcm_hw_params_get_channels();snd_pcm_hw_params_get_format();snd_pcm_hw_params_get_buffer_size();

问题 #2:如何确定声卡上物理内存的实际大小?我注意到,无论我在调用 snd_pcm_hw_params_set_buffer_size/min/max() 时使用什么大小,然后调用 snd_pcm_hw_params_get_buffer_size() ,我都会得到相同的大小。同样,我使用的是“hw”接口(interface)而不是“plughw”接口(interface),所以我不能设置缓冲区大小似乎是合理的,因为它实际上是卡上的物理内存量。

由于 snd_pcm_hw_params_get_buffer_size() 检索帧大小,因此声卡上可用物理捕获内存的实际大小将是帧大小乘以 channel 数乘以样本字长。例如:

int nNumberOfChannels = 2;snd_pcm_format_t tFormat = SND_PCM_FORMAT_S16;//每个样本 2 个字节snd_pcm_uframes_t = 16384;

那么卡上的实际物理内存将是:2 * 2 * 16384 = 65536 字节卡上可用的物理内存。

这是正确的还是我在这里感到困惑?

谢谢,

-安德烈斯

最佳答案

snd_pcm_hw_params_get_buffer_size() 返回的缓冲区大小不是(也从来不是)“声卡”上的内存大小。在本地音频接口(interface)的情况下(例如,不是串行总线连接设备,如 USB 或 Firewire),这是系统主内存中缓冲区的大小,音频样本的 DMA 定期发生。

对于 USB 和 Firewire 音频,这里指的缓冲区完全是一个软件概念——尽管在 Firewire 的情况下它可能是 DMAd。不要期望能够将缓冲区大小设置为低于最小同步传输单元大小。

我认为您无法从 ALSA 获得任何可以实际更改这些参数的保证——这取决于为音频接口(interface)提供服务的 DMA Controller 中硬件的限制——以及它的设备驱动程序。缓冲区大小为 2 的幂的安排并不罕见,因为它在硬件中更容易实现。

你应该非常小心地检查调用 snd_pcm_hw_* API 调用的返回值,而不是假设你得到了你所请求的。

关于c - ALSA hw_params 缓冲区大小是物理卡内存大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20203926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com