MyTetra Share
Делитесь знаниями!
Пример настройки каты EMU0404-USB под Linux
Время создания: 03.09.2016 23:34
Раздел: Компьютер - Linux - Звук и аудио - E-MU
Запись: xintrea/mytetra_syncro/master/base/14729348986q2kyi8686/text.html на raw.github.com

Итак, мы остановились на том, что у нас есть более-менее настроенная EMU0404-USB под Линкусом. Однако на текущий момент мы можем послать на карту только один звуковой поток, при попытке воспроизведения второго потока, мы получаем ошибку о том , что "устройство занято". Как говорилось ранее это связано с тем, что карта не имеет аппаратного микширования.


Но и эта проблема решаема, мы можем объявить программный микшер(в терминах ALSA - dmix). Ниже приведен ".asoundrc" c регулятором громкости, и микшером:


pcm.usb_dmix  {

   ipc_key 1025

   type dmix

   slave {

    pcm "hw:1,0"

    rate 44100

    format S24_3LE

    period_time 0

    period_size 1024

    buffer_size 8192

   }

   bindings {

        0 0

        1 1

   }

}

pcm.pre_dmix{

 type plug

 slave{

  pcm "usb_dmix"

  format S24_3LE

  channels 2

 }

}

pcm.usb_sv{

  type softvol

  slave.pcm "pre_dmix"

  control.name "SoftMaster"

  control.card 1

  max_dB 0.0

  min_dB -51.0

  resolution 100

  hint{

    show on

    description "EMU-0404USB Volume"

  }

}


Так, что мы здесь имеем: пропало объявление "usb_44" - правильно, нам не нужен ресемплер, поскольку микшер требует привидения всех потоков к одной частоте перед микшированием, это мы и указали в одyом из параметров dmix. Второе изменение - появлось описание устройства "pre_dmix". Казалось бы, зачем нам нужен какой-то промежуточный уровень между регулятором громкости и микшером? Все просто: микшер в качестве "конечного" устройства понимает только алиасы типа hw:n,m, при попытке подставить plughw, мы не получим ничего кроме ошибки. Поэтому нам нужно перед отдачей потока в микшер преорбразовать его в стерео 24 бит. По сути дела, виртуальное устройство "pre_dmix" выполняет ту же самую работу, что и "plughw".


Итак, открываем две консоли, и готовимся воспроизводить 2 потока одновременно, набираем в обеих консолях:


aplay -D usb_sv foo.wav


и запускаем на выполнение команду в одной консоли, и сразу же в другой. Оба потока должны воспроизводиться одновременно.


Но WTF2!!!! мы слышим существенное ухудшение звука: шум и призвуки слышны даже на наушниках-"вкладышах", не говоря о более серьезной аппаратуре.

Подобная деградация связана с ошибкой в alsa-lib в коде dmix для случая 24 битных звуковых потоков. Поэтому нам необходимо поставить заплатку.


Забегая вперед, скажу - ошибка есть и в регуляторе громкости для 24 битного потока, но вы её не заметите, пока не начнете слушать 24 бинтные файлы, такие, например, как vinyl-ripы 24/96, поэтому мы будем ставить два патча сразу.


Подготовимся к установке патчей: необходимо установить пакеты build-essentials и patch.

   1.Идем на сайт ALSA (www.alsa-project.org) и скачиваем исходники alsa-lib той версии, которая установлена в системе (установленную версию можно подсмотреть в синаптике)

   2.Разархивируем исходники

   3.Открываем консоль и вводим команды (первая команда - вход в папку с исходниками)


$cd alsa-lib-1.0.xx

$wget http://www.pastie.org/512796.txt

$patch -p0 < 512796.txt

$wget http://www.pastie.org/514225.txt

$patch -p0 < 514225.txt

$./configure

$make

$sudo make install


Готово! Перегружать ничего не надо. Повторяем одновременный вывод двух потоков через aplay, как указано выше. Все должно теперь звучать "чисто". (Кстати, поскольку Вы уже "продвинутые", я не напоминаю о необходимости перебивать индексы карты и менять объявление "usb_sv" на "!default" ).

Теперь подходим к самому интересному. Наверное, я буду прав, если предположу, что карты E-MU USB покупают люди, которые неравнодушны к качеству звука, и передискретизация "всего чего только можно" к 44100 является для них, мягко говоря, не совсем уместным 

 Чтож, дело поправимое, готовимся патчить драйвер: с того же сайта ALSA качаем исходники, теперь alsa-driver (обязательно той версии, которая у вас установлена, предполагаю, что на момент написания сего опуса это будет версия 1.0.18)

 Открываем консоль и вводим команды (первая команда - вход в папку с исходниками)


$ cd alsa-driver-1.0.xx

$ wget http://pastie.org/504385.txt

$ patch -p0 < 504385.txt

$ ./configure

$ make

$ sudo make install


Можете пока пойти сделать себе кофе/чай/виски-с-содовоай - компилироваться будет долго, можно, конечно ограничиться компилированием драйверов только для нескольких типов карт (ключ --with-cards для команды configure), но я вам этого делать не советую, можете промахнуться, и встроенная звуковая работать перестанет.

Теперь нужно выгрузить и загрузить заново модуль ядра snd-usb-audio, но проще будет просто перегрузить компьютер, всё таки не сервер настраиваем.


Открываем консоль и запускаем alsamixer для карты №1


alsmixer -c 1


Среди ползунков наблюдаем "Clock rate selector". Он имеет 6 положений, обозначенные 0-20-40-60-80-100. Чтож не совсем user-friendly, но думаю освоитесь, и запомните, что это соответствует 44100-48000-88200-96000-176400-192000.


Попробуем возвратить в ".asoundrc" самую-самую первую версию содержимого - в которой есть только программный регулятор громкости без передисекретизаторов и микшеров.

Теперь повторим эксперимент с запуском какого-нибудь фильма. Звук опять играет ужасно. Переходим в окно alsamixer'а и ставим ползунок "Clock rate selector" в положение 20 (48000кГц). Другое дело!

К сожалению пока не удается сделать патч для alsa-driver, чтобы частота выставлялась автоматически, в зависимости от выводимого потока (как это сделано в WIndows). Также существенным ограничением является фиксирование частоты в dmix - не будешь же постоянно вручную корректировать .asoundrc Поэтому пусть каждый решает для себя, что ему важнее - воспроизведение нескольких потоков одновременно на фиксированной частоте, или возможность менять частоту, и не терять и толики качества материала, но только для одyого потока.


Владельцы Kubuntu могут для изменеия частоты пользовать стандартный Kmix, вместо alsamixer. А вот, пользователям Gnome повезло меньше. Нет, регулятор в гномовском микшере есть, но он "плавный", и попасть в одно из 6 значений довольно тяжело.



P.S. За кадром полностью остался вопрос записи звука. Скажу сразу - запись выше, чем на 96кГц работает некорректно, почему - ещё нужно разобраться, в остальных случаях никаких "косяков" вроде не замечено. Также для тех, кто остановится на варианте с dmix, и желает использовать запись и воспроизведение в дуплексном режиме, например для  общения в Скайпе, советую обратиться к документации по ALSA (алиас asym).


P.P.S. Для "повернутых на качестве звука", типа меня, советую перед usb_sv объявить преобразователь в 32бита(по аналогии с pre_dmix), тогда погрешности регулятора громкости будут на порядок меньше.


P.P.P.S. Обратите внимание на блок hint внутри объявления виртуального устройства, он позволяет "увидеть" системе это виртуальное устройство. Очень странно, но эта возможность практически нигде не описана, хотя существует достаточно давно (c версии альсы 1.0.14). Например она широко используется в KDE 4, начиная с v4.1.



 
MyTetra Share v.0.59
Яндекс индекс цитирования