Site Tools


software:freerdp:sound

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
software:freerdp:sound [2022/02/04 18:33]
– removed - external edit (Unknown date) 127.0.0.1
software:freerdp:sound [2022/02/05 05:29]
root
Line 1: Line 1:
 +====== Качественный звук в FreeRDP ======
 +[[http://www.freerdp.com/|FreeRDP]] довольно популярный инструмент для доступа к Windows машинам по протоколу RDP с не windows систем.\\
 +Не смотря на свою популярность у проекта документация отвратительная: актуально и полно освещены только вопросы как собрать из исходников и как начать писать код и слать патчи.\\
 +Если требуется что то чуть подробнее узнать про использование то лучше сразу идти на IRC канал к разработчикам или лезть в исходники, всё остальное слухи и/или устарело.\\
  
 +Во FreeBSD у меня были проблемы со звуком:
 +<code>ALSA lib pcm.c:7905:(snd_pcm_recover) underrun occurred</code>
 +и не у меня одного и не только во FreeBSD.
 +
 +
 +===== Как это работает =====
 +
 +==== RDP ====
 +Клиент подключается к серверу, они договариваются какие виртуальные каналы (звук, буфер обмена, ком порт и тп) они будут использовать и с какими параметрами.\\
 +В случае звука выбирается частота дискретизации, количество каналов (моно/стерео), кодек, один из следующих: PCM, ADPCM, ALAW, MULAW, DVI_ADPCM.\\
 +Когда появляется звук - он отправляется клиенту небольшими блоками, клиент посылает подтверждение и штамп времени.\\
 +Некоторые плагины вычисляют штамп времени самостоятельно, например ALSA.\\
 +
 +
 +==== ALSA ====
 +Как и многие другие звуковые плагины (Pulse, mac и пр) ALSA сама не умеет декодировать форматы ADPCM и DVI_ADPCM, вместо этого она их конвертирует в PCM средствами FreeRDP и воспроизводит.\\
 +ADPCM/DVI_ADPCM - сжимают звук в 4 раза относительно PCM. Качество теряется не сильно, обычный пользователь на слепом тесте вряд ли заметит разницу.\\
 +
 +
 +===== Решение 1 =====
 +Для FreeBSD: я добавил поддержку OSS для воспроизведения звука (rdpsnd плагин):
 +  * [[https://github.com/ivan-83/FreeRDP/commit/fe9fab920ebe719d7d7af9a2373a53752b35a20a]]
 +  * [[https://github.com/ivan-83/FreeRDP/commit/4f8f84f33bee4ca69c2145ac4cc67ede4cb120cd]]
 +Патчи включены в основную ветку, поэтому нужно убедится что freerdp собран с поддержкой OSS и принудительно включить вывод звука через OSS:
 +<code>/sound:sys:oss,format:1,quality:high</code>
 +
 +
 +===== Решение 2 =====
 +После OSS я пропатчил ALSA:\\
 +[[https://github.com/ivan-83/FreeRDP/commit/8d5825ee007a7889992d5a01e482d1589dd6a7ee]] - тоже уже в основной ветке.\\
 +
 +
 +==== Почему не работало ====
 +Функция rdpsnd_alsa_wave_play() отвечает за то чтобы отправлять данные в звуковое устройство, ещё она занимается некоторыми вычислениями временных интервалов - сколько звук воспроизводится.\\
 +Функция snd_pcm_htimestamp() возвращает некоторые значения того что есть и сколько будет проигрываться, дальше была небольшая обёртка.\\
 +Считало оно совсем не правильно.\\
 +Уж не знаю почему, но у кода ALSA получалось 9-11, а у оригинального кода из rdpsnd_main.c получалось более 200.\\
 +Мой код давал практический такой же результат как rdpsnd_main.c (разница в единицы, я более грубо считал), поэтому поставил код из rdpsnd_main.c.\\
 +Дополнительно немного изменил параметры инициализации и почистил код.\\
 +
 +
 +===== Решение 3 =====
 +Не патченный плагин для ALSA работает отлично если выставить руками формат звука PCM.\\
 +<code>/sound:sys:alsa,format:1,quality:high</code>
 +
 +
 +===== Параметры командной строки =====
 +Только то что касается вывода звука.\\
 +
 +**rdpsnd** - название плагина, в новой версии ком строки к нему обращаются через:
 +<code>/sound</code>
 +  * **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.
 +
 +
 +===== PS =====
 +Теперь FreeRDP можно тянуть с гитхаба и собирать под FreeBSD, всё исправлено.\\
 +Патчи которые были в портах - частично устарели, остальное добавил.\\
 +
 +  * * исправлена сборка под FreeBSD
 +  * + OSS в rdpsnd (воспроизведение звука)
 +  * + OSS в audin (запись звука)
 +  * + OSS в tsmf (воспроизведение мультимедиа), работает только с ffmpeg
 +  * * tsmf исправления для работы под FreeBSD (не воспроизводилось видео)
 +  * * ALSA исправлено воспроизведение звука и почищен код
 +  * + devd поддержка в urbdrc (перенаправление USB) и работа urbdrc во FreeBSD (не проверялось)
 +  * + добавлены отладочные сообщения
 +  * * патч для правильного определения временной зоны
 +  * * исправлена работа динамических каналов (в тч audin)
 +Исправления смотреть тут: [[https://github.com/ivan-83/FreeRDP/commits/master]] (начиная с 09 марта 2015 по 02 мая 2015)
 +
 +  - underrun occurred - полностью не исчезли, в начале воспроизведения они проскакивают, но уже через 5 секунд звук перестаёт заикаться. Возможно стоит поиграться с **latency**, с константами (65) из кода или посмотреть tcpdump как ходят пакеты. 5-10 заиканий в начале воспроизведения легко не заметить, раньше они были постоянно.
 +  - Заикания есть и в OSS, просто он не пишет ошибок.
 +
 +==== В основной ветке ====
 +  * [[https://github.com/FreeRDP/FreeRDP/commit/8d5825ee007a7889992d5a01e482d1589dd6a7ee|Fix poor sound quality with ALSA]]
 +  * [[https://github.com/FreeRDP/FreeRDP/commit/fe9fab920ebe719d7d7af9a2373a53752b35a20a|add OSS support for rdpsnd]]
 +  * [[https://github.com/FreeRDP/FreeRDP/commit/4f8f84f33bee4ca69c2145ac4cc67ede4cb120cd|some files for OSS, missed from prev commit]]
 +  * [[https://github.com/FreeRDP/FreeRDP/commit/434436b75f00c5475f66ff0f4062e168aa409688|BSD/FreeBSD build fix]]
 +  * [[https://github.com/FreeRDP/FreeRDP/commit/f5dbe2c9a5fe050c1d7e014d3c1529befb8eea3b|FreeBSD timezone detection patch]]
 +  * [[https://github.com/FreeRDP/FreeRDP/commit/0f3b6390588a918450677bc2a01b0a64a43bda02|OSS build fix on linux ]]
 +  * [[https://github.com/FreeRDP/FreeRDP/commit/7b3a5529883f5ab87ff61663178808e286cfd8a0|audin OSS support (un tested now), fix: dev in rdpsnd does not work, fix dynamic channels now work again]]
 +  * [[https://github.com/FreeRDP/FreeRDP/commit/3a8022e67cc8c3f2cd068f4d505a6174d2a40e1a|audin OSS files]]
 +  * [[https://github.com/FreeRDP/FreeRDP/pull/2719|OSS, tsmf, usb and BSD fixes and improvements]]
 +
 +
 +{{tag>software article freebsd linux RDP OSS}}
software/freerdp/sound.txt · Last modified: 2022/02/07 18:40 by root