0

我正在尝试使用 tinyalsa 的准系统程序,但pcm_start总是失败,返回-1并设置errno9( EBADF,即错误的文件号)。在此之前的调用pcm_open返回一个非空指针,但它设置errno22.

似乎没有有关 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我推断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 上。)

4

2 回答 2

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以及/dev/snd.

此外,有关 API 的文档绝对是一项正在进行的工作。pcm_open我在主分支中包含了有关错误检查的内容。如果您需要进一步澄清某些事情,请为它创建一个问题!

谢谢

于 2017-01-14T05:47:40.493 回答
0

现在查看pcm.ccannot set hw params消息来自第 865 行,

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

params从 初始化config。在这个地方我没有发言权。我最好的建议是进入pcm_open调试器并查看它的想法params

于 2016-10-25T02:45:46.733 回答