Про мой сетап Hi-Fi звука.
Тут большая, длинная история про то, как я себе собирал сетап с hi-fi звуком.
Это просто описание личного опыта, который, может быть, кому-то будет полезен. Не претендую на какое-то технарское новшество.
В посте реально много задротства, и разбираться в нём стоит только если вы хотите себе что-то подобное.
Если нет, просто почитайте о том, как страдают эти ваши аудиофилы.
Всё началось с того, что снял квартиру с хорошим звуком - лендлорд оставил мне свой усилок, напольные колонки и CD проигрыватель.
Проигрыватель был сразу убран, потому что ну какие диски, камон.
Но вот на базе усилка и колонок хотелось собрать что-то такое, на чём я смогу слушать Hi-Fi звук, и желательно диджитально, то есть управляя через приложение стриминговой музыкой.
Сам по себе усилок довольно старый, в нём нет никакх мозгов, которые могли бы ходить в сервисы Hi-Fi стриминга (я использую Tidal).
Но, раз нет в нём, значит нужно подключить к нему что-то такое, что могло бы ходить, брать бы оттуда звук, и передавать на усилок. И, повторюсь, этим хочется управлять через приложение с любого устройства.
А ещё, у Tidal есть свой контейнер для Hi-Fi музыки, который называется MQA - это ещё один кодек на стероидах, который заявляет, что файлы в нем будут "ЛУЧШЕ ЗВУЧАТЬ"))
А это значит, что мой девайс должен мочь прожевывать MQA.
Сначала мой выбор пал на технологию Tidal Connect. Это как раз протокол, по которому тот самый Tidal может трансилровать свою музыку на конечные устройства (обычно это ЦАПы).
ЦАП с поддержкой Tidal Connect стоит каких-то ну совсем конских денег, но с ним есть прикол - разработчики, почему-то, где-то моргнули, где-то зевнули, и случайно опубликовали исходники в публичный git репозиторий. Опомнились довольно быстро, и удалили, но было уже поздно - существовала уже куча форков, и люди просто скачали себе.
Так вот, я попробовал завести Tidal Connect на Raspberry Pi, и это не вкатило - я сидел несколько дней, добился того, что Tidal видел мой девас с RPi, и даже говорил, что транслирует на него музыку, но звука не было.
Я решил отстать от Tidal Connect, и посмотреть, что есть ещё. А ещё был плеер Roon, который даже не совсем плеер, а целая инфраструктура для Hi-Fi звука (я расскажу, почему инфраструктура). И Roon поддерживал Tidal, то есть, умел ходить внутри себя в Tidal, и пускать его треки в свой аудиотранспорт. И нёс на борту декодер для MQA (чтобы проиграть MQA нужен декодер и рендерер, об этом тоже расскажу).
Короче, выбрал Roon, начал разворачивать.
У Roon, как у инфраструктуры, есть три типа устройств:
Ядро (core) - ходит за музыкальными файлами, декодирует, применяет эквалайзер, рендерит интерфейс, и так далее.
Конечное устройство (endpoint) - то, что берёт цифровой аудиопоток, и конвертирует его в аналоговый.
Дисплей (display) - отображает то, что происходит, и транслирует через chromecast/airplay это туда, куда попросишь.
И вот эту всё можно запустить на локальном устройстве, например на ноуте, но есть один минус - погасишь устройство, погаснет весь сетап. Нужно было делать что-то серверное, чтобы оно всегда работало.
Тут, в историю, нужен добавить ещё один девайс (я понимаю, вы уже сто раз запутались, но надо) - внешний ЦАП (цифро-аналоговый преобразователь). Это девайс, который берет цифровой поток от Roon/Tidal, рендерит его, и отправляет по проводу в усилок, который отправляет это в колонки.
Я решил, что я все три класса девайсов из Roon подниму на одном компьютере, Intel NUC, благо у меня был, и особо не использовался. И к нему же прицеплю внешний ЦАП.
А чтобы оно всё работало с веб мордой на одном компьюетере, и имело драйвера для ЦАПа, нужна полноценная ОС, Windows/Mac. Ну ладно, проблем то, поставил на NUC Windows, поставил в Windows Roon, подключил в него Tidal, всё должно быть гуд. Включаю. И слышу кучу шумов в звуке. Особенно слышно, когда ничего не играет. Не буду останавливаться на том, как долго я это искал, но в конце нашел, что видимо, в NUCе пробило где-то электрику, и на USB порты приходит что-то лишнее, что мешает ЦАПу. Короче, стало понятно, что NUC точно не может быть конечным устройством, оно должно быть другим. Но NUC по прежнему может ядром, которое делает самые ресурсно затратные штуки.
Ну а раз NUC теперь ядро, то ему не нужен интерфейс, не нужна работа с ЦАП-ом, и значит, не нужна винда - снёс её, поставил специальный линукс от команды roon, который сразу несёт в себе Roon Server. Пока ставил, тоже нашёл всяких проблем (например, на моём NVME SSD диске не создавались ext4 партиции, поменял диск), но всё получилось, первый девайс из цепочки у меня появился.
Дальше нужно было сообразить какой-то ендпоинт и дисплей.
Благо, так как Roon задуман как инфраструктура, у него было спеицальное решение для endpoint - программа для того, чтобы ловить музыкальный декодированный и обработанный аудиопоток с сервера, и отправлять его на внешний ЦАП. Называется это всё Roon Bridge, и его можно развернуть на Raspberry Pi. Благо, RPI у меня тоже были, и я попробовал. Взял родной линукс для RPI 4, и поставил на него руками Roon Bridge - это не вкатило, Roon Server не видел мой девайс. Погуглил ещё, и нашёл готовые дистрибутивы для Raspberry Pi, в которые уже вшит Roon Bridge (RoPieee). Накатил такую штуку, и это вкатило - Roon Server начал видеть мой эндпойнт, и даже смог проигрывать через него звук, и даже корректно передавал на него MQA (это я видел по индикатору на внешнем ЦАПе - когда он работает с roon, цвет индикатора меняется).
Короче, на этом этапе я собрал два девайса из трёх - у меня был сервер, и у меня был эндпоинт. Оставалось научиться отображать это всё на телевизоре (так как он стоит как раз там же, где весь музыкальный сетап, и не дело ему простаивать).
Сначала я решил, что я буду отображать это всё на телевизоре родным приложением Roon для Android. Взял NVIDIA Jetson Nano, накатил туда Android (оказывается, Jetson Nano официально поддерживается в Lineage OS), на андроид поставил приложение Roon, и столкнулся с былинным отказом - приложении roon не умеет в навигацию по пульту, только тачскрин (которого на телике нет).
Погуглил ещё, и нашел в roon поддержку дисплеев через chromecast. Убрал Jetson Nano, ибо тумач по мощности, взял Xiaomi TV Stick 4K, подключил его, и, о чудо, roon увидел его, и предложил рендерить на нём. Я согласился, и это вкатило.
И вот так я собрал прям полный сетап - музыка добывается из серверов tidal, декодируется на roon сервере, отправляется на roon bridge, который передаёт её на внешний ЦАП, который передаёт её на усилок, и тот уже на колонки. Я вижу, что происходит, на телевизоре, и управляю этим всем через приложение на любом устройстве внутри своей wifi сети.
Это была супер потная катка, но я супер доволен тем, что получилось - я слушаю музыку в хорошем качестве, нигде ничего не теряяя по дороге, и выжимая максимум из своего сетапа.
И бонусом ещё идет то, что Roon умеет ходить за музыкой не только в стриминги, но и в какие-то свои папки. У меня на роутере висит сетевой диск, на который я скачал Юрия Антонова (которого нет на стримингах), и попросил Roon ходить на музыкой ещё и на сетевой диск. Теперь я могу слушать Антонова в hi-res и кайфовать.
Выбрал быть счастливым, короче.
Надеюсь, вам было интересно читать)
Ниже фотки и видео того, что получилось, и что участвует в процессе.
Это вот видео того, как оно в итоге работает
Это эндпоинт с внешним ЦАПом на базе RPI4
Это сервер на базе Intel NUC
Это интерфейс приложения на macOS
А это интерфейс приложения на iOS
Ну и закончу пост финальной мыслью - в итоге, всё получилось так красиво и бесшовно, что гости даже не догадываются, как сильно пришлось ради этого всего запотеть.
Выглядит всё так, будто бы оно такое классное из коробки.