tinyalsa:pcm_start产生错误的文件编号错误

时间:2016-10-24 16:15:48

标签: c alsa tinyalsa

我正在尝试使用准系统来使用tinyalsa,但pcm_start总是失败,返回-1并将errno设置为9EBADF,即坏文件号)。在此之前调用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上。)

2 个答案:

答案 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.ccannot set hw params消息来自第865行,

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

params已从config初始化。在这个地方,我没有发言权。我最好的建议是在调试器中单步pcm_open,看看它对params的看法。