我正在尝试一个基本程序来使用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);(在http://pastebin.com/dpRRq3Aq上有完整的代码。)
我从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上运行。)
发布于 2017-01-14 05:47:40
我是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后的错误消息以及/dev/snd中目录内容的列表。
另外,关于API的文档肯定是一项正在进行的工作。我在主分支中包含了有关错误检查pcm_open的部分。如果你需要进一步的澄清,请为它创造一个问题!
谢谢
发布于 2016-10-25 02:45:46
现在看看pcm.c,cannot set hw params消息来自第865行,
if (ioctl(pcm->fd, SNDRV_PCM_IOCTL_HW_PARAMS, ¶ms)) {params是从config初始化的。在这个地方我没有发言权。我最好的建议是在调试器中执行pcm_open并查看它对params的看法。
https://stackoverflow.com/questions/40223008
复制相似问题