tinyalsa сроки и проблемы с PCM_MMAP

Мы на ARM64 Snapdragon с использованием кодека Qualcomm PM8916. Цель состоит в том, чтобы сэмплировать один канал со скоростью 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 не был распознан в версии tinyalsa, поставляемой вместе с SDK, который я использовал. Так что я git клонировал tinyalsa, создал статическую библиотеку и обновил до последней и самой лучшей версии. Проблема с PCM_MMAP сохраняется в обеих версиях. Это, в сочетании с тем фактом, что часы поиска людей с той же проблемой были в значительной степени провалом, заставляет меня поверить, что речь идет о нашем новом продукте, а не о библиотеках.

Есть мысли о том, где искать дальше?

Спасибо!

Сегодня утром подтвердил, что ioctl внутри pcm_readi() получает правильный дескриптор файла (4) и размер периода (256). Нет других аргументов, которые могли бы быть недействительными

1 ответ

Итак, тест 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_get_htimestamp() без работы PCM_MMAP. Будут дальнейшие исследования, и если я смогу опубликовать их, я сделаю.

Спасибо!

Другие вопросы по тегам