FreeRDP довольно популярный инструмент для доступа к Windows машинам по протоколу RDP с не windows систем.
Не смотря на свою популярность у проекта документация отвратительная: актуально и полно освещены только вопросы как собрать из исходников и как начать писать код и слать патчи.
Если требуется что то чуть подробнее узнать про использование то лучше сразу идти на IRC канал к разработчикам или лезть в исходники, всё остальное слухи и/или устарело.
Во FreeBSD у меня были проблемы со звуком:
ALSA lib pcm.c:7905:(snd_pcm_recover) underrun occurred
и не у меня одного и не только во FreeBSD.
Клиент подключается к серверу, они договариваются какие виртуальные каналы (звук, буфер обмена, ком порт и тп) они будут использовать и с какими параметрами.
В случае звука выбирается частота дискретизации, количество каналов (моно/стерео), кодек, один из следующих: PCM, ADPCM, ALAW, MULAW, DVI_ADPCM.
Когда появляется звук - он отправляется клиенту небольшими блоками, клиент посылает подтверждение и штамп времени.
Некоторые плагины вычисляют штамп времени самостоятельно, например ALSA.
Как и многие другие звуковые плагины (Pulse, mac и пр) ALSA сама не умеет декодировать форматы ADPCM и DVI_ADPCM, вместо этого она их конвертирует в PCM средствами FreeRDP и воспроизводит.
ADPCM/DVI_ADPCM - сжимают звук в 4 раза относительно PCM. Качество теряется не сильно, обычный пользователь на слепом тесте вряд ли заметит разницу.
Для FreeBSD: я добавил поддержку OSS для воспроизведения звука (rdpsnd плагин):
Патчи включены в основную ветку, поэтому нужно убедится что freerdp собран с поддержкой OSS и принудительно включить вывод звука через OSS:
/sound:sys:oss,format:1,quality:high
После 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.
Дополнительно немного изменил параметры инициализации и почистил код.
Не патченный плагин для ALSA работает отлично если выставить руками формат звука PCM.
/sound:sys:alsa,format:1,quality:high
Только то что касается вывода звука.
rdpsnd - название плагина, в новой версии ком строки к нему обращаются через:
/sound
Теперь FreeRDP можно тянуть с гитхаба и собирать под FreeBSD, всё исправлено.
Патчи которые были в портах - частично устарели, остальное добавил.
Исправления смотреть тут: https://github.com/ivan-83/FreeRDP/commits/master (начиная с 09 марта 2015 по 02 мая 2015)