LINUX.ORG.RU

Синхронизация в ALSA


0

1

Несколько раз просмотрел API ALSA, но так и не нашел, как же сделать ожидание завершения вывода данных из буфера потока.

Моему приложению необходимо не просто набросать данные для воспроизведения и заврешить работу, а выводить звук фрагментами, причем к моменту вывода следующего фрагмента предыдущий должен быть полностью озвучен/проигран, но между фрагментами не должно быть никаких пауз. С помощью каких функций можно заставить программу остановиться (желательно так, чтобы отдать время другим процессам) до тех пор, пока предыдущий фрагмент не будет выведен целиком?

Пробовал делать drain(), затем prepare() и start(). Как синхронизация это работает, но видимо из-за вызовов stop() и start() появляются щелчки. Можно как-нибудь сделать drain() но так, чтобы не он не вызывал stop() для потока вывода?

не понимаю чего тебе надо
пусть есть у тебя 2 буфера с данными (2 фрагмента)
вывел первый, сразу начал выводить второй, не ?

x905 ★★★★★
()
Ответ на: комментарий от x905

Представь себе программу, которая крутится в цикле опроса клавиатуры и выдает звуковой сигнал по нажатию клавиши. Тогда программа выглядит следующим образом:

1) инициализируем буфер нулями («тишиной»).

2) асинхронно выводим содержимое буфера, т.е. буфер ушел в ALSA и начал проигрываться, а мы продолжаем работу. 3) опрашиваем клавиатуру. 4) если нажата клавиша, генерируем в буфере звуковой сигнал, в противном случае кладем туда «тишину». 5) переход к п.2).

Проблема в том, как организовать в п.2) ожидание завершения проигрывания содержимого предыдущего фрагмента. Если этого не делать, что мы получим лаг между нажатием на клавишу и звуковым сигналом — тем больше, чем больше размер буфера выходного потока в ALSA.

Как можно организовать это ожидание?

Klopper
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.