Пару дней назад купил я себе внешнюю звуковую карту e-mu 0204. Купил с рук, за 2 т.р. Владелец был счастлив, я то же. Оба думали, что надули друг друга. Стоит железка в магазине 4,5 т.р. Принес домой подрубил, звук сказочный. Но, обнаружился косяк. В непредсказуемые моменты времени слышны были тихие пощелкивания и перерывы звука. У меня отличные наушники ATH-SJ55. Соответствуют карточке по уровню, непонятно почему это вдруг началось. Разбираемся как исправить.
Я конечно слышал о проблемах с картой и попробовал применить описанный в куче мест способ проигрывания звукового файла с тишиной что бы занять канал и вроде как щелчки должны исчезнуть так как «карта перестанет переходить в режим энергосбережения». Что я только не начитался, даже то, что ей питания не хватает и надо внешний usb хаб купить с отдельным блоком питания. Все это не помогло (хаб не пробовал).
Залез в настройки pulseaudio. В железке есть аппаратный буфер, куда кладутся данные после оцифровки. Звуковой системе компа надо в него класть звук, вообще через него идет общение звуковухи и компа что бы звук не прерывался (туда то и надо смотреть).
Если на компе неверно настроены параметры работы с буфером, будут щелчки. Это я выяснил путем ковыряния настроек и чтения форумов с расчетом значения этих параметров. Что бы этого сделать на винде, надо молится, больше ничего не поможет, так как обновления драйвера с нужными исправлениями нету, да и винды у меня нету. Но, второй из здесь описанных вариантов настройки возможно подойдет и для винды, так как есть сборка jackd для нее, кажется. На линуксе все реальнее. Вариант первый, сложный:
Я сломал всю башку прежде чем сумел настроить все это в линуксе и вообще понять в чем дело, сначала уже расстраиваться начал. Тем, кто захочет настроить, смотреть в /etc/pulse/daemon.conf
#тут можно и что то поменьше или получше, зависит от машины, у меня i7 четырех ядерный, он не заметит, а слабая машина ляжет
resample-method = src-sinc-best-quality
default-sample-format = s32le
#в пульсе ресамплинг проходит весь звук, так как источники имеют зачастую разную частоту дискретизации и по другому никак микшер не сделать
#но я поставил максимум частоты
default-sample-rate = 192000
alternate-sample-rate = 192000
#Эти параметры можно крутить именно о их настройки написано на вышеприведенном форуме
default-fragments = 4
default-fragment-size-msec = 3
Еще надо залазить в: /etc/pulse/default.pa
И там поставить:
load-module module-udev-detect use_ucm=0 tsched=0
вместо
load-module module-udev-detect use_ucm=0
Несмотря на то, что настройка параметров буфера должна бы убрать щелчки и без tsched=0 ни рассчитать, ни подобрать нужных значений мне не удалось. Вместе с tsched=0 все работает, при этом надо понимать, что при этом параметре возрастет нагрузка на процессор от pulseaudio.
Это, кстати, убьет все преимущества пульсы перед алсой, но настраивать алсу мне лень, а щелчки без пульсы те же.
Щелчки останутся только при старте компа (когда карта включается), небольшие и при сильной нагрузке на комп, да еще при подключении очередного клиента к звуковухе. Описывать настройку pulseaudio для слабого компа я тут не стану, суть в том, что ресемплер надо попроще поставить и приоритет pulseaudio поднять.
Вариант второй, кошерный:
В /etc/pulse/daemon.conf
#тут можно и что то поменьше или получше, зависит от машины, у меня i7 четырех ядерный, он не заметит, а слабая машина ляжет
resample-method = src-sinc-best-quality
default-sample-format = s32le
#в пульсе ресамплинг проходит весь звук, так как источники имеют зачастую разную частоту дискретизации и по другому никак микшер не сделать
#но я поставил максимум частоты
default-sample-rate = 192000
alternate-sample-rate = 192000
Остальное по умолчанию. Даже tsched=0 не ставим! Пользователям skype у которых он хрипит при старте, думаю то же это решение подойдет. Проблема в skype в том, что частота дискретизации файла, который он проигрывает на старте, не совпадает с частотой ресемплера, вот и хрипит и на многих карточках, между прочим. Наша же карточка то претендует на начальный уровень профессиональных, так что вообще то логично, что она рассчитана на профессиональный софт. В общем, едем дальше. Ставите jackd, в нем настраиваете количество выборок в буфере 4096 и количество периодов на буфер 8 (можно покрутить и другие варианты этих значений). Минимальное количество выборок 128 для данной карты, а количество периодов на буфер 2, можно поэкспериментировать. По сути это те же параметры буфера, что и в pulseaudio, только в их исходном виде, а не расчетные. Ориентироваться в верности можно на сообщения о рассинхронизации, их надо что бы было 0 (это в qjackctl в окне сообщений найдете, вкладка статус, ее то же надо установить). При выше заявленных параметрах у меня так и есть.
Потом pulseaudio заставляете выводить через jackd звук, путем добавления команды, которая выполняется после старта jackd.
Команда
pacmd set-default-sink jack_out
Это то же в параметрах qjackctl задается. Теперь pulsaudio работает микшером и результат выводит в jackd, который напрямую льет звук в alsa драйвер и через него в железку.
В конечном итоге я просто взял qjackctl да поставил в автозагрузку, настроив все параметры в ней. В отличии от pulseaudio параметры работы с буфером понятны и расчетов не требуют, а так же очевидно влияют на работу.
Щелчки исчезнут, звук будет чистый, шелковистый. Причем всегда, во всяком случае я пока не слышал больше щелчков ни под нагрузкой, нигде, даже при воспроизведении нескольких звуковых источников из разных мест и подключении разных клиентов к звуковухе.
Автор: 3draven