Korzystając z chwili wolnego wróciłem do jednego ze swoich starych projektów edukacyjnych - sprzętowego radia Internetowego. Projekt zaczął powstawać jakiś czas temu w wyniku frustracji faktem, że komercyjnie dostępne wieże stereo z funkcją "radia internetowego" często są zależne od zewnętrznego serwera. Postanowiłem więc złożyć coś podobnego, gdzie mógłbym po prostu sam ustawiać linki do streamów.
Konfiguracja sprzętowa urządzenia wygląda następująco:
- Mikrokontroler PIC32MX795F512 pracujący na taktowaniu 80 MHz
- Łączność sieciową zapewnia wbudowany w MCU moduł MAC, z zewnętrznym PHY DP83848, mamy więc do dyspozycji Fast Ethernet.
- Dekodowanie streamów bierze na siebie VS1053, chociaż pewnie sam mikrokontroler poradziłby sobie z tym programowo.
- Dostępne nośniki pamięci to karta microSD (po SPI), pendrive oraz niewielki (bodajże 2MB) chip pamięci SPI Flash.
- Wszystko zamontowane na dwustronnej płytce, wykonanej samodzielnie metodą termotransferu. To chyba najbardziej szczegółowa i skomplikowana płytka jaką wykonałem w domowych warunkach.
Od strony programowej wykorzystuję raczej standardowe komponenty, m.in. bibliotekę TCP/IP MLA od Microchipa oraz FATFS. Znaleziony na GitHubie kod do obsługi VS1053 musiałem nieco rozbudować, tworząc maszynę stanów skończonych, odpowiedzialną za odtwarzanie pojedynczych plików, całych katalogów oraz streamów HTTP/ICY z sieci.
Odtwarzanie funkcjonuje w ten sposób, że mam dwuczęściowy bufor (w tej chwili 2x8 kB). Gdy jednak połówka zasila danymi chip VS1053, druga jest wypełniana danymi odczytywanymi z pliku lub przychodzącymi z serwera. Gdy dane się skończą, następuje podmiana. Oczywiście do tego dochodzi jeszcze bufor odbiorczy gniazda sieciowego (4 kB).
Kod odpowiedzialny za połączenie posiada pewne zabezpieczenia. Jeśli dane przestaną przychodzić zostanie wywołany timeout i połączenie z serwerem zostanie zamknięte i zainicjowane ponownie. To samo stanie się w przypadku wykrycia utraty połączenia.
Wszystko to działa dość sprawnie. Tak naprawdę działało nawet na mniejszych buforach (2x4 kB). Jakość dźwięku jest dobra, przycięcia zdarzają się rzadko. Jednak już kilka razy zauważyłem dziwny objaw, który nieco mnie zaintrygował.
Mianowicie pojawiła się sytuacja, kiedy dźwięk zaczął zrywać w sposób przypominający zaciętą płytę gramofonową. Zupełnie jakby nowe dane przestały przychodzić, albo przychodziły w zbyt wolnym tempie. Zazwyczaj występuje też wtedy zrywanie połączenia albo timeout spowodowany brakiem nowych danych. Do tej pory sytuacja wystąpiła kilka razy, zawsze po wielu godzinach pracy urządzenia, jednak mógł to być tylko przypadek. Co w tym takiego intrygującego?
- Gdy sytuacja wystąpi, dotyczy wszystkich streamów, nadawanych z różnych serwerów
- Reset płytki nie pomaga, nawet przez chwilowe odłączenie zasilania
- W tym czasie zupełnie normalnie odtwarzane są pliki z nośników lokalnych, więc to nie problem ze sprzętowym dekoderem
- Po chwili problem mija sam
- Na komputerze podpiętym do tego samego routera i switcha nie doświadczam w tym momencie żadnych problemów z dostępem do Internetu
- Podczas występowania problemu mogę pingować płytkę i odczytywać dane z prostego serwera HTTP, odpalonego na niej. Nie jest więc tak, że traci ona połączenie zupełnie. Zresztą kolejne połączenia z serwerami są inicjowane poprawnie (200 OK) ale zrywanie występuje nadal.
Ktoś ma jakiś pomysł co może być nie tak? Fakt, że reset płytki nie pomaga wskazywałby na jakiś problem z moją infrastrukturą, chwilowo nie mam jednak pomysłów...