[РЕШЕНО] "Завернуть" Line-IN на цифровой выход IEC958 (S/P Dif)

Автор vladimir_ar, 14 апреля 2014, 15:39:32

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

vladimir_ar

Собственно, сабж. Более подробно:
Есть звуковая (не суть важно - их две на компе - встроенная Intel-HDA и PCI ASUS-Xonar-DS)  с оптическим выходом. Есть внешний ЦАП с оптическим входом. Собирался он с целью отвязаться от шумов компьютера (при сборке акустики с высокой чувствительностью это стало актуально). Все через цифровой выход работает отлично, за исключением одного но - на линейный вход карты подключен спутниковый ресивер и звук по аналогу транслируется на акустику, делать loopback с аналогового входа в цифровой выход карта не умеет.

Задача - как софтварно (другого решения я не вижу) взять звук со входа и перенаправить его в цифровой выход (многопоточность по приложениям работает)? Звуковая система - alsa (пробовал pulseaudio, но он этого тоже не умеет, плюс все его недостатки).
Варианты решения, те, что я вижу:
1. Какой либо плеер, умеющий взять сигнал со входа и сразу проиграть его на выход.
2. Или одна программа читает вход и пишет значения в файл/буфер, вторая берет этот буфер и проигрывает через выход.

Может есть более красивые варианты? Пока ничего внятного в поиске не нашел.
Debian Testing, kernel 3.16-2-amd64, OpenBox
AMD A8-3750 / 16Gb RAM / ATI HD6550D (onboard) / Sound ASUS Xonar - DS
_______________________________
Debian Testing, kernel 3.14-2-amd64, OpenBox
HP-655 AMD E1 / 8Gb RAM / ATI HD7310M

yura_n

Цитата: vladimir_ar от 14 апреля 2014, 15:39:32
звук по аналогу транслируется на акустику, делать loopback с аналогового входа в цифровой выход карта не умеет.
А акустика к чему подключена? К усилителю за внешним ЦАП или к линейному выходу звуковой карты?

vladimir_ar

Пока по аналогу - пока не решен вопрос с входом. А так, собственно, и ЦАП подключен.
К усилителю. Усилок пока по аналогу с карты, но перекинуть шнурки на цап не составит трудностей  ;)
Debian Testing, kernel 3.16-2-amd64, OpenBox
AMD A8-3750 / 16Gb RAM / ATI HD6550D (onboard) / Sound ASUS Xonar - DS
_______________________________
Debian Testing, kernel 3.14-2-amd64, OpenBox
HP-655 AMD E1 / 8Gb RAM / ATI HD7310M

yura_n

#3
Цитата: vladimir_ar от 14 апреля 2014, 16:39:36
Пока по аналогу - пока не решен вопрос с входом.
Может быть я ошибаюсь, но цифровой выход - это тот-же линейный, но без использования встроенного ЦАП (и последующего усилителя). Может быть имеет смысл ресивер подключить к другой звуковой карте?

vladimir_ar

Цитата: yura_n от 14 апреля 2014, 16:45:40
Цитата: vladimir_ar от 14 апреля 2014, 16:39:36
Пока по аналогу - пока не решен вопрос с входом.
Может быть я ошибаюсь, но цифровой выход - это тот-же линейный, но без использования встроенного ЦАП (и последующего усилителя). Может быть имеет смысл ресивер подключить к другой звуковой карте?
Имеется ввиду вопрос с трансляцией линейного входа в цифровой выход карты.
Усилитель не имеет смысла подключать к другой карте. Цель - весь звук должен идти через комп на акустику. Сейчас так и есть - но по аналогу.

Пока получается так
ffmpeg -f alsa -ac 2 -i hw:0,0 -acodec pcm_s16le output.wav | mpv output.wav

Но не нравится, что файл будет до бесконечности расти. И через время mpv вылетает с
Exiting... (End of file)
Т.е. такое решение - костыль, еще и неустойчивый.
А можно ли ffmpeg -ом сырой поток на выход передавать? Или организовать буфер и заставить mpv или аналогичный проигрыватель читать из него?
Debian Testing, kernel 3.16-2-amd64, OpenBox
AMD A8-3750 / 16Gb RAM / ATI HD6550D (onboard) / Sound ASUS Xonar - DS
_______________________________
Debian Testing, kernel 3.14-2-amd64, OpenBox
HP-655 AMD E1 / 8Gb RAM / ATI HD7310M

yura_n

А если Audacity натравить на вход, запись, затем пауза. Это конечно тоже на ахти решение, но все-же.

vladimir_ar

Цитата: yura_n от 14 апреля 2014, 17:07:50
А если Audacity натравить на вход, запись, затем пауза. Это конечно тоже на ахти решение, но все-же.
Совсем не понял. Особенно про паузу. Нужна реалтайм трансляция с линейного входа в цифровой выход карты.

Сообщение объединено: 14 апреля 2014, 17:15:25

Это звук со спутникового ресивера.
Debian Testing, kernel 3.16-2-amd64, OpenBox
AMD A8-3750 / 16Gb RAM / ATI HD6550D (onboard) / Sound ASUS Xonar - DS
_______________________________
Debian Testing, kernel 3.14-2-amd64, OpenBox
HP-655 AMD E1 / 8Gb RAM / ATI HD7310M

yura_n

#7
Цитата: vladimir_ar от 14 апреля 2014, 17:14:49
Совсем не понял. Особенно про паузу. Нужна реалтайм трансляция с линейного входа в цифровой выход карты.
Ну в обычном случае, когда запись стоит на паузе, захватываемый сигнал можно при необходимости прослушивать и на выходе. Команда ffmpeg ведь у вас хватает в файл, а файл затем читается с помощью плейера.

Сообщение объединено: 14 апреля 2014, 18:24:00

Кстати, возможно такое решение менее костыльным будет:

ffmpeg -f alsa -ac 2 -i hw:0,0 -acodec pcm_s16le -f alsa default

qupl

vladimir_ar, посмотри в настройках vlc (режим "все"). Там можно указать устройство аудиоввода ALSA и устройство аудиовывода.

vladimir_ar

Цитата: qupl от 14 апреля 2014, 20:04:23
vladimir_ar, посмотри в настройках vlc (режим "все"). Там можно указать устройство аудиоввода ALSA и устройство аудиовывода.
qupl, спасибо за наводку. С vlc все получилось. В режиме потока. Только с alsa он дружить не захотел, на прописывание устройств ввода и вывода ругался на отсутствие pulseaudio server. Пришлось установить pulseaudio и сразу же в настройках vlc на вкладке Устройства - Запись звука появился выбор из доступных устройств ввода, а далее уже просто - выбираем нужное -> Поток -> и далее проходим простой диалог настройки потока. Все работает. Задержка по звуку есть, но минимальная, дискомфорта при просмотре не вызывает. Осталось разобраться с запуском из консоли с нужными параметрами (чтоб каждую перезагрузку не настраивать руками).

Всем спасибо!
Debian Testing, kernel 3.16-2-amd64, OpenBox
AMD A8-3750 / 16Gb RAM / ATI HD6550D (onboard) / Sound ASUS Xonar - DS
_______________________________
Debian Testing, kernel 3.14-2-amd64, OpenBox
HP-655 AMD E1 / 8Gb RAM / ATI HD7310M

qupl

Должен и с ALSA, по идее. Конечно гуевину держать ради такой задачи постоянно запущенной плохо, но других вариантов не знаю, не было нужды.

vladimir_ar

Все оказалось намного проще - эти функции умеет pulseaudio, только не через GUI, а через терминал.
Подмешать аудио поток в сигнал микрофона. Как?
Только задача отличается от рассмотренной на форуме linux.org.ru.

Проверял решение на работе, поэтому просто перенаправлял звук с линейного входа одной карты (Asus Xonar D3 (USB)) на другую (Intel HDA).
Направляем звук с линейного входа одной карты на выход второй:
pactl load-module module-loopback source=alsa_input.usb-C-Media_Electronics_Inc._USB_Advanced_Audio_Device-00-Device.analog-stereo sink=alsa_output.pci-0000_00_1b.0.analog-stereo
Список  устройств входа смотрим так
pactl list sources
У меня это alsa_input.usb-C-Media_Electronics_Inc._USB_Advanced_Audio_Device-00-Device.analog-stereo
Список выходных устройств смотрим
pactl list sinks
У меня alsa_output.pci-0000_00_1b.0.analog-stereo.

Собственно, все. Звук транслируется без задержек, присущих программному способу.
Debian Testing, kernel 3.16-2-amd64, OpenBox
AMD A8-3750 / 16Gb RAM / ATI HD6550D (onboard) / Sound ASUS Xonar - DS
_______________________________
Debian Testing, kernel 3.14-2-amd64, OpenBox
HP-655 AMD E1 / 8Gb RAM / ATI HD7310M

qupl

ЦитироватьЗвук транслируется без задержек, присущих программному способу.
Это тоже программный способ только с меньшим количеством костылей.  :D

vladimir_ar

По крайней мере этот вариант более естественен  ;)
А вообще я эпично протупил - у меня, оказывается, на ресивере есть S/Pdif выход, а на карте Asus Xonar DS недокументированный S/Pdif вход, но под линуксом он доступен. Осталось преобразователь наколхозить из оптики в электрический формат (но приемник запасной от постройки ЦАПа остался  :) ).

Сообщение объединено: 17 апреля 2014, 23:58:02

Зато наконец-то разобрался с pulseaudio  :)
Debian Testing, kernel 3.16-2-amd64, OpenBox
AMD A8-3750 / 16Gb RAM / ATI HD6550D (onboard) / Sound ASUS Xonar - DS
_______________________________
Debian Testing, kernel 3.14-2-amd64, OpenBox
HP-655 AMD E1 / 8Gb RAM / ATI HD7310M

vladimir_ar

Последний штрих к решению.
Сделал преобразователь TOSLINK -> S/Pdif и подключил спутниковый ресивер к IEC958 входу. Конструкция трансляции каналов та же
pactl load-module module-loopback source=<имя источника> sink=<имя выхода>
Сразу первые грабли - при включении в первый момент звук идет синхронно, но постепенно отстает от изображения - "уходит назад" все больше и больше. Причина - разные частоты дисретизации карты (48000) и выхода ресивера (44100). Лечится установкой в
/etc/pulse/daemon.conf
default-sample-rate=48000
Получаем  синхронный звук (ну почти - что по аналогу, что по цифре есть легкое стабильное отставание звука ~100ms).

Отставание лечится применением параметра latency_msec=1
pactl load-module module-loopback latency_msec=1 source=<имя источника> sink=<имя выхода>

Последние грабли - при переключении каналов ресивера пропадает кратковременно цифровой поток на входе, pulseaudio заикается, проигрывает последний кусок буфера (~0.5s) и затем, при восстановлении цифрового потока на входе звук идет с задержкой в эти же 0,5с. При следующем переключении каналов ресивера задержка увеличивается еще на пол-секунды и т.д.

Лечится прописыванием в /etc/pulse/default.pa
load-module module-udev-detect tsched=0

После всех этих действий звук синхронный - при одновременном звучании телевизора и компьютера разбежности в звуке не слышно.
Debian Testing, kernel 3.16-2-amd64, OpenBox
AMD A8-3750 / 16Gb RAM / ATI HD6550D (onboard) / Sound ASUS Xonar - DS
_______________________________
Debian Testing, kernel 3.14-2-amd64, OpenBox
HP-655 AMD E1 / 8Gb RAM / ATI HD7310M