Драйвер звуковой платы ESI Juli@ для FreeBSD

Так сложилось, что в повседнейвной работе я предпочитаю FreeBSD другим операционкам, также у меня есть две звуковые карты ESI Juli@ и много классной музыки, так что было бы здорово совмещать работу с приятным. Во FreeBSD заявлена поддержка этой звуковой карты, но фактически реализовано только воспроизведение, да и то только в аналоговый выход и без возможности регулировать громкость. Разумеется, меня такое положение дел никак не устривает, что вылилось в написание предлагаемого драйвера, максимально функционального и с поддержкой внешней удобной панели управления. В надежде, что этот кусок кода сможет принести пользу кому-то ещё, он был выложен здесь.

Этот драйвер работает у меня без проблем где-то с конца 2018 года, но, так как я в основном слушаю музыку и не часто пользуюсь другим функционалом (вроде записи или MIDI), требуется более тщательное тестирование. Драйвер протестирован только на архитектурах i386 и amd64. Работает как с PCI, так и с PCI Express (Juli@ XTe) вариантом платы. И да, это ПО с открытым исходным кодом и без каких-либо гарантий, распространяется по лицензии FreeBSD 2-clause.

1. Возможности
2. Загрузка
3. Как пользоваться
4. Микшер
5. Конфигурирование
6. Известные вопросы
7. Лицензия

Возможности

Предлагаемый драйвер реализует следующие возможности:

Загрузка

Исходный код Версия Дата релиза Что нового
snd_juliet_v2_source.tar.gz 2 2019.08.06 Смотреть
snd_juliet_v1_source.tar.gz 1 2019.04.07 Первичный релиз

Как пользоваться

Все описанные ниже операции, кроме скачивания и распаковки, следует выполнять от имени суперпользователя (root).


1. Скачать архив по ссылке выше, или вот так:

% fetch https://sndbro.ru/snd_juliet/files/snd_juliet_v1_source.tar.gz

2. Распаковать архив:

% tar xf snd_juliet_v1_source.tar.gz

3. Перейти в создавшийся при распаковке каталог и собрать драйвер:

# cd snd_juliet_v1_source
# make && make install

4. Загрузить драйвер:

# kldload snd_juliet

После тестирования драйвера прошу найти пару минут и написать мне (ap at sndbro.ru) об обнаруженных проблемах или предложениях по улучшению.


Если сборка завершается ошибкой, следует убедиться, что в файле /etc/make.conf не установлена переменная NO_MODULES=..., и что в системе присутствуют исходные коды ядра FreeBSD.


Для автоматизации загрузки драйвера при запуске системы следует добавить строку 'snd_juliet_load="YES"' в файл /boot/loader.conf.

Микшер

Используйте команду mixer(8) для управления громкостью и выбора источника для записи (гораздо больше возможностей для управления звуковой картой предлагает графическая панель управления mixate-juliet, см. здесь).

Для регулировки громкости во всех четырёх каналах используются исключительно возможности ЦАП звуковой платы (никаких "программных" регулировок не предусмотрено). Аттенюатор ЦАП имеет 128 уровней изменения громкости (-63db...0db с шагом 0.5db), однако mixer(8) позволяет задавать значения громкости от 0 до 100. Таким образом, формула для расчёта реального значения громкости (в диапазоне 0...127) имеет вид: громкость = 127 * значение_в_микшере / 100.

Громкость всех трёх каналов мониторинга задаётся одним параметром - monitor. Раздельное управление громкостью каналов мониторинга с помощью mixer(8) не реализовано. Если необходимо регулировать громкость в каналах раздельно, можно использовать графическую панель управления (подробнее здесь). Мониторинг любого из каналов может быть включен или выключен изменением соответствующей переменной sysctl(8) (см. раздел 'конфигурирование' ниже).

Доступные входы для записи обозначаются 'line' и 'dig1' соответственно для аналогового и цифрового входов. Устройство 'line' установлено по-умолчанию. Используйте команду mixer =rec dig1 для записи с цифрового источника сигнала, и mixer =rec line для записи с аналогового. Оба устройства одновременно не могут быть выбраны. Если переключить источник записи в процессе записи, источник изменится, но запись будет продолжаться с предыдущего источника. Таким образом необходимо остановить запись и инициировать заново, чтобы начать записывать с другого входа.

Конфигурирование

Доступны следующие переменные sysctl(8):


dev.pcm.X.play_outs Выбор активного выхода при воспроизведении: 0 = аналоговый+цифровой, 1 = только аналоговый, 2 = только цифровой. Значение не может быть изменено в процессе воспроизведения. Значение по-умолчанию: 0.
dev.pcm.X.sample_rate_manual Отключение автоматической установки частоты дискретизации: 0 = автоматическая установка частоты дискретизации включена, 1 = отключена. Значение по-умолчанию: 0.
dev.pcm.X.sample_rate Отображает текущую частоту дискретизации. Переменная перезаписываемая, можно указать другую поддерживаемую частоту дискретизации во время работы и оборудование будет переключено на эту частоту. Поддерживаются частоты (Гц) 44100, 48000, 88200, 96000, 176400 и 192000.
dev.pcm.X.override_system_latency 0 = выключено, 1 = включено. Если включено, размер блока буферизации может быть задан вручную (см. dev.pcm.X.latency). Если выключено, задержка выбирается драйвером sound(4) автоматически на основе значений переменных hw.snd.latency и hw.snd.latency_profile. Значение по-умолчанию: 0.
dev.pcm.X.latency Управляет размером блока буферизации, что сказывается на таком параметре, как задержка (latency). Чтобы использовать эту переменную, сперва нужно установить переменную dev.pcm.X.override_system_latency в 1. Может иметь значение в диапазоне от 0 до 5. Соответствующие размеры блока (в байтах): 0=512, 1=1024, 2=2048, 3=4096, 4=8192, 5=16384. Блоки меньшего размера приводят к уменьшению задержки ценой увеличения частоты следования прерываний. Размер сэмпла - 8 байт (стерео), исходя из этого значения и частоты дискретизации можно вычислить временную задержку. Значение по-умолчанию: 3.
dev.pcm.X.mon_spdif_out, dev.pcm.X.mon_spdif_in, dev.pcm.X.mon_analog_in Включают сквозной мониторинг соответствующих каналов на аналоговом выходе. Могут быть включены в любой комбинации. Используйте команду mixer(8) или графическую панель управления для контроля громкости каналов мониторинга. Значение по-умолчанию: 0.
dev.pcm.X.extclock Включает согласование частоты дискретизации с внешним источником сигнала, когда он подключен к цифровому входу. Может иметь значения 0 (выключено) или 1 (включено). Значение по-умолчанию: 0.

Известные вопросы

Этот драйвер поддерживает только 32-битный формат данных. Это не доставляет никаких проблем до тех пор, пока не будет включен режим bitperfect (dev.pcm.X.bitperfect=1) и отключены виртуальные каналы (dev.pcm.X.play/rec.vchans=0). В таком случае драйвер sound(4) не производит никаких манипуляций с аудио-потоком, в том числе смену формата данных. Таким образом только 24-битные данные могут быть воспроизведены в этом режиме, а при попытке вывода 16-битного потока софт выдаст ошибку 'неподдерживаемый формат данных' или что-нибудь в этом духе. Чтобы обойти проблему, нужно либо не выключать виртуальные каналы (оставить хотя бы один, тогда sound(4) будет использовать свой конвертер), либо использовать возможности используемого софта. Например, mplayer может на лету изменять формат данных на нужный, если указать ему опцию -format s32le.

Лицензия

Copyright (c) 2019 Алексей Палютин 
All rights reserved.                                                         

Redistribution and use in source and binary forms, with or without           
modification, are permitted provided that the following conditions           
are met:
 1. Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
 2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND       
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE        
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE   
ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE      
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL   
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS      
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)        
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHERIN CONTRACT, STRICT    
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY    
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF       
SUCH DAMAGE.