首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tinyalsa计时和PCM_MMAP的问题

tinyalsa计时和PCM_MMAP的问题
EN

Stack Overflow用户
提问于 2018-08-07 08:12:04
回答 1查看 620关注 0票数 0

我们使用的是高通PM8916编解码器的ARM64 Snapdrag.目标是以48000 samps/秒的速度对单个通道进行采样,并使用高分辨率的时间戳。tinyalsa文档坚持我们必须使用PCM_MMAP。当我们这样做时,pcm_open()不会报错,但是pcm_readi()失败了,错误:22 ioctl()中的无效参数。

我认为与此相关的另一个症状是,当以这种形式调用pcm_open时(没有PCM_MMAP):

代码语言:javascript
复制
tinyHandle = pcm_open( TINYALSA_CARD, TINYALSA_DEVICE, PCM_IN, &cfg );

音频流非常好(period=256),与文档相反,pcm_get_htimestamp()返回值也很好。不确定时间是否准确,但明天我将注入GPS 1PPS,并做我的标准测试来弄清楚这一点。但当我按照说明使用PCM_MMAP时,例如:

代码语言:javascript
复制
tinyHandle = pcm_open( TINYALSA_CARD, TINYALSA_DEVICE, PCM_IN | PCM_MMAP | PCM_MONOTONIC | PCM_NOIRQ, &cfg );

代码语言:javascript
复制
tinyHandle = pcm_open( TINYALSA_CARD, TINYALSA_DEVICE, PCM_IN | PCM_MMAP | PCM_NONBLOCK, &cfg );    

如上所述,读取失败。我还没有尝试所有可能的组合,但它即将到来。奇怪的是,每当指定PCM_MMAP时,

代码语言:javascript
复制
int err = pcm_get_htimestamp( tinyHandle, &available, &timestamp);

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

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

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

谢谢!

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

EN

回答 1

Stack Overflow用户

发布于 2018-08-08 01:23:48

好的,GPS1PPS测试显示时间戳精度在2-3毫秒的数量级,这让我们“足够”使用这种用法(没有PCM_MMAP):

代码语言:javascript
复制
tinyHandle = pcm_open( TINYALSA_CARD, TINYALSA_DEVICE, PCM_IN, &cfg );

下面是让我陷入困境的评论:

代码语言:javascript
复制
/** 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()调用。还会有进一步的调查,如果我能把它们贴出来,我会的。

谢谢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51717155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档