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