- PVSM.RU - https://www.pvsm.ru -
FreeRDP [1] довольно популярный инструмент для доступа к Windows машинам с не windows систем.
Не смотря на свою популярность у проекта документация отвратительная: актуально и полно освещены только вопросы как собрать из исходников и как начать кодить и слать патчи.
Если требуется что то чуть подробнее узнать про использование то лучше сразу идти на IRC канал к разработчикам или лезть в исходники, всё остальное слухи и/или устарело.
У меня были проблемы со звуком во FreeBSD:
ALSA lib pcm.c:7905:(snd_pcm_recover) underrun occurred
впрочем, далеко не у меня одного и не только во FreeBSD.
Какие только бредовые варианты не гуглятся по по поводу опустошения очереди ALSA, но все они бесполезны (почему — ниже). Разве что перейти на Pulse.
Клиент подключается к серверу, они договариваются какие виртуальные каналы (звук, буфер обмена, ком порт и тп) они будут использовать и с какими параметрами.
В случае звука выбирается частота дискретизации, количество каналов (моно/стерео), кодек, один из следующих: PCM, ADPCM, ALAW, MULAW, DVI_ADPCM.
Когда появляется звук — он отправляется клиенту небольшими блоками, клиент посылает подтверждение и таймстемп.
Некоторые плагины вычисляют таймстепм самостоятельно, например ALSA.
Как и многие другие звуковые плагины (Pulse, mac и пр) ALSA сама не умеет декодировать форматы ADPCM и DVI_ADPCM, вместо этого она их конвертирует в PCM средствами FreeRDP и воспроизводит.
ADPCM/DVI_ADPCM — сжимают звук в 4 раза относительно PCM. Качество теряется не сильно, обычный пользователь на слепом тесте вряд ли заметит разницу.
Код всех звуковых плагинов (ALSA, Pulse, mac, winmm) был компактным, это вдохновило написать поддержку OSS, родной звуковой системы FreeBSD.
тыц и готово [2]
самое важное забыл :) [3]
После не продолжительной отладки оно заработало.
После приобретения положительного опыта с OSS я решил разобраться что же не так в ALSA.
Тыц патчик [4]
Функция rdpsnd_alsa_wave_play() отвечает за то чтобы отправлять данные в звуковое устройство, ещё она занимается некоторыми вычислениями временных интервалов — сколько звук воспроизводится.
Функция snd_pcm_htimestamp() возвращает некоторые значения того что есть и сколько будет проигрываться, дальше была небольшая обёртка.
Считало оно совсем не правильно.
Уж не знаю почему, но у оригинального кода получалось 9-11, а у оригинального кода из rdpsnd_main.c получалось более 200.
Мой код давал практический такой же результат как rdpsnd_main.c (разница в единицы, я более грубо считал), поэтому поставил код из rdpsnd_main.c.
Дополнительно немного изменил параметры инициализации и почистил код.
Думаю там ещё можно было повыкидывать, но я сплю и вижу как бы удалить библиотеку для ALSA из системы :)
Для ленивых :)
Если бы оно нагуглилось… то было бы единственным.
Дело в том, что даже не патченный плагин для ALSA работает отлично если выставить руками формат звука PCM.
Но чтобы узнать что его вообще можно выставлять проще смотреть в исходники, заодно там обнаруживаются другие скрытые параметры.
Документация пишет как выбрать звуковую подсистему:
/sound:alsa
или старый вариант, с выставлением latency
--plugin rdpsnd --data latency:50 --
Страшная тайна в том, что параметров сильно больше, и документация не говорит как вводить больше одного в новом варианте командной строки.
rdpsnd — название плагина, в новой версии ком строки к нему обращаются через /sound.
"sys": звуковая подсистема: asla, pulse, oss (с моими патчами), mac, winmm, opensles, ios
"dev": устройство. Для ALSA это путь вида /dev/УСТРОЙСТВО для OSS номер устройства (те для /dev/dsp2 нужно указывать 2)
"format": формат звука, число: PCM — 1, ADPCM — 2, ALAW — 6, MULAW — 7, DVI_ADPCM — 17.
"rate": частота. Скорее всего 48000, 44100 и тп.
"channel": число каналов. 1 — моно, 2 — стерео.
"latency": число.
"quality": качество, текст или число. «dynamic» — 0 (частота будет меняться в зависимости от задержек канала), «medium» — 1, «high» — 2.
Целебные параметры командной строки для ALSA:
/sound:sys:alsa,format:1,quality:high
(для интернета скорее всего не лучший вариант, особенно мобильного PCM — не сжатый звук)
Параметры командной строки для OSS:
/sound:sys:oss,format:1,quality:high
Теперь FreeRDP можно тянуть с гитхаба и собирать под FreeBSD, всё исправлено.
Патчи которые были в портах — частично устарели, остальное добавил, и добавил свои для сборки без ошибок.
1. OSS по прежнему не доступен в tsmf (/multimedia) и audin (/microphone) плагинах.
2. В основную ветку на момент публикации все патчи перечисленные выше не попали.
3. underrun occurred — полностью не исчезли, в начале воспроизведения они проскакивают, но уже через 5 секунд звук перестаёт заикаться. Возможно стоит поиграться с latency, с константами (65) из кода или посмотреть tcpdump как ходят пакеты. 5-10 заиканий в начале воспроизведения легко не заметить, раньше они были постоянно.
4. Заикания есть и в OSS, просто он не пишет ошибок.
Автор: Ivan_83
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/freebsd/85272
Ссылки в тексте:
[1] FreeRDP: http://www.freerdp.com/
[2] тыц и готово: https://github.com/ivan-83/FreeRDP/commit/fe9fab920ebe719d7d7af9a2373a53752b35a20a
[3] самое важное забыл :): https://github.com/ivan-83/FreeRDP/commit/4f8f84f33bee4ca69c2145ac4cc67ede4cb120cd
[4] Тыц патчик: https://github.com/ivan-83/FreeRDP/commit/8d5825ee007a7889992d5a01e482d1589dd6a7ee
[5] Источник: http://habrahabr.ru/post/252511/
Нажмите здесь для печати.