我们在使用 Qualcomm PM8916 编解码器的 ARM64 Snapdragon 上。目标是以 48000 样本/秒的速度对单个通道进行采样,并使用高分辨率时间戳。tinyalsa 文档坚持我们必须使用 PCM_MMAP。当我们这样做时,pcm_open() 不会抱怨,但 pcm_readi() 失败 errno:22 ioctl() 中的参数无效。
我认为相关的另一个症状是,当以这种形式调用 pcm_open 时(没有 PCM_MMAP):
tinyHandle = pcm_open( TINYALSA_CARD, TINYALSA_DEVICE, PCM_IN, &cfg );
音频非常流畅(周期=256),与文档相反,pcm_get_htimestamp() 返回值很好。不确定时间有多准确,但明天我将注入 GPS 1PPS 并进行标准测试以弄清楚这一点。但是当我按照说明使用 PCM_MMAP 时,例如:
tinyHandle = pcm_open( TINYALSA_CARD, TINYALSA_DEVICE, PCM_IN | PCM_MMAP | PCM_MONOTONIC | PCM_NOIRQ, &cfg );
或者
tinyHandle = pcm_open( TINYALSA_CARD, TINYALSA_DEVICE, PCM_IN | PCM_MMAP | PCM_NONBLOCK, &cfg );
如上所述,读取失败。我还没有尝试过所有可能的组合,但这即将到来。奇怪的是,每当指定 PCM_MMAP 时,时间戳
int err = pcm_get_htimestamp( tinyHandle, &available, ×tamp);
返回变得毫无意义,并且 tv_sec 包含大约 4917 或 5013 的值,而不是合理的 time_t。我很想得出结论, tv_sec 值是自启动以来经过的时间,除了时间戳发生在启动后的几秒钟内。
哦,另一个细节。PCM_NONBLOCK 选项在我一直使用的 sdk 提供的 tinyalsa 版本中无法识别。所以我 git 克隆了 tinyalsa,构建了一个静态库,并升级到了最新最好的。我对 PCM_MMAP 的问题在两个版本中都存在。这一点,再加上寻找有同样问题的人的时间在很大程度上是失败的事实,让我相信这是关于我们的新产品而不是库的问题。
关于下一步该往哪里看有什么想法吗?
谢谢!
今天早上确认 pcm_readi() 中的 ioctl 正在接收正确的文件描述符 (4) 和周期大小 (256)。没有其他可能无效的论点