0

我们在使用 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, &timestamp);

返回变得毫无意义,并且 tv_sec 包含大约 4917 或 5013 的值,而不是合理的 time_t。我很想得出结论, tv_sec 值是自启动以来经过的时间,除了时间戳发生在启动后的几秒钟内。

哦,另一个细节。PCM_NONBLOCK 选项在我一直使用的 sdk 提供的 tinyalsa 版本中无法识别。所以我 git 克隆了 tinyalsa,构建了一个静态库,并升级到了最新最好的。我对 PCM_MMAP 的问题在两个版本中都存在。这一点,再加上寻找有同样问题的人的时间在很大程度上是失败的事实,让我相信这是关于我们的新产品而不是库的问题。

关于下一步该往哪里看有什么想法吗?

谢谢!

今天早上确认 pcm_readi() 中的 ioctl 正在接收正确的文件描述符 (4) 和周期大小 (256)。没有其他可能无效的论点

4

1 回答 1

0

好的,GPS 1PPS 测试显示时间戳精度约为 2-3 毫秒,这让我们对这种用法“足够”了(没有 PCM_MMAP):

tinyHandle = pcm_open( TINYALSA_CARD, TINYALSA_DEVICE, PCM_IN, &cfg );

这是让我陷入兔子洞的评论:

/** Returns available frames in pcm buffer and corresponding time stamp.
 * The clock is CLOCK_MONOTONIC if flag @ref PCM_MONOTONIC was specified in @ref pcm_open,
 * otherwise the clock is CLOCK_REALTIME.
 * For an input stream, frames available are frames ready for the application to read.
 * For an output stream, frames available are the number of empty frames available for the application to write.
 * Only available for PCMs opened with the @ref PCM_MMAP flag.
 * @param pcm A PCM handle.
 * @param avail The number of available frames
 * @param tstamp The timestamp
 * @return On success, zero is returned; on failure, negative one.
 */
int pcm_get_htimestamp(struct pcm *pcm, unsigned int *avail,
                       struct timespec *tstamp)

这是误导性的,因为它阻止了我在没有 PCM_MMAP 工作的情况下尝试 pcm_get_htimestamp() 调用。会有进一步的调查,如果我可以发布它们,我会的。

谢谢!

于 2018-08-07T17:23:47.570 回答