Захват ALSA вызывает высокую загрузку процессора
Я пишу полнодуплексную программу ALSA и запускаю ее на встроенной системе на основе Linux. Его звуковые конфигурации:
- Частота дискретизации: 16 Гц
- Каналы: 1 (моно)
- Формат: S16_LE
- минимальная выгода: 160 (кадров)
Для приложений реального времени мне нужно захватывать звук каждые 10 мс, поэтому я установил минимальное значение 160.
Моя проблема: во время работы программы загрузка ЦП очень высока, что может быть 99,9% (по верхней команде). Иногда загрузка процессора низкая, но как только он достигает 99,9%, он не может вернуться к низкой загрузке процессора.
Я обнаружил, что это может быть проблема конфигурации. В файле asound.conf (см. Следующий код) я создал карту типа asym с именем "asym0", чтобы выбрать две разные подчиненные карты для воспроизведения и захвата.
Первоначально я использую "основной" в качестве устройства захвата, но это вызывает высокую загрузку процессора. Затем я создал карту типа тарифа с именем "rate0" и установил ее в качестве устройства захвата. Загрузка ЦП становится ниже, что составляет от 20% до 60%, но захваченный звук звучит плохо. Я слышал в своем голосе "po po po", когда тестировал микрофон (захват).
Так...
- Если я выберу "основной", загрузка процессора высока, но нет звука "po po po".
- Если я выберу "rate0", загрузка процессора будет ниже, но будет звучать "po po po".
Чем отличаются "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" }
Пожалуйста, кто-нибудь, помогите мне решить эту проблему. Спасибо!!!
0 ответов
Захват звука должен быть очень тривиальной задачей для ЦП, потому что большая часть этого происходит на кремниевом оборудовании, и иногда ему необходимо запустить поток для обработки входящего звука. Обычно, если ваши периоды или буферы очень малы, это потребует большего внимания ЦП и, вероятно, будет иметь переполнение. Переполнение может быть там, где происходит пропадание сигнала.
Если ваша частота дискретизации составляет 16 кГц, и вы снимаете каждые 10 мс, это действительно 160 кадров.
Некоторые вещи, на которые следует обратить внимание, - это то, меньше ли ваш период, чем 10 мс, выполняете ли вы обработку, которая очень тяжелая в вашем потоке.
Чтобы помочь вам, в gtkIOStream есть код, который реализует иерархию C++ OO ALSA. Вы можете посмотреть на это тестовое приложение ALSAFullduplex.C в качестве справочника и протестировать его, чтобы увидеть, есть ли у него те же проблемы, что и у вас.
Информация о создании gtkIOStream представлена в этом электронном письме:https://lists.audioinjector.net/pipermail/people/2020-March/000028.html