我们使用的是高通PM8916编解码器的ARM64 Snapdrag.目标是以48000 samps/秒的速度对单个通道进行采样,并使用高分辨率的时间戳。tinyalsa文档坚持我们必须使用PCM_MMAP。当我们这样做时,pcm_open()不会报错,但是pcm_readi()失败了,错误:22 ioctl()中的无效参数。
我认为与此相关的另一个症状是,当以这种形式调用pcm_open时(没有PCM_MMAP):
tinyHandle = pcm_open( TINYALSA_CARD, TINYALSA_DEVICE, PCM_IN, &cfg );音频流非常好(period=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值是自启动以来经过的时间,除非时间戳发生在启动后的几秒钟内。
哦,还有一个细节。在我一直使用的sdk附带的tinyalsa版本中,无法识别PCM_NONBLOCK选项。所以我用git克隆了tinyalsa,构建了一个静态库,并升级到了最新最好的版本。我在PCM_MMAP上遇到的问题在两个版本中都存在。这一点,再加上几个小时寻找有相同问题的人的事实在很大程度上是失败的,这让我相信这是关于我们的新产品的,而不是关于libs的。
对下一步该往哪里看有什么想法吗?
谢谢!
今天上午确认pcm_readi()中的ioctl正在接收正确的文件描述符(4)和周期大小(256)。没有其他可能无效的参数
发布于 2018-08-08 01:23:48
好的,GPS1PPS测试显示时间戳精度在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()调用。还会有进一步的调查,如果我能把它们贴出来,我会的。
谢谢!
https://stackoverflow.com/questions/51717155
复制相似问题