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 до этого значения ситуацию не исправило. Гугление дало направление в сторону использования фреймов, но каюсь - не силен в англицком, а абсолютно вся документация, найденная мной, была именно на английском(( Просьба к уважаемому сообществу, ежели кто-то может «на пальцах» объяснить что куда нужно вставить и как корректно «переписать» алгоритм воспроизведения - буду шибко признателен! Если ткнёте носом в ссылку с уже готовым описанием этой же проблемы - мы люди не гордые, будем не менее благодарны, абы на родном наречии без басурманских премудростей! ))



Последнее исправление: nk_lg (всего исправлений: 1)

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

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

anonymous
()

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

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

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

Xintrea ★★★★★
()

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

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

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

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

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

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

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

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

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

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