SmartHub – opis modułu audio (multiroom)

Jako, że już pojawiło się kilka wpisów związanych z tym modułem, a do tej pory nie opisałem wymagań i założeń dla niego, nadszedł czas aby je zaprezentować. I o tym będzie ten wpis. Zapraszam!

Podstawowym wymaganiem dla tego modułu jest możliwość odtwarzania dźwięków z głośników rozlokowanych w różnych pomieszczeniach. Moduł ma umożliwiać odtwarzanie różnych dźwięków w różnych pomieszczeniach w tym samym czasie. Ma być możliwy wybór, w których pomieszczeniach ma być odtwarzany dany dźwięk – coś na zasadzie miksera audio posiadającego X wejść i Y wyjść umożliwiającego dowolne ich połączenie (standardowy mixer zazwyczaj ma dużo wejść i tylko jedno wyjście – więc to będzie coś bardziej jak router). Wybrany dźwięk powinien domyślne być odtwarzany tylko w aktualnym pomieszczeniu – chyba, że wybrano inaczej. Nie zdefiniowane jest jakie mają być możliwe źródła dźwięku, w jaki sposób będą wybierane wyjścia oraz w jaki sposób ma być ustalane aktualne pomieszczenie. Powinno to być rozszerzalne.

Pomysły na możliwe wejścia mam następujące:

  • Po jednym wejściu liniowym (zwykły kabel 2 x chinch lub mini jack) na każde pomieszczenie. Umożliwi to odtwarzanie muzyki np. ze stacjonarnego komputera lub podłączenie głośników sufitowych do telewizora w zastępstwie kina domowego.
  • UPnP (Universal Plug and Play) – możliwość odtwarzania dźwięku zdalnie na Raspberry Pi poprzez sieć lokalną. Takie funkcje mają np. systemy operacyjne OpenELEC i OSMC – zobacz porównanie systemów dla RPI, które zrobiłem.
  • Bluetooth – jako urządzenia audio oraz do zestaw głośnomówiący do połączeń.
  • Google Cast – implementacja protokołu, jeżeli możliwe będzie uzyskanie jego dokumentacji. Być może próba reverse engineeringu. Jest to na tyle fajny protokół, w którym urządzenie źródłowe jest tylko używane do wybrania muzyki jaka ma być odtwarzana lub jej zmiany. Odtwarzanie natomiast jest wykonywane na urządzeniu zdalnym. Pozwala to na ograniczenie zużycia baterii w przypadku urządzenia mobilnego lub nawet na wyłączenie urządzenia źródłowego, podczas gdy muzyka nadal będzie odtwarzana na urządzeniu zdalnym.
  • Własny mechanizm zdalnego odtwarzania podobny do Google Cast. Wybór piosenki lub listy oraz jej zmiana na urządzeniu klienckim, a całość odtwarzania na urządzeniu zdalnym. Ma to te same zalety co Google Cast.

Jeżeli chodzi o realizację połączeń (hardware) to do Raspberry Pi będzie podłączonych pod USB kilka (X) kart sieciowych stereo. Każda karta będzie obsługiwała jeden wzmacniacz stereo – 2 głośniki, które będą znajdowały się w jednym pomieszczeniu. Głośników może być więcej w danym pomieszczeniu – wtedy po prostu kilka kart dźwiękowych będzie przypisanych do tego samego pomieszczenia. Dźwięk będzie wysyłany do Raspberry Pi w jakiś sposób (jeden z opisanych wyżej lub jakiś inny) i będzie mógł być odtwarzany na jednej lub kilku kartach dźwiękowych. Być może uda się wykorzystać wejście mikrofonowe karty jako wejście liniowe. Poglądowy schemat połączeń poniżej:

audio-schemat

Wstępnie sprawdziłem dla systemu Windows 10 IoT Core i tam API AudioGraph pozwala na takie łączenie wejść z wyjściami. Nie sprawdzałem tego w praktyce, ale w niedługim czasie zamierzam to zrobić. Na pewno możliwe jest odtworzenie dźwięku na konkretnej karcie dźwiękowej i patrząc po strukturze tego API możliwe jest dodanie kilku wyjść do jednego wejścia, którym np. może być plik dźwiękowy.

Jest to wstępna wersja, która wydaje się realizowalna. Być może API nie wspiera takiego łączenia wejść z wyjściami, ale to się okaże po testach – według opisu z dokumentacji powinno to być wspierane. Trzeba będzie także sprawdzić z iloma kartami dźwiękowymi poradzi sobie pojedyncze Raspberry Pi i ile jednocześnie może być odtwarzanych dźwięków.

Jeżeli chodzi o funkcje automatycznego wyboru aktualnego pomieszczenia, to powinna ona działać inaczej dla każdej metody odtwarzania. Wejście liniowe będzie po prostu przypisane do jakiegoś pomieszczenia – podobnie jak przypisane jest wyjście (karta dźwiękowa / wzmacniacz / głośniki). Dla bluetootha będzie do lokalizacja odbiornika np. identyfikowany przez różne nazwy – osobny odbiornik w każdym pomieszczeniu. Dla pozostałych metod podobnie. Jeżeli nie będzie możliwe ustalenie kontekstu pomieszczenia to możliwe są następujące opcje: odtwarzanie tylko w głównym pomieszczeniu, odtwarzanie w domyślnym pomieszczeniu dla urządzenia odtwarzającego lub odtwarzanie ze wszystkich głośników naraz. Myślałem też o automatycznym wykrywaniu położenia w przypadku mobilnych urządzeń jako odtwarzaczy – na przykład beacony w każdym pomieszczeniu lub na podstawie zasięgu do odbiorników bluetooth umieszczonych w każdym pomieszczeniu. Pozwoliłoby to na automatyczne podążanie muzyki za użytkownikiem, co jest ciekawą funkcją. Bajeranckie, co nie?

Jadąc dalej to podobnie z funkcją wyboru, gdzie ma być odtwarzana dana piosenka, powinien to być dedykowany sposób dla każdego sposobu odtwarzania. Niestety protokoły do odtwarzania mogą nie wspierać takiego ich rozszerzenia i wtedy zostaje wybór w dedykowanej aplikacji mobilnej lub webowej.

Projekt modułu w obecnej fazie nie ma zaplanowanych części funkcjonalności, które dobrze żeby realizował. Do rozpracowania będzie temat dźwięków wielokanałowych – więcej niż stereo, czyli 5.1, 7.1 itp. Pozwoli to na korzystanie z modułu jak z kina domowego. Problemem obecnego rozwiązania jest także wymaganie posiadania kabli łączących Raspberry Pi ze wzmacniaczami. Myślę, że będzie trzeba pomyśleć nad jego rozwiązaniem np. poprzez zastosowanie połączenia bluetooth lub innego bezprzewodowego. Dodatkowo trzeba przystosować system, aby działał z kilkoma Raspberry Pi jako odtwarzaczami, co także pozwoli rozwiązać ten problem – ale wtedy prawdopodobnie nie będzie możliwe odtwarzanie tej samej muzyki na kilku Raspberry Pi, a co za tym idzie w kilku pomieszczeniach podłączonych do różnych RPI.

Tak czy inaczej większość funkcji wydaje się realizowalnych. Oczywiście wyjdzie to podczas testów i implementacji, która może już niedługo – pierwszy kod jaki będzie działał na Raspberry Pi będzie dotyczył właśnie audio. Zresztą już pierwszy zalążek kodu dałem we wpisie prezentującym projekt. Jak moduł będzie gotowy to poza odtwarzaniem muzyki będzie on jednym ze sposobów powiadomień. Dzięki temu będzie mógł odtwarzać dzwonek do drzwi lub melodię budzika. Jest na co czekać! Karta SD z systemem Raspbian już czeka na testy, więc… do zobaczenia wkrótce.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *