Как смешать вход S / PDIF и PCM Out (чтобы слышать одновременно PCM и S / PDIF) в Linux?

2292
Lissanro Rayen

В alsamixer я могу выбрать либо выход PCM, либо вход IEC958 (это мой вход S / PDIF), но не оба. Есть ли решение?

Примечание: мне нужен стереозвук, поэтому выбор IEC958 In для одного канала и PCM Out для другого не возможен.

Я даже попробовал OSS4, но это то же самое: не слышит одновременно входы S / PDIF и PCM Out. Я чувствую, что упускаю что-то очевидное, и я был бы очень признателен за любую помощь.

Причина, по которой я хочу это, заключается в следующем: у меня есть два компьютера, и я использую их оба. Однако, чтобы полностью использовать дополнительный компьютер, мне нужно слышать его звуки, не переключая каналы вручную в alsamixer (да, я знаю, что можно написать сценарий и назначить его ярлыку, но это не решает мою проблему).

2

1 ответ на вопрос

2
Lissanro Rayen

Я наконец нашел решение. Я перепробовал много вещей, но все другие конфигурации / метод либо давали мне плохой звук, либо работали аналогично на практике, но были более сложными. Поэтому я дам здесь самое простое решение, которое сработало для меня (и упомяну некоторые альтернативы, которые могут сработать, по крайней мере, для некоторых людей). Я использую Debian Testing, поэтому некоторые вещи, которые я упоминаю, относятся к Debian. Не должно быть слишком сложно сделать то же самое в других дистрибутивах.

Установить JACK

apt-get install qjackctl jackd2 

Настроить ALSA

Запустите эту команду: sudo apt-get install libasound2-plugins Вот мой /etc/asound.conf, вы можете поместить его содержимое в ~ / .asoundrc - но /etc/asound.conf лучше, потому что он общесистемный. Как видите, все относительно просто. Устройство «all» предназначено для JACK, а! Default - для всех не-JACK-приложений. Важно, что! Default имеет тип plug, а не jack, в противном случае вы получите много странных проблем. Вы можете легко адаптировать мой asound.conf к вашим потребностям - надеюсь, понятно, как добавлять или удалять аудиоустройства и каналы. Если нет, прочитайте документацию ( http://alsa-project.org/main/index.php/Asoundrc ).

Единственная проблема в моем asound.conf заключается в том, что аналоговый вход (обычно микрофон) нельзя использовать как монофонический, если вы указали стереофонический аналоговый вход, как я. Еще одна странная вещь заключается в том, что в JACK у меня много XRUN, но они [i] не [/ i] влияют на качество звука в моем случае, поэтому я их игнорирую.

ВАЖНОЕ ПРИМЕЧАНИЕ: Если ваша звуковая карта поддерживает аппаратное микширование, вам не нужен раздел! Default с плагином ALSA JACK для прослушивания звука из приложений, не поддерживающих JACK. Если вы не уверены, на что способна ваша карта, запустите:

cat /proc/asound/card0/pcm*/info | grep count 

Если хотя бы на некоторых устройствах имеется более 1 подчиненного устройства, ваша карта способна к аппаратному микшированию. Если на ваших каналах по умолчанию доступно аппаратное микширование, вы можете удалить раздел! Default из моего примера asound.conf.

Альтернативная конфигурация ALSA (НЕ рекомендуется!) Можно написать asound.conf без плагина ALSA JACK, но в моем случае это привело к плохим звукам с частыми артефактами, похожими на щелчки, на входах, несмотря на очень большой размер buffer_size (иногда несколько артефактов в минуту иногда один артефакт за несколько минут) даже после обновления до ядра PF (позже я объясню, что это). Не удивительно, потому что JACK должен использовать ваши аудиоустройства как можно более непосредственно, а здесь это не так. Если вы хотите попробовать это в любом случае по какой-либо причине, пожалуйста, смотрите мой /etc/asound.conf без плагина ALSA JACK ( http://science.su/stuff/linux/sound/jack/without_alsa_jack_plugin/asound.conf). Он более сложный, чем первый, но я постарался сделать его максимально читабельным. Перед тем как попробовать, убедитесь, что вы используете одинаковые period_size и period в JACK и asound.conf. Я оставляю эту альтернативную конфигурацию в качестве примера для изучения (вы можете увидеть, как использовать различные типы в asound.conf, как микшировать моно в стерео и т. Д.).

Настроить JACK

Вот скриншот моих настроек в qjackctl . Наиболее важными настройками являются «Реальное время», «Устройство ввода» и «Устройство вывода». Все остальное - просто пример рабочей настройки.

Обновление до лучшего ядра

Хорошая идея - попытаться перейти на ядро ​​RT (в конце концов, ядро ​​vanilla будет включать аналогичную поддержку в режиме реального времени, но в обозримом будущем вам придется использовать исправленное ядро, если вы хотите приемлемую задержку звука без артефактов, особенно от аудиовхода) ). Чтобы попробовать ядро ​​RT в Debian Testing или выше, вам нужно просто запустить эту команду (я полагаю, вам нужен драйвер NVidia; если нет, установите вместо него любой драйвер):

sudo apt-get install linux-image-3.4-trunk-rt-amd64 linux-headers-3.4-trunk-rt-amd64 nvidia-kernel-dkms 

Если ядро ​​RT работает для вас, не стесняйтесь пропустить оставшуюся часть этого сообщения. С ядром RT вы можете услышать идеальный звук с низкой задержкой. Но, к сожалению, многие карты NVidia не работают с ядрами RT, и мое было одним из них (GeForce GTX 295), поэтому я не мог использовать RT.

Примечание: с ядром vanilla я сталкивался с артефактами, похожими на щелчки, несколько раз в минуту как на аналоговых, так и на цифровых входах, даже при относительно большом размере buffer_size - это было неприемлемо, поэтому ядро ​​vanilla не работало для моей цели Если это работает для вас, и у вас все в порядке с относительно высокой задержкой звука (буфер), которую вы должны допустить для приемлемого звука, вам, очевидно, не нужно менять ядро.

Драйвер NVidia в Debian уже содержит модификации для работы с ядром 3.4 RT, вам не нужно его изменять, но, к сожалению, он может дать вам черный экран вместо вашего графического интерфейса. В этом случае вам нужно удалить ядро ​​RT и попробовать что-то еще, например PF-kernel ( http://pf.natalenko.name ). Автор не предоставляет файлы deb, но ссылается на чей-то сайт ( http://kernel.night-leshiy.ru ) - этот сайт написан не на английском языке, но на каком бы языке он ни находился, вам не нужно его понимать, просто скачайте файлы deb с ядром pf и его заголовками и установите их с помощью:

sudo dpkg -i linux-*-pf*.deb 

Ядро PF содержит планировщик BFS, и на моей четырехъядерной рабочей станции на базе Xeon с 8 аппаратными потоками (так что ОС воспринимает это как 8 процессоров) оно сократило задержки в худшем случае процессов реального времени (например, JACK) с сотен миллисекунд до нескольких миллисекунды (в моем случае менее 2 мс). Это, конечно, выглядит очень плохим результатом, если сравнивать с ядром RT (с наихудшими задержками процессов реального времени в диапазоне 10-30 микросекунд ), но НАМНОГО лучше, чем ванильное ядро. Лично я использую 128 buffer_size с 2 периодами - это задержка ~ 5 мс; в моем случае этого достаточно, чтобы избежать каких-либо артефактов в звуке после нескольких часов тестирования. С ядром RT возможны еще лучшие результаты.

BFS не лучший планировщик, но он работает намного лучше, чем планировщик в vanilla kernel, если вы хотите низкую задержку, а ядро ​​RT не работает для вас. Если вам нужны как можно меньшие задержки без ядра RT, есть улучшенная BFS со сложностью O (1) вместо O (n) и, возможно, еще лучший планировщик - RIFS. Вы можете найти их здесь ( http://code.google.com/p/rifs-scheduler/downloads/list ), если вы хотите собрать собственное ядро. Если это так, установите пакет ядра и прочитайте это руководство ( http://vanilja.org/kernel ).

Надеюсь, мой опыт кому-нибудь пригодится.

Похожие вопросы