我正在尝试使用准系统来使用tinyalsa,但pcm_start
总是失败,返回-1
并将errno
设置为9
(EBADF
,即坏文件号)。在此之前调用pcm_open
会返回非空指针,但会将errno
设置为22
。
似乎没有关于tinyalsa的文档,所以我无法理解我应该做什么。我的程序是基于alsa(不是tinyalsa)的一个例子,我已经阅读了tinyalsa的头文件。任何人都可以提供任何指导吗?
pcm * dev = pcm_open(1, 0, PCM_OUT, &config);
if (err = pcm_start(dev)) printf("err: %d\t errno: %d\n", err, errno);
(pastebin上提供完整代码。)
我从pcm_open
推断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上。)
答案 0 :(得分:3)
我是TinyALSA项目的维护者之一。
您应该错误检查您的代码。
这是您使用PCM结构正确检查故障的方法:
dev = pcm_open(1, 0, PCM_OUT, &config);
if (dev == NULL) {
/* memory allocation failure */
} else if (!pcm_is_ready(pcm)){
printf("error: pcm_open: %s\n", pcm_get_error(pcm));
}
这应该告诉你为什么TinyALSA无法打开你的设备。
如果这无法帮助调试您的问题,请在GitHub上提交问题并提供代码链接,pcm_open
后面的错误消息以及{{目录内容列表1}}。
此外,关于API的文档肯定是一项正在进行的工作。我在主分支中包含了有关错误检查/dev/snd
的信息。如果您需要进一步澄清某些内容,请为其创建一个问题!
由于
答案 1 :(得分:0)
现在查看pcm.c,cannot set hw params
消息来自第865行,
if (ioctl(pcm->fd, SNDRV_PCM_IOCTL_HW_PARAMS, ¶ms)) {
params
已从config
初始化。在这个地方,我没有发言权。我最好的建议是在调试器中单步pcm_open
,看看它对params
的看法。