tinyalsa: pcm_start выдает ошибку с неправильным номером файла

#c #alsa #tinyalsa

#c #alsa #tinyalsa

Вопрос:

Я пытаюсь в простой программе использовать tinyalsa, но pcm_start всегда терпит неудачу, возвращаясь -1 и устанавливая errno значение 9 ( EBADF , т. Е. неверный номер файла). Вызов pcm_open перед этим возвращает ненулевой указатель, но для него устанавливается errno значение 22 .

Похоже, документации по tinyalsa нет, поэтому у меня проблемы с пониманием того, что я должен делать. Я основал свою программу на примере из alsa (не tinyalsa), и я прочитал заголовочные файлы для tinyalsa. Кто-нибудь может дать какие-либо рекомендации?

 pcm * dev = pcm_open(1, 0, PCM_OUT, amp;config);
if (err = pcm_start(dev)) printf("err: %dt errno: %dn", err, errno);
  

(Полный код доступен на pastebin.)

Я вывожу значения для первых двух аргументов pcm_open from aplay --list-devices , которые выводят:

 **** List of PLAYBACK Hardware Devices ****
card 1: PCH [HDA Intel PCH], device 0: ALC3232 Analog [ALC3232 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
  

(Я компилирую и запускаю это на своей рабочей станции, а не на Android.)

Комментарии:

1. Очевидно, pcm_open произошел сбой. По какой-то причине выводите dev->error .

2. Спасибо @user58697 . Сообщение является cannot set hw params: Invalid argument . Если бы я использовал обычный alsa, я бы использовал слой ‘plugin’, но, похоже, здесь это не вариант, поэтому я все еще не знаю, что мне нужно изменить.

Ответ №1:

Я один из сопровождающих проекта TinyALSA.

Вам следует проверить этот ваш код на ошибку.

Вот как вы могли бы правильно проверить наличие сбоя в структуре PCM:

 dev = pcm_open(1, 0, PCM_OUT, amp;config);
if (dev == NULL) {
    /* memory allocation failure */
} else if (!pcm_is_ready(pcm)){
    printf("error: pcm_open: %sn", pcm_get_error(pcm));
}
  

И это должно объяснить вам, почему TinyALSA не смогла открыть ваше устройство.

Если это не помогает отладить вашу проблему, отправьте сообщение о проблеме на GitHub и включите ссылку на код, сообщение об ошибке после pcm_open и список содержимого каталога в /dev/snd .

Кроме того, документация по API, безусловно, находится в стадии разработки. Я включил немного о проверке ошибок pcm_open в главную ветку. Если вам нужны дополнительные разъяснения по чему-либо, пожалуйста, создайте для этого проблему!

Спасибо

Комментарии:

1. Спасибо. Жаль, что я не вспомнил, что здесь происходило. Сейчас у меня действительно работает tinyalsa.

2. @JellicleCat, проблема в вашем коде, которую я видел в pastebin, заключается в размере вашего периода и количестве периодов. Если я правильно помню, у нас есть программа под названием tinypcminfo, которая помогает определить, каковы допустимые параметры. Обычно для размера периода достаточно 1024, а для количества периодов достаточно 4. Но это зависит от того, что вы делаете со звуком.

3. есть ли какой-либо механизм, предоставляемый tinyalsa для сброса необработанных данных в файл? как и alsa-lib предоставляет файловый плагин для сброса данных в файл.

4. @VishalGupta, да. Вы можете использовать tinycap и использовать -- опцию для записи необработанных сэмплов в стандартный вывод. Затем просто перенаправьте стандартный вывод в файл, в который вы хотите поместить образцы. Например, tinycap -t 3 -- >audio.raw .

5. @tay10r извините, мой вопрос может быть неясен. Я ищу что-то похожее на «файловый плагин» alsa. в то время, когда я выполняю tinyplay, tinyplay также сбрасывает данные в файл при записи данных в PCM. один из способов, который я нашел, изменив файл pcm.c. но с библиотекой alsa мы можем сделать это, создав .asoundrc и файловый плагин, чтобы, когда мы выполняем aplay, он также сбрасывал данные в файл при записи на PCM-устройство.

Ответ №2:

Теперь, просматривая pcm.c, cannot set hw params сообщение приходит из строки 865,

     if (ioctl(pcm->fd, SNDRV_PCM_IOCTL_HW_PARAMS, amp;params)) {
  

params инициализируются из config . В этом месте я не имею права голоса. Моя лучшая рекомендация — pcm_open зайти в отладчик и посмотреть, что он думает по этому поводу params .