#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
.