【问题标题】:are ALSA hw_params buffer sizes the physical card memory size?ALSA hw_params 缓冲区大小是物理卡内存大小吗?
【发布时间】:2013-12-10 19:40:30
【问题描述】:

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

问题 #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”接口而不是“plughw”接口,因此我无法设置缓冲区大小似乎是合理的,因为它实际上是卡上的物理内存量。

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

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

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

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

谢谢,

-安德烈斯

【问题讨论】:

    标签: c linux audio audio-recording alsa


    【解决方案1】:

    snd_pcm_hw_params_get_buffer_size() 返回的缓冲区大小不是(也从来不是)驻留在“声卡”上的内存大小。对于本地音频接口(例如,不是 USB 或 Firewire 等串行总线连接设备),这是系统主存储器中缓冲区的大小,音频样本的 DMA 周期性地发生在该缓冲区的大小。

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

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

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

    【讨论】:

    • 感谢您的回复。对我来说,关于 ALSA API 的一个令人困惑的方面是,如果有明确提供的应用程序级 API 例程来更改该参数,我假设参数可更改的。我观察到大小是可变的,这让我相信它一定是物理内存大小。再次感谢您澄清该缓冲区的实际含义。
    猜你喜欢
    • 2015-02-16
    • 2017-08-17
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    相关资源
    最近更新 更多