Я пытаюсь проследить путь установки параметров от пользовательского пространства linux (arecord / aplay) до драйвера ядра.Давайте возьмем в качестве примера arecords --period-size.
Все начинается в set_params
, функции в aplay.c
:
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 очень сложнымчитать и понимать. Возможно, мне не хватает некоторых знаний. Мой вопрос прост, как параметр пространства пользователя передается драйверу ядра. Можете ли вы указать программный путь, показывающий интерфейсы, называемые?
Спасибо.