LINUX.ORG.RU

Задержка при воспроизведении звука через /dev/dsp

 


0

1

Добрый день, уважаемый All. Есть 2 простенькие программы, одна из которых берет звук с микрофона (/dev/dsp) и отправляет его в открытый порт. Вторая получает этот поток и перенаправляет на динамик (всё тот же /dev/dsp). Проблема со второй программой: сразу после запуска всё отрабатывает корректно, но уже через 1-1.5 минуты(сугубо субъективное восприятие + добежать до устройства, на котором реально запущена вторая функция) воспроизведение начинает отставать от микрофона на 2-3 секунды... со временем эта задержка может дорости до 5ти секунд. Вырезки из програмы «приемника»:

#define CAPTURE_DEV     "/dev/dsp"
#define BUF_SIZE        1024
...
unsigned char buff[BUF_SIZE];
...
out_fd = open(CAPTURE_DEV, O_WRONLY, 0);
channels = 1;
format = AFMT_S16_LE;
rate = 22050;
ioctl(out_fd, SNDCTL_DSP_SETFMT, &format);
ioctl(out_fd, SNDCTL_DSP_CHANNELS, &channels);
ioctl(out_fd, SNDCTL_DSP_SPEED, &rate);
...
while 1
{
	recv(sock, buff, BUF_SIZE, 0);
	write(out_fd, buff, BUF_SIZE);
}
...

ioctl(out_fd, SNDCTL_DSP_GETBLKSIZE, &bytes) возвращает значение 4096, тупое увеличение BUF_SIZE до этого значения ситуацию не исправило. Гугление дало направление в сторону использования фреймов, но каюсь - не силен в англицком, а абсолютно вся документация, найденная мной, была именно на английском(( Просьба к уважаемому сообществу, ежели кто-то может «на пальцах» объяснить что куда нужно вставить и как корректно «переписать» алгоритм воспроизведения - буду шибко признателен! Если ткнёте носом в ссылку с уже готовым описанием этой же проблемы - мы люди не гордые, будем не менее благодарны, абы на родном наречии без басурманских премудростей! ))


мы люди не гордые, будем не менее благодарны, абы на родном наречии без басурманских премудростей!

Дворником иди работать, или посуду мыть. Там точно басурманских премудростей не нужно.

anonymous ()

Со звуком и буфером в Linux все очень печально. Я примерно так же раньше долбался, пока не стал пользоваться SDL.

В аппаратные особенности звуковушек лучше не лезть, толку не будет.

Мой тебе совет, потыкайся в SDL, в его звуковую подсистему. Возможно ты решишь свою проблему, просто пользуясь функциями SDL.

Xintrea ★★★★★ ()

Я думаю, проще дёрнуть alsa напрямую, чем пытаться использовать эмуляцию.

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

Дворником иди работать, или посуду мыть. Там точно басурманских премудростей не нужно.

- Неправда ваша, сейчас в любом крупном городе влезть дворником вместо гастрабайтера - это еще постараться нужно, а вот в кодеры - это кругом и рядом, кто тех «индусов» считает?! )

Со звуком и буфером в Linux все очень печально. Я примерно так же раньше долбался, пока не стал пользоваться SDL.

- Спасибо, погуглю в эту сторону...

Я думаю, проще дёрнуть alsa напрямую, чем пытаться использовать эмуляцию.

- Мой косяк - недоописал ситуацию: нету альсы. ОСС на встраиваемой openwrt есть, а альсы - нету...

Ок, всем спасибо, сейчас «взвешу» для себя SDL vs alsa и пойду в одну из этих сторон)

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