gpt4 book ai didi

audio - tinyalsa 时序和 PCM_MMAP 的问题

转载 作者:行者123 更新时间:2023-12-03 01:37:08 34 4
gpt4 key购买 nike

我们在使用 Qualcomm PM8916 编解码器的 ARM64 Snapdragon 上。目标是以 48000 样本/秒的速度对单个 channel 进行采样,并使用高分辨率时间戳。 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() 返回值很好。不确定时间有多准确,但明天我将注入(inject) 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)。没有其他可能无效的论点

最佳答案

好的,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() 调用。会有进一步的调查,如果我可以发布它们,我会的。

谢谢!

关于audio - tinyalsa 时序和 PCM_MMAP 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51717155/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com