【发布时间】: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