?

Log in

No account? Create an account
skype-2, или возвращение скайпа - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

skype-2, или возвращение скайпа [авг. 25, 2004|02:16 pm]
Anatoly Vorobey
Ох, как меня заебал этот скайп за последние сутки, это просто слов нет.

В общем, не хочет он нормально работать в Линуксе. Очень плохое качество звука, шипит и прыгает ужасно. Сначала я грешил на качество связи, потом поковырялся немного и понял, что дело в том, как он работает со звуковой системой Линукса.


Техническая информация (незнакомые с Юниксом спокойно могут пропустить):
Линукс поддерживает два интерфейса к звуку: OSS (старый) и ALSA (новый). OSS — общеюниксовый интерфейс, самый популярный, в нём происходит общение программ с девайсами /dev/dsp и /dev/mixer (в типичной конфигурации). Программа открывает их, настраивает с помощью ioctl'ов, с их же помощью читает/пишет громкость в /dev/mixer, а сам звук читает/пишет в /dev/dsp (речь здесь везде идёт об интерфейсе нижнего уровня, если это вдруг неясно; т.е. в/из /dev/dsp идут никакие не mp3-файлы, а чистый звук, т.е. то, что записано в .wav-файлах, например). Новая звуковая система в Линуксе, ALSA, куда лучше и круче, но относительно мало программ умеют с ней общаться (в принципе её файлы сидят в /dev/snd, но есть хорошая стандартная библиотека, все идут через неё). Поэтому ALSA умеет эмулировать OSS, причём двумя способами. Один - через ядро, с помощью модулей snd-pcm-oss, snd-mixer-oss итп. Они автоматически переправляют обращения к /dev/dsp к себе и эмулируют интерфейс OSS внутри ядра с помощью внутренних вызовов ALSA. Это работает очень хорошо обычно; собственно, у меня так всегда бежит xmms и другие звукопроигрыватели (как я теперь понял). Есть ещё один способ, супер-извращённый. Программа запускается с помощью скрипта aoss, который добавляет в среду переменную LD_PRELOAD, заставляющую динамический сборщик Линукса подключить несколько специальных библиотек ALSA перед всеми остальными библиотеками данной программы. Эти специальные библиотеки переопределяют стандартные функции типа open(), ioctl() итп., и в случае, когда программа пытается работать именно с /dev/dsp и /dev/mixer, подменяют их своими ALSA-вскими вызовами. К /dev/dsp в результате реально никто не обращается. Это работает, но не всегда и не всегда хорошо.

Но и это ещё не всё. Как у KDE, так и у GNOME (которым я обычно пользуюсь) есть свои sound manager'ы: это демоны, которым другие программы посылают звуковые потоки, а они умеют микшировать (?) несколько потоков одновременно при необходимости, и результат посылают уже на звуковую карту. У KDE это artsd, у GNOME — esd (пакет esound). Оба они умеют на своём выходе говорить как с OSS, так и с ALSA (ясно, что если в системе бежит ALSA, то лучше их настроить так, чтобы они говорили прямо с ней). На входе же к ним умеет обращаться только небольшое количество программ: собственно те, что есть в пакетах KDE и GNOME в основном. Как же заставить все остальные звуковые программы (ту же xmms, например) посылать свой выход не на /dev/dsp, а этим менеджерам? С помощью того же трюка с LD_PRELOAD; для этого у artsd есть программа artsdsp, а у esd программа esddsp. Вместе с вышеупомянутой aoss это уже три разные программы (совершенно разные исходники), которые пытаются перехватить обращение к OSS и перенаправить каждая в свою сторону. Плюс ещё эмуляция OSS на уровне ядра.

Короче, Скайп. Он как-то очень извращённо работает с /dev/dsp, так, что эмуляция ядра с этим не справляется, и на выход попадает ломаный, шипящий звук с пропусками и дырками. Вход тоже корёжится. В этой эмуляции есть любопытная возможность менять некоторые параметры для одной конкретной программы, но всё, чего я добился — смены одного вида помех на другой, потом на третий, и так далее. Запустить чистый OSS (т.е. старый драйвер OSS для моей карты и вырубить ALSA) я не могу, т.к. он у меня не работает просто, нет звука; только ALSA работает с моей картой. aoss (ALSA-вский метод эмуляции в userspace) со Скайпом вообще не бежит, выдаёт Segmentation fault. Остальные два способа эмуляции в userspace (artsdsp, esddsp) бегут, но не приносят никаких результатов. Особенно с esddsp мистика: я покопался в нём как следует, разобрался в том, какие опции нужны, он теперь хорошо всё перехватывает, и открытие девайсов, и все ioctl'ы, и всю запись/чтение, и всё это посылает демону esd, который всё это принимает и вроде бы обрабатывает. Но почему-то skype при этом посылает одни нули, т.е. тишину, хотя сам при этом на экране рисует, что подключился, и явно получает звук (я тестировал с помощью подключения к юзеру echo123, он специально для этого существует). Я полночи протрахался, простите, с этой гадиной, пропустил её через десятки strace'ов, просмотрел логи системных функций. Когда он говорит с “настоящим” /dev/dsp (т.е. всё равно эмулированным ALSA, но через ядро), то посылает живой звук, только он выходит с помехами, а когда то же самое, но его вызовы перехватываются esddsp, то он теми же функциями write() посылает одни нули, а читать с микрофона даже не пытается. Значит, эмуляция esddsp в чём-то неубедительно ему врёт, но в чём именно, я так и не разобрался. Зато я узнал о программе skype такие прелести, что, например, сразу после запуска она создаёт одновременно 1000 сокетов, и сразу их все закрывает. Это типа такой high-tech способ максимальное кол-во дескрипторов проверить, догадался Штирлиц. Мастера!



В общем, я сдался пока что. На днях попробую ещё в эмуляторе (Wine), но не питаю особых надежд. Может, они выпустят новую версию для Линукса, получше. Пока что я запустил skype в Windows на соседнем компьютере (качество отличное, как и ожидалось, лучше телефона) и буду его там некоторое время держать — наушники с микрофоном под рукой, так что пересаживаться не нужно. Если кто-то хочет — звоните. Боюсь, правда, что если не найду способа запустить в Линуксе, то плюну через несколько дней.
СсылкаОтветить

Comments:
[User Picture]From: bobuk
2004-08-25 04:24 am
Есть один секрет с oss эмуляцией. Очень рекомендую попробовать
modprobe rtc
(Ответить) (Thread)
[User Picture]From: avva
2004-08-25 04:29 am
Гм. rtc у меня нет, действительно. Правда, что-то я уже отчаялся, что заработает. Но всё же попробую.
(Ответить) (Parent) (Thread)
[User Picture]From: bobuk
2004-08-25 04:41 am
Стоит попробовать. Покрайней мере половина программ для работы со звуком требует загруженного rtc.
(Ответить) (Parent) (Thread)
[User Picture]From: alkk
2004-08-25 04:29 am
SIP мне нравится гораздо больше. открытый протокол, несколько программных реализаций, есть и в железе.
(Ответить) (Thread)
[User Picture]From: msh
2004-08-25 04:37 am
SIP и Skype это яблоки и апельсины
(Ответить) (Parent) (Thread)
[User Picture]From: alkk
2004-08-25 04:45 am
ну почему же. если разговор про мне-надо-говорить-через-инет, то вполне.
или вы про то, что SIP - протокол, Skype - программа?
(Ответить) (Parent) (Thread)
[User Picture]From: msh
2004-08-25 04:48 am
SIP - это протокол call control. Собственно разговор передается по другим протоколам при этом (обычно RTP, но необязательно)

Для конечного пользователя довольно таки все равно SIP там, Megaco или еще чего, а вот RTP с поганым кодеком или Skype с хорошим - нет
(Ответить) (Parent) (Thread)
[User Picture]From: alkk
2004-08-25 05:03 am
скайп живет на iLBC, ничто не мешает его использовать. мало того, XTen (например) его поддерживает.
(Ответить) (Parent) (Thread)
[User Picture]From: msh
2004-08-25 05:15 am
XTen и Asterix поддерживают, а вот железные телефоны я с ним не знаю

А с RTP что делать? С его overhead и проблемами с firewalls?
(Ответить) (Parent) (Thread)
[User Picture]From: iratus
2004-08-25 04:36 am
Skype under Wine thread :
http://www.linuxquestions.org/questions/showthread.php?postid=748899

Что касается звука в найтив, попробуйте вообще выключить артс и есд. Они не нужны для нормальной работы 99% програм включая собственно входящие в КДЕ или Гноме. Возможно также что у вас, неправильно настроена
АЛСА. советую обратить внимание на файл .asound. Какая у вас карточка
(Ответить) (Thread)
[User Picture]From: avva
2004-08-25 04:43 am
1) Ага, я их выключал, ничего не помогало. arts у меня вообще нет собственно, я его специально построил, чтобы попробовать.
2) Я собираюсь убрать нафиг esd и настроить микширование прямо через ALSA с помощью dmix, как описано здесь. Очень крутая штука. Единственный недостаток - что все OSS программы всё равно надо через aoss запускать. Но так или иначе, со skype'ом мне это не помогает.
3) Мой .asoundrc нерелевантен, увы, т.к. ядровая эмуляция через snd-pcm-oss к нему отношения не имеет и его не читает (она настраивает только plugin layer для rate conversion при необходимости и всё), а ни одна userspace эмуляция OSS в ALSA (которая могла бы таким образом на выходе пользоваться библиотекой ALSA и настройками .asoundrc) у меня так и не заработала.
4) У меня дешёвый onboard Intel8x0/SiS SI7012, на материнской плате от SiS.

(Ответить) (Parent) (Thread)
[User Picture]From: fyysik
2004-08-25 05:09 am

SiS

Анатолий, а у вас есть возможность проверить все это на линуксе с другой звуковой карточкой?
Может проблема в драйверописателях для SiS7012 ?
(Ответить) (Parent) (Thread)
From: (Anonymous)
2004-08-25 10:17 pm
Анатолий, у меня стоит Creative emu10k1, работающий под ALSA 1.0.5a с ядром 2.6.7, дистрибутив Gentoo, skype 0.91.0.3, без каких-либо sound manager'ов. Всё работает через ядрёный snd-pcm-oss. Качество звука при записи еcho123 устраивает, разве что непривычен тембр собственного голоса, текущего из колонок. При этом вполне возможно играть музыку xmms'ом одновременно со звонком skype. В /proc/asound/oss/sndstat записано:

Audio devices:
0: EMU10K1 (DUPLEX)

А в /proc/asound/oss/devices помимо прочего есть такие строчки:

12: [0-12]: digital audio
3: [0- 3]: digital audio

Более того, проверка из-под tcsh

set i=0
while($i<40)
xterm -e 'mplayer -ao oss /some/path/to/file.mp3 | tee /tmp/t$$' &
@ i = $i + 1
end

показала, что запускаются и работают одновременно где-то 20 проигрывателей, создавая вполне себе какофонию. Остальные выходят, видимо не найдя свободного устройства (поверхностное исследование логов сообщений об ошибке не выявило). То же самое происходит и с ключом "-ao alsa". Может, Вашей картой не поддерживается дуплексный режим?

Илья.
(Ответить) (Parent) (Thread)
From: (Anonymous)
2004-08-25 10:26 pm
Кстати, если в skype выбрать пункт меню Tools->Search for skype users, затем нажать "Advanced >>", а потом нажать "Clear", то поле "Birthdate" будет 14/09/1752. К чему бы это? Разве принятие Грегорианского календаря в UK (так подсказывает google) такая важная дата?
Илья.
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2004-08-26 04:32 am
При этом вполне возможно играть музыку xmms'ом одновременно со звонком skype.

Это, видимо, потому, что у Вас карта умеет делать hardware mixing. Там, где не умеет, без dmix plugin'а не обойтись.

не выявило). То же самое происходит и с ключом "-ao alsa". Может, Вашей картой не поддерживается дуплексный режим?

Вот об этом я не подумал, честно говоря. Действительно, это я до сих пор никак не проверял в других программах кроме skype. Наверное, проще всего будет это проверить, запустив одновременно запись с микрофона одной программой и xmms, чтобы играла. Попробую сегодня. Спасибо за подсказку.
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2004-08-26 05:41 pm
Нет, вроде работает у меня дуплекс :(
(Ответить) (Parent) (Thread)
From: (Anonymous)
2004-08-26 09:45 pm
Получается, вся проблема в отсутсвии hardware mixing? Вы, думаю, пробовали запускать X без всего, т.е. без GNOME или KDE, без сопутствующих sound manager'ов и прочих прелестей. Skype не работает? Может, на alsa-user спросить? Хотя, шапка intel8x0.c гласит: "We have no datasheet for SiS735, so the code is not fully functional," так что, может, просто не повезло с картой. Зато нашлось руководство (http://opensrc.org/alsa/index.php?page=intel8x0) по настройке dmix специально для intel8x0.
Илья
(Ответить) (Parent) (Thread)
[User Picture]From: iratus
2004-08-25 05:11 am
Возможно стоит для начала попробовать без миксинга вообще... хотя бы убедиться что работает.

Intel8x0 самая стандартная архитектура.. я удивлен что она у вас не работает хоть в deprecated OSS.

Вы не пробовали почитать http://forum.skype.com/bb/viewforum.php?f=18 . там есть масса информации и возможно вам даже поможет
(Ответить) (Thread)
[User Picture]From: avva
2004-08-25 05:42 am
Да работает, конечно, и с миксингом и без ;) всё работает, кроме skype, а skype не работает ни с чем.
Форум по ссылке я уже так перелопатил, что тошнит от него.
(Ответить) (Parent) (Thread)
[User Picture]From: iratus
2004-08-25 05:47 am
Хмм.. даже интересно... я попробую дома седня у меня Нфорсе 2 это тоже 8х0 драйвер. посмотрим что получится
(Ответить) (Parent) (Thread)
[User Picture]From: mivlad
2004-08-25 04:38 pm
Если хочется просто поговорить по интернету, то можно ещё попробовать SpeakFreely; правда, ей нужен настоящий IP-адрес на стороне, принимающей звонок.
(Ответить) (Thread)
From: ex_the_zoi290
2004-09-07 07:07 am
Это немного запоздало, но я редко читаю Ваш журнал, поэтому отмечу только тот факт, что у меня в SuSE 9.1 с казённым ядром, постоянно обновляемым через YaST (рабочая машина) и KDE 3.2.3, и в SuSE 9.0 с теми же допущениями и KDE 3.1.5 (дома) линуксовая версия Skype работала без проблем. У меня дома ADSL, на работе ADSL+спутник -- связь была прекрасная даже в том случае, когда у абонентов на той стороне было модемное подключение на 33600. Впрочем, это Вы и так уже наверняка знаете. :)

Единственный замеченный мной пока что глюк -- если версии программы у собеседников не совпадают, иногда наблюдается странное т-о-р-м-о-ж-е-н-и-е звука.
(Ответить) (Thread)
[User Picture]From: avva
2004-09-07 12:21 pm
спасибо ;) Видимо, попробую на другой карточке как-нибудь.
(Ответить) (Parent) (Thread)
From: (Anonymous)
2004-11-10 06:50 pm
У меня та же проблема, тоже SIS и intel8x0, с эмуляцией в ядре работает вполне себе сносно, но хочется dmix. С aoss не хочет. Тишина. хотя все остальные работают программы, включая mpg123. Скорей бы они сделали alsa вывод. Вроде обещают.

Кстати чтобы получить dmix для записи, нужно использовать плагин dsnoop и asym.
(Ответить) (Thread)
From: (Anonymous)
2004-11-11 09:20 am
Решается вот так:
http://forum.skype.com/bb/viewtopic.php?t=4076&highlight=aoss&sid=f2895a26ff5e6949a7147228f22c061c
Смотреть посты товарища Azarah

У меня получилось. Действительно, aoss не работает. Но работает artsdsp. У меня сейчас можно одновременно разговаривать по skype, слушать музыку и записывать микрофон.
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2004-11-11 09:25 am
Большое спасибо! Обязательно попробую.
(Ответить) (Parent) (Thread)