Распределенный аудиоплеер на Odroid U2


    Однажды я заметил, что довольно много времени я провожу на кухне, куда звук от колонок, расположенных в комнате доходит плохо. И тогда мне захотелось сделать хороший бесшумный плеер, способный синхронно воспроизводить музыку в нескольких комнатах. Конечно проблему можно было решить простым поворотом регулятора громкости, но этот способ был отброшен как негуманный по отношению к соседям. Другой важный момент заключался в том, что я хотел использовать те же колонки для вывода звука с компьютера. Зачем мне иметь несколько комплектов аккустики в одной комнате?
    Пост получился довольно длиннный, так как я старался уделить внимание соображениям, по которым я выбирал то или иное решение.

    Железо


    • HiFi колонки и усилитель — по комплекту для каждой комнаты. Все устройства в комнате должны их использовать.
    • USB звуковая карта
    • Ethernet — старая добрая надёжная и предсказуемая среда передачи данных. Лучшее решение, если есть возможность проложить несколько кабелей.
    • NAS — музыку надо где-то хранить. Флеш карты хороши, но их объема недостаточно для хранения loseless музыки, поэтому остаются HDD. Но жесткие диски шумят, так что им самое место в дальнем углу на антресолях или в кладовке. Кроме того, у нормального NAS будет гигабитный порт, а на всех маленьких ARM платах 100 мегабитный.


    Софт


    Синхронное воспроизведение


    Программ, способных синхронно воспроизводить звук очень мало. Наше ухо может различать малейшие отклонения и мы начинаем слышать эхо. Удовольствия столько же, как от объявлений прибывающих поездов через громкую связь на вокзале в глубинке. Хороший результат показывают две звуковые системы: jack и PulseAudio. Говорят, что еще неплохо работает squeezebox. Я также пробовал mplayer и vlc, но добиться от них приемлемой синхронности не получилось. Vlc неплохо справляется с видеопотоком, если использовать RTP multicast, но у звука наблюдается заметное эхо. А с video on demand синхронизации вообще нет, так как каждый клиент получает отдельный поток. Mplayer просто ужасно тормозит, если включить udp синхронизацию.
    Так что, если нет необходимости синхронно отображать видео, то jack или PulseAudio являются хорошим выбором за счет своей гибкости. Если же нужно видео… дайте мне знать, если найдется что-то действительно работающее.

    Jack vs PulseAudio


    После длительных поисков оказалось, что никакой борьбы между ними нет: их писали для совсем разных целей. Мне не нужны очень короткие задержки и огромная гибкость в коммутации потоков во время работы для того, чтобы слушать музыку. Зато я хочу меньше грузить CPU и не гонять пакеты по сети, если ничего не воспроизводится. Все, что мне надо — это включать и выключать заранее определенные выходы. Поэтому в моём случае PulseAudio является предпочтительным выбором.

    PulseAudio


    Hint: Первым делом надо правильно настроить часы. Если они будут плохо синхронизированны между устройствами, могут возникать странные баги. Поэтому везде надо установить ntpd.
    Настроить синхронное воспроизведение можно несколькими способами. Можно использовать module-combine-sink совместно с module-tunnel-sink, а можно использовать широковещательные rtp потоки. Я выбрал module-combine-sink, так как он дает значительно меньшую зарежку. Но он не работает через WiFi, а rtp может быть и будет. Но я не люблю WiFi, я люблю проводочки.
    Еще одна тонкость заключается в том, что PulseAudio может работать либо как общесистемный демон, либо для каждого пользователя отдельно. Последнее является предпочтительным решением, в основном из-за соображений безопасности, например, чтобы пользователи не могли отключать или перенаправлять чужие потоки. Но если речь идет о клиенте без X11, то остайтся толкьо системный режим. А проблемы с безопасностью… так это же ровно то, что мне надо: общий звуковой сервер для нескольких доверенных пользователей.
    Если вы выбрали систеный режим, то не забудте добавить себя в группу pulse-access. Файлы настроек находятся в каталоге /etc/pulse/. Для системного режима это system.pa, а для пользовательского default.pa.

    Выходные устройства


    Это устройства, к которым подключены усилители. На них надо разрешить удаленный доступ, так что добавляем в конфиг module-native-protocol-tcp:

    load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/16


    Входные устройства


    На устройстве, с которого будет идти звуковой поток, надо настроить удаленные выводы. Для каждого выходного устройства (кроме локальных выходов) добавляем строки следующего вида:

    load-module module-tunnel-sink server=<output device address>


    Теперь нужно научиться динамически включать и выключать их. PulseAudio посылает данные даже на заглушенные (muted) каналы, но не посылает на выключенные (suspended) выходы. Чтобы не выключать выво звука для всех приложений, создадим промежуточные выходы для каждого реального выхода:

    load-module module-combine-sink sink_name=kitchen_mpd slaves=tunnel-sink.u2k.home
    load-module module-combine-sink sink_name=hall_mpd slaves=alsa_output.usb-ESI_Audiotechnik_GmbH_Dr._DAC_nano-01-nano.analog-stereo
    


    И, наконец, объединим эти выходы в один:

    load-module module-combine-sink sink_name=mpd_sink slaves=kitchen_mpd,hall_mpd
    


    Теперь, после перезапуска PulseAudio можно включать и выключать отдельные выходы командами вида:

    # Выключить
    pactl suspend-sink hall_mpd 1
    # Включить
    pactl suspend-sink hall_mpd 0
    


    Ура! Настраиваемый выход, синхронно воспроизводящий звук через несколько выходных устройств, подключенных по сети, готов.

    Восроизведение музыки


    Теперь к этому выходу надо подключить какой-нибудь проигрыватель. Я выбрал MPD, так как им можно удаленно управлять почти с любого устройства. Это удобно, когда музыку слушаешь на кухне, а компьютер стоит в комнате. Настройка очень простая:

    audio_output {
            type            "pulse"
            name            "Pulse"
            server          "u2.home"               # optional
            sink            "mpd_sink"
    }
    


    Но при наличии нескольких выходов хочется еще ими и управлять через интерфейс MPD. Я написал небольшой хак для MPD, который позволяет это делать. Это модифицированный NullOutput, который выполняет произвольные команды при включении и выключении. Остается настроить эти выходы на соответсвующие вызовы pactl и спрятать основной (первый) выход другим маленьким хаком.

    audio_output {
            type            "exec"
            name            "Зал"
            enable          "pactl suspend-sink hall_mpd 0"
            disable         "pactl suspend-sink hall_mpd 1"
    }
    
    audio_output {
            type            "exec"
            name            "Кухня"
            enable          "/usr/bin/pactl suspend-sink kitchen_mpd 0"
            disable         "/usr/bin/pactl suspend-sink kitchen_mpd 1"
    }
    


    Совместное использование


    На стационарном компьютере я прописал в /etc/pulse/client.conf
    default-server = u2.home

    В результате все приложения связываются с удаленным звуковым сервером напрямую. Работает безотказно.

    Проблемы


    Основная проблема, с которой пришлось столкнуться — это ненадежность. Если пропадает сетевое соединение PulseAudio удаляет соответствующие выходы и не пересоздает их. Приходится перезапускать вручную.
    Другая проблема заключается в том, что состояние выходов в MPD и PulseAudio может не совпадать. Приходится лишний раз наживать на кнопку, чтобы включить или выключить звук.

    Достоинства


    Я могу слушать музыку за завтраком и за ужином. Более того, музыка хорошо слышна в большей части квартиры и играет не тихо и не громко. По-желанию отдельные зоны можно отключать. Управлять ей легко и просто. В общем, коте одобряет:



    P.S. Конкретное сочетание dr. DAC nano и odroid U2 не очень удачное. С большой вероятностью эта звуковая карта будет работать только через USB хаб из-за недостаточной емкости конденсатора на VBUS у U2.
    Share post

    Similar posts

    Comments 49

      0
      На самом деле, шикардос. Сам часто за собой замечаю, что рассуждаю так: «Надо поесть. Включу музыку на компе, пойду на кухню готовить». Прихожу на кухню — музыку нифига не слышно. Хотел реализовать «топорный» вариант решения проблемы, но руки не дошли: берем андроид-устройство, оставляем его, допустим, на кухне, ставим на него какую-нибудь стримящую софтину (типа Emit, VLC) и к ведроиду подключаем акустику. profit.
        +6
        А я просто беру с собой беспроводную мышку и колесиком регулирую звук.
          +3
          А я просто беру еду с собой к ПК.
        +1
        Однозначно вещь )
        Возьму на заметку, нужно будет применить при случае.

        А с Jack вы не пробовали разобраться, может быть там не будет таких проблем?
          +4
          Пробовал. Я его первым настроил. Им сложнее управлять: по-умолчанию потоки никуда не подключены, надо держать запущенным qjackctl, который будет следить за появлением новых потоков. Правила, что куда подключать задаются регулярными выражениями. Т.е. если надо динамически перенасраивать потоки — все очень удобно и просто, авот с правилами надо немного попотеть.
          Потом он всегда гонит данные по сети, даже если ничего не поспроизводится. А это 20 мегабит на поток. Во-вторых он ест 3% CPU, а PulseAudio 1%. В третьих PulseAudio стоит по-умолчанию в убунте и многих других дистрибутивах, это mainstream, много людей запускают с ним много разных программ, технология отработана.
          А у jack есть чёткая ниша системы для профессионального редактирования звука. Я в эту нишу не попадаю.
          0
          Sonos не дешевле будет? (если нет уже колонок с усилителем в каждой комнате). или AirPlay?
            +6
            У меня нет и не будет i-устройств. Более того, у меня дома нет даже windows устройств. AirPlay — это закрытая технология от apple, для которой, впрочем, есть реализации полученный с помощью reverse engeneering. В итоге:
            1) Чтобы вещать через AirPlay мне нужно будет использовать тот же PulseAudio.
            2) Управлять этой штукой я нормально не смогу.

            А по деньгам сложно сказать. Если я правильно понял, чтобы получить stereo надо купить два sonos'а. А сравнивать качество колонок в sonos'е и тех, что у меня, я вообще не берусь.
              0
              У меня стоит Sonos Connect, который подключен к ресиверу Onkyo TX-NR609 и паре Tannoy Mercury; наверху стоит маленький Sonos Play:3 – разумеется, качество его сильно ниже если сравнивать с большими колонками, но все-таки не настолько как можно было ожидать. Играл с Play:5 — он еще лучше (хотя и дороже).
                0
                Для Sonos не обязательны iПродукты. Подключается по ethernet головное устройство, которое раздаёт сигнал на остальные. Управляется собственным пультом управления.

                По цене, конечно, не айс. Качество звука спорное, как у любой беспроводной системы.
                  0
                  Я не согласен с вами. В xbmc есть ограниченная поддержка airplay (видео и музыку можно воспроизводить), причем доступное вполне легальным способом, нужно только itunes поставить.
                    0
                    Если я правильно понял, то sonos умеет:
                    1) Играть файлы с сетевого хранилища, а также интернет радио
                    2) Воспроизводить звук, который передается на него через AirPlay (vendor lock in на apple)
                    3) Забирать произвольный звук с аналогового входа
                    4) Волшебным беспроводным образом синхронно воспроизводить этот звук на произвольное число приёмников этого же вендора (vendor lock in на sonos)
                    5) Гибко конфигурироваться с помощью специального софта (vendor specific)

                    С чем же из моих тезисов вы согласны? С тем, что AirPlay закрытая технология? С тем, что существует открытая, реализация, полученная с помощью reverse engineering? Или с тем, что мне негде запускать этот самый специальный софт, которым он управляется? В семье на два человека только одно устройство с android. Это не удобно.

                    P.S. В официальных сборках xbmc с xbmc.org нет поддержки AirPlay, она на всякий случай отключена т.к. она нелегальна в США.
                    P.P.S Куда нужно ставить itunes? На linux или на android? И зачем для вещания через AirPlay xbmc, если есть itunes?

                    Т.е. я понимаю, что sonos предлагает вполне хорошее решение которое довольно легко устанавливается и работает. Но мне это решение не очень подходит.
                0
                Я эту проблему решил простым маленьким микшером. Заодно и эквалайзер удобно крутить, когда Вк музыку слушаешь :)
                  0
                  Это хорошее решение. В моем случае можно было даже просто подключиться ко второму выходу усилителя. Но оно требует прокладки аудиокабелей. А еще у меня остается немного больше свободы в плане раскидывания потоков от разных приложений по разным колонкам.
                  +3
                  Извиняюсь за возможное нубство, но, коль проблема синхронного воспроизведения такая нетривиальная, не проще банально переключать воспроизведение на акустику в той комнате, куда собираемся идти, каким-нибудь пультом?
                    0
                    можно ещё fm модулятор использовать, подсоединённый к компу. придётся немного усилить его, правда.
                      +2
                      Было бы странно хранить все во flack'ах, а потом загонять в узкие рамки fm передатчика.
                        0
                        У вас во всех комнатах установлены аудиосистемы такого качества на которых заметно кардинальное отличие в качестве flac? На кухне, как по мне, главное чтоб что-нибудь бренчало.
                          0
                          На кухне старый японский аудиоцентр. Но я думаю, что и на нем я смогу отличить. А в комнате вполне приличные колонки и усилитель.
                          В случае использования fm передатчика синхронизация будет достигаться за счет того, что все приёмники будут получать один и тот же сигнал и, в идеале, затрачивать одинаковое врмя на его обработку. Как только один из выходов будет использовать что-то другое, надо будет заморачиваться с синхронизацией.
                          И еще есть проблема, что в столице частоты забиты очень плотно, свой передатчик воткнуть некуда. Он будет конфликтовать с какой-нибудь радиостанцией, что не добавляет качества звука.
                            +1
                            FM сигнал не сложно отличить на практический любой аудисистеме даже неподготовленному человеку. Это mp3 320kbit и flac сложно на слух различить — а FM канал и mp3 вообще влет, у FM вообще все плохо.
                              0
                              Я прошел тернистый путь от FM передатчика до…
                              1. FM передатчик вещал на ванную и кухню, но такого «качества» я не вынес даже в ванной. Хотя тоже хотелось, чтоб бренчало.
                              2. Развел по квартире медные провода. Благо жил на первом этаже и смог все провода проложить по подвалу, просверлив дыры в полу. Это было спорное решение, т.к. в кухне звук затухал из-за 20м кабеля. Зато синхронизация была абсолютной.
                              3. После переезда не было возможности прокладывать кабеля. И, вообще, появился экзистенциальный вопрос: как доставлять музыку к усилителю. Попытался использовать bluetooth c A2DP поддержкой. USB Dongle для компьютера (Creative) плюс приемник, заказанный в Англии, обошлись в 150 евро. Результаты разочаровали: работа только в пределах 4х метров, частые замедления музыки, ну и качество было все же не CD.
                              4. Sonos Connect и все встало на свои места. (Сейчас 350 евро). Оптический выход. Из недостатков, только невозможность передать что-то большее, чем стерео звук (например 5.1), и цена. Все остальное только плюсы. WAT прошел на отлично, т. к. управляется с любого смартфона или с компьютера.
                                +1
                                по 4. squeezebox-у, если сказать 100 Vol, и отдать с него по оптике на ресивер, и скормить ему wav, внутри которого dts, то все срастается. естественно, если начать крутить громкость, то исходный поток железкой изменяется и ресивер дтс не видит.
                                Может быть, сонос тоже так умеет?
                        0
                        Автор, а у вас не было проблем с воспроизведением видео по сети через pulseaudio? У меня, по какой-то причине, в VLC начинает фреймрейт прыгать со временем, а mplayer просто останавливает картинку, но звук продолжает идти. Использовал module-native-protocol-tcp.
                          0
                          Попробуйте поставить ntp и синхронизовать время. PulseAudio считает, что latency у системы воспроизведения равен разнице хода системных часов.
                          0
                          А ethernet обязательно? Дома есть wifi n/ac
                            0
                            У меня на WiFi n звук какое-товремя идёт, а потом затыкается. И с PulseAudio и с Jack. Возможно module-rtp-send и module-rtp-recv будут работать, но говорят, что там ненастраиваемя задержка звука в полсекунды.
                              0
                              Задержки звука будут, имхо
                                0
                                С задержками есть одна тонкость: если музицировать — то реакция на органы управления должна быть мгновенная. Задержка должна быть в пределах нескольких миллисекунд. Если смотреть фильм или играть в игрушку, то к синхронизации картинки и звука требования ниже. Думаю, что даже в пределах сотни миллисекунд. А если просто слушать музыку, то вам абсолютно все равно. Ну будет эффект от кнопки play/pause слышен через полсекунды-секунду.
                                  0
                                  Задержка воспроизводимого звука будет, соответственно вы будете слышать эхо, т.к. будет рассинхрон звука в разных комнатах — что полностью лишит затею смысла :))
                                    0
                                    Отличие Jack и PulseAudio от аудиоплееров как раз в том, что они умеют измерять задержки. Как следствие, они могут подгонять воспроизведение так, чтобы оно шло синхронно. Но когда задержки в сети постоянно меняются (а в беспроводных сетях это частое явление из-за ретренсмиссий потерянных пакетов), иногда не хватает размера буфера и звук запинается.
                                      0
                                      По моему опыту общения с Pulseaudio он не тормозит поток на одном устройстве, если второе с задержками — он просто выплевывает сигнал, его отличия от плееров в другом. Это можно решить, если в конфигах прописать, допустим, задержку в 0.3 сек для устройств, подключенных по проводу и без задержки сигнала для wifi устройств (естественно, задержку надо настраивать, я не знаю сколько она на самом деле).
                                    +1
                                    При просмотре фильмов задержки тоже не важны, так как в нормальных плеерах (вроде VLC) можно легко настроить точную задержку видео (равную задержке звука), и получится то же самое, что и с музыкой. А вот игры, да…
                                +6
                                Котэ конечно же шикарный!
                                  0
                                  А если поставить разветвитель с выхода, один провод на колонки в комнате, другой на колонки на кухне? Проще не придумаешь.
                                    0
                                    Есть неплохой шанс сжечь выход звуковухи.
                                      +1
                                      Ну через какой-нибудь усилитель, я не знаю :) Т.е. смысл — физически из одного выхода получить два.
                                    +2
                                    Вообще в современных av-ресиверах есть функция «zone2» предназначенная как раз для этого. С раздельным управлением громкости, и даже с выбором различных источников.
                                      0
                                      Согласен. Это довольно обкатанная технология. Берется звуковая карта с большим числом выходов и дальше выходы используются для независимых колонок. Простота еще и в том, что у всех выходов общий источник тактирующих сигналов, поэтому их не надо отдельно синхронизировать.
                                      Только надо тянуть звездой аккустические провода и количество выходов ограничено.
                                        0
                                        Зачем звездой-то?
                                          0
                                          В домашнем компьютере установлена материнская плата с Realtek HD Audio, там 6штук 3,5мм разъёмов. Каждый, через драйвера, можно настроить на вывод звука. Собственно всё.
                                            0
                                            Почти всё. Надо еще дотащить от этой самой карты качественные аудио провода до всех комнат, причем желательно подальше от электропроводки.
                                            Кроме того, я все еще лелею надежду на то, что смогу настроить аналогичное решение для видео.
                                              0
                                              Надо еще дотащить от этой самой карты качественные аудио провода до всех комнат, причем желательно подальше от электропроводки.
                                              Это от планировки зависит, мне обошлось покупкой проводов джек-джек длиной 3,5м и две штуки по 7 м. Прокладка под потолком за карнизами.

                                              Кроме того, я все еще лелею надежду на то, что смогу настроить аналогичное решение для видео.
                                              а вот это, мощный аргумент за Ваше решение.
                                        +1
                                        К сожалению будут фазовые искажения и если слушать два источника, то крыша съедит.
                                          0
                                          В каждой комнате основной источник только один. Стены достаточно сильно ослабляют звук из других комнат. Остается коридор. Но мне пока в нем крышу не сносило, возможно потому, что если стоять там, то оба комплекта колонок находятся в секторе в 30 градусов.
                                            0
                                            Это хорошо. Потому что попытка включить многоканальный звук через ethernet кончилась довольно странными результатами -квадро-звука не случилось
                                          0
                                          В рамках данного топика хотел бы спросить.
                                          1) Купил их emmc модуль, на нем андроид. Подсоединил мышку и клаву, этот модуль, загружается система, но ни мышкой ни клавой ничего сделать не могу.
                                          2) Никак не могу считать данные с этого модуля, там в комплекте ридер идет, пробовал на разных ноутбуках, компах, бесполезно, может это вообще не возможно?
                                          3) Как там дела с 3D ускорение в linux, не допилили?? Еще гдето читал что на этой плате цветность в линуксе 16 бит. Это так?
                                            0
                                            1) С первой проблемой лучше обрахаться на forum.odroid.com. Имеет смысл попробовать воткнуть другую мышку. И другие образы попробовать.
                                            2) Возможно. Там проблема в толщине текстолита переходника. Она не совсем совпадает с толщиной micro sd и на некоторых кардридерах контакт плохой. Решается либо сменой кардридера, либо наклеиванием изоленты на переходник.
                                            3) 3D ускорение есть, давно допилили. 24 битный режим тоже уже допилили, но недавно.
                                              0
                                              Спасибо, буду пробовать
                                            0
                                            НЛО передумало
                                              0
                                              В чем может быть проблема? При добавление module-combine-sink не запускается сервис pulse audio. Можно ли обойтись без этой функции, но также управлять выходами?

                                              Only users with full accounts can post comments. Log in, please.