Захват ALSA вызывает высокую загрузку ЦП

Я пишу полнодуплексную программу ALSA и запускаю ее на встроенной системе на базе Linux. Его звуковые конфигурации:

  • Частота дискретизации: 16 Гц
  • Каналы: 1 (моно)
  • Формат: S16_LE
  • мин. доступ: 160 (кадров)

Для приложения в реальном времени мне нужно записывать звук каждые 10 мс, поэтому я установил минимальное доступное значение на 160.

Моя проблема: во время работы программы очень высокая загрузка ЦП, которая может составлять 99,9% (по команде top). Иногда загрузка ЦП низкая, но как только она достигает 99,9%, она не может вернуться к низкой загрузке ЦП.

Я узнал, что это может быть проблема с конфигурацией. В файле asound.conf (см. его в следующем коде) я создал карту асиммированного типа с именем «asym0», чтобы выбрать две разные подчиненные карты для воспроизведения и захвата.

Первоначально я использую «основной» в качестве устройства захвата, но это вызывает высокую загрузку ЦП. Затем я создал карточку тарифного типа с именем «rate0» и установил ее в качестве устройства захвата. Загрузка ЦП становится ниже, которая колеблется между 20% ~ 60%, но захваченный звук звучит плохо. Я слышал в своем голосе какое-то «по-по-по», когда проверял микрофон (захват).

So...

  • Если я выберу "основной", загрузка ЦП будет высокой, но не будет слышно "по-по-по".
  • Если я выберу "rate0", загрузка ЦП будет ниже, но будет звучать "по-по-по".

Чем отличаются "type hw" и "type rate"?
Вызван ли эффект разной частотой прерывания?

файл asound.conf:

pcm.primary { type hw card mycard } pcm.rate0 { type rate slave { pcm "primary" rate 16000 } } pcm.asym0 { type asym playback.pcm "primary" capture.pcm "primary" or "rate0" }

Пожалуйста, помогите мне решить эту проблему. Спасибо!!!


person Tobby    schedule 09.03.2016    source источник
comment
Какие форматы/каналы/скорости на самом деле поддерживает ваше оборудование?   -  person CL.    schedule 09.03.2016
comment
Он поддерживает ширину выборки в 16/24-битных линейных, монофонических левых/правых или стереоканалах и 16 кГц и 48 кГц.   -  person Tobby    schedule 10.03.2016
comment
Пожалуйста, покажите вывод как arecord -v -fdat -c1 -D primary something.wav, так и arecord -v -fdat -c1 -D rate0 something.wav.   -  person CL.    schedule 10.03.2016


Ответы (1)


Захват звука должен быть очень тривиальной задачей для ЦП, потому что большая часть этого происходит на кремниевом оборудовании, и иногда ему нужно запускать поток для обработки входного звука. Как правило, если ваши периоды или буферы очень малы, это потребует больше внимания ЦП и, вероятно, будет переполнено. Переполнения могут быть причиной пропадания сигнала.

Если ваша частота дискретизации составляет 16 кГц, и вы снимаете каждые 10 мс, это действительно 160 кадров.

Некоторые вещи, на которые следует обратить внимание, это то, меньше ли ваш период, чем 10 мс, выполняете ли вы обработку, которая очень тяжелая в вашем потоке.

Чтобы помочь вам, в gtkIOStream есть код, реализующий C++ ОО Иерархия ALSA. Вы можете просмотреть это тестовое приложение ALSAFullduplex.C в качестве эталона и проверьте его, чтобы увидеть, страдает ли он теми же проблемами, что и вы.

Информация о сборке gtkIOStream приведена в этом письме: https://lists.audioinjector.net/pipermail/people/2020-March/000028.html

person Matt    schedule 26.03.2020