tinyalsa计时和PCM_MMAP问题

时间:2018-08-07 00:12:04

标签: audio codec qualcomm tinyalsa

我们使用的是Qualcomm PM8916编解码器,用于ARM64 Snapdragon。目标是以48000 amps / sec的速度采样单个通道,并使用高分辨率时间戳。 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值是自启动以来经过的时间,除了时间戳是在启动后几秒钟内发生的。

哦,还有一个细节。我一直在使用的sdk随附的tinyalsa版本中无法识别PCM_NONBLOCK选项。因此,我git克隆了tinyalsa,建立了一个静态库,并升级到最新的和最大的。我在PCM_MMAP中遇到的问题在两个版本中仍然存在。再加上寻找同一个问题的人的时间大半倒的事实,使我相信这与我们的新产品有关,与libs有关。

对接下来要去哪里有什么想法?

谢谢!

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

1 个答案:

答案 0 :(得分: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()调用。将会有进一步的调查,如果可以的话,我会公布。

谢谢!