Как с помощью ALSA записать с помощью микрофона то, что он просто воспроизводит через динамик?

Я пытаюсь записать, что он просто воспроизводит для говорящего, используя следующие API ALSA:

snd_pcm_mmap_writei()
snd_pcm_mmap_readi()

Обе функции вызываются одна за другой в одном потоке. Функция writei () возвращается быстро (я считаю, что она возвращается, когда становится доступен буфер воспроизведения), в то время как readi () возвращается до тех пор, пока не будут захвачены назначенные выборки. Но отснятые сэмплы - это не то, что только что разыгралось. Я предполагаю, что ALSA не находится в дуплексном режиме, то есть сначала нужно закончить воспроизведение, а затем начать запись, которая не записывает ничего значимого, а просто щелкает. Динамик по-прежнему воспроизводит звук правильно.

Все параметры HW / SW настроены правильно. Если я буду делать только звукозаписи, я получу хорошую звуковую волну. Дескрипторы PCM открываются в обычном режиме (не в неблочном, не в асинхронном).

У кого-нибудь есть предложения, как заставить эту работу?


person Tianhua Chu    schedule 13.04.2013    source источник
comment
Вам необходимо настроить звуковое оборудование для маршрутизации звука с устройства воспроизведения обратно на устройство захвата. Ты сделал это?   -  person CL.    schedule 13.04.2013
comment
Моя цель - проверить, правильно ли работает мой динамик, поэтому мне нужно уловить звук из речи. Таким образом, петля от воспроизведения к захвату не настраивается.   -  person Tianhua Chu    schedule 15.04.2013
comment
Почему вы делаете это в одной программе? Разве вы не можете просто запустить aplay и arecord?   -  person CL.    schedule 15.04.2013
comment
Да, aplay и arecord определенно работают, но мне нужно разрешить моему приложению использовать буферы для обнаружения сбоя динамика на ходу. И я обнаружил, что эти два API ALSA необходимо поместить в разные потоки, чтобы синхронизировать их, что по-прежнему сложно захватить звук с того момента, когда он воспроизводится.   -  person Tianhua Chu    schedule 16.04.2013


Ответы (1)


Вам не нужно использовать mmap функции; обычных _2 _ / _ 3_ вызовов достаточно.

Чтобы обрабатывать два потока PCM одновременно, запустите их в отдельных потоках или используйте неблокирующий режим, чтобы один и тот же цикл обработки событий мог обрабатывать оба устройства.

Вам необходимо заполнить буфер воспроизведения перед воспроизведением данных, а данные захвата могут быть прочитаны только после заполнения буфера захвата, поэтому общая задержка - это размер буфера воспроизведения плюс размер периода захвата плюс любые аппаратные задержки и задержки распространения звука. .

person CL.    schedule 16.04.2013