【发布时间】:2019-10-12 13:21:23
【问题描述】:
我尝试按照从 linux 用户空间 (arecord/aplay) 到内核驱动程序的参数设置路径。我们以 arecords --period-size 为例。
一切都始于aplay.c中的set_params函数:
if (period_time > 0)
err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, 0);
else
err = snd_pcm_hw_params_set_period_size_near(handle, params, &period_frames, 0);
函数 snd_pcm_hw_params_set_period_size_near() 定义在 [pcm.c : 5186](alsa-lib https://github.com/alsa-project/alsa-lib/blob/master/src/pcm/pcm.c#L5186) 中,我的头疼开始了……这个函数启动了对其他函数的调用链对我来说很有意义,似乎并没有导致司机的任何结束。
有_end 标签,所以我跳过了snd_pcm_hw_param_set_min() 或snd_pcm_hw_param_set_max() 之类的所有调用,然后转到snd_pcm_hw_param_set_last(),希望调用一些驱动程序,例如:
drv->hw_params_set(...);
但我找到了一个结束调用:
MASK_INLINE unsigned int snd_mask_min(const snd_mask_t *mask)
{
int i;
assert(!snd_mask_empty(mask));
for (i = 0; i < MASK_SIZE; i++) {
if (mask->bits[i])
return ffs(mask->bits[i]) - 1 + (i << 5);
}
return 0;
}
其中返回值应为参数集。
总而言之,我发现 alsa-lib 很难阅读和理解。也许我缺乏一些知识。我的问题很简单,用户空间参数如何传递给内核驱动程序。能否提供一个显示接口的软件路径?
谢谢。
【问题讨论】: