Introduction #
So i wanted to start an individual project that has been brewing inside my head for some time already. Also because i never ever have worked on a big project, i wanted to challenge myself a bit. It will be a project that primarily I myself (and those who are interested) can use. It will be something that already exists on the market, but i want to make the whole thing myself and want to make it opensource as much as possible. I want to make a network media player, kind of like denon HEOS/Denon-home or SONOS or the WIIM-music streamers. But of-course fully DIY and Opensource. This has ben an idea i came up with a few years ago, but till not too long ago, it never has been worked out and was just floating in my head, sometimes keeping me up at night. I wanted a network mediaplayer a long time already. Now i have it that my room has 2 big bookshelf speakers near the seating area in my room and now i just connected an amp and a up2stream network media streamer board to it. This is what takes care of my music needs while studying or being busy with projects when i sit in my bedroom. recently that up2stream module failed and now i have hooked up a basic bluetooth receiver to it. So every time i want to listen to music, i turn on the smartplug giving power to the speakers and bluetooth module, then i connect to the speakers with my computer and play webradio or simply spotify or youtube. This works fine but i want a network mediaplayer that I myself own and can design with features I want it to have. And i also thought it would be a fun project where i can spend a good amount of time and effort in and learn from it in the process. And the end product will hopefully be something i can use myself and be proud of every time i listen to music and or play media/stream it to my own mediaplayer device.
The idea + research of existing solutions. #
So the idea is a network mediaplayer thats inspired by commercial products that already are on the market but is opensource, independent and has the stuff i want/need. First off all, i want to do some research in the pre-exsiting solutions that are available to buy now. Down below i will write a bit about it.
Denon HEOS #
Now called denon home, is a multiroom network connected audio system. It is a line of speakers and HEOS-compatibel products. It is used with the HEOS app and is compatible with the google chromecast framework. Other than the network interface, they also come with aux in, usb in and bluetooth, so plenty of options to choose from on how you want to play audio through them. This way you can stream audio from spotify or other sources easily through the air. I tore down a HEOS speaker one day to repair it for someone and while i don’t have any photos i do have experience and insights on how they work. They are composed of a 2 primary part/board design. A carrier-board which has the amplifier and power regulation and audio inputs on it and a wireless module. The carrier-board interfaces everything and the wireless module is in reality a full SOM (System on module), so basically a singleboard computer but for embedded applications. The computer module runs Embedded-Linux and DENON also does not hesitate to share this detail and in every manual of a HEOS powered product usually is a section with the GPL’ed software like they should. The computemodule does the streaming and wireless multiroom stuff and the MCU on the carrierboard the less demanding tasks like controlling leds, processing button inputs and some house keeping tasks. It talks via UART to the main compute module.
The computermodule is custom made by Arcadyan for the HEOS platform. Because the speakers have a wireless module inside that emits radio frequencies, they have to pass whats called an FCCID check. In the US there are laws that any product sold on the market (primarily focused on being sold in US) have to pass a FCCID check. They check if the frequencies emitted are safe and if they dont interfere with other devices. They usually also do a teardown or writeup about it and thats handy for getting the following details i describe below! The module is called RAX_AIOS4-OS. Here is the FCCID website on it. In the case of this module, its very well described and you can find a OEM manual and even internal photos of it. From the manual we can see that its indeed made by Arcadyan technology and is meant for audio products. We can see that it sports a Broadcom BCM58305 cpu running at 1.25GHz and its a dual-core ARM9 processor. It is accompanied by 256MB of DDR3L DRAM. It also comes with 4Gb of flash memory, which stores the firmware. The firmware is a custom embedded linux developed by (probably) arcadyan and DENON. It consist of a Bootloader, kernel, Linux userland and rootfs and on top of that the custom application stack that makes these speakers work and is the heart of these speakers. They update firmware over the air and it seems they connect to some OTA server and connect using their own identification stuff/user-agent as when i tried to go to the OTA server, it denied access due to security of course. This 2 part architecture is interesting and it seems to work really well and isolates the 2 halves that make it up. Sadly while they do describe the fact they use GPL software, you can only access it on request via their customer service.
WIIM-Music / Arylic #
So the up2stream module that i had is a streamer board made by Arylic. Here is its website. This alos uses the 2 part design. The carrier board has a MCU on it and there is a small daughterboard that takes care of the wireless streaming stuff. The MCU on this board is made by MVSilicon (Mountainview-silicon) and partnumber is BP1064A2. Its a 32bit risc microcontroller with built-in bluetooth and DSP. This talks over UART to the wireless module. Removing the stickers reveals its powered by a Mediatek MT7688, which funny enough, is a Wifi router/repeater SOC, but can be sued for IOT and Audio tasks. This is a MIPS24KEc powered SOC. Its accompanied by Winbond W9751g6kb-25 DRAM chip. The module also has 16 Megabytes of flash storage storing its firmware, which is Linux based. Sadly neither Linkplay (who made the module) or arylic wanted to share much about its software and just came up with a lame argument of “We wont release software as the multi-room streaming software is hard to implement”. They obviously cant think of a valid cover-up and rather violate the GPL to keep their software secret. Kind of suspicious isn’t it? Anyways, i hooked up my USB to UART to the UART pads on the module and found out it ran Uboot (By ralink technology, but they got bought by mediatek) and a Linux kernel and a small rootfs. I dug a tiny bit further and found out that it has 3 main binaries thanks to This website. The 3 bianries are: Goahead: a http server that it uses for the webui, mv_ioguard: what it uses to talk to the MCU and rootApp is the main magic sauce binary that does all the heavy lifting and makes the product work. Arylic up2stream are not the only product line that seems to use these linkplay modules. They are also used by WIIM-home, in their products.
Sonos #
Sonos seems to stem away from this architecture. They dont use a 2 board solution and instead have a simpler solution. They just have the cpu direcly on the board controlling everything through cpu GPIO pins. They do still use UBOOT and linux although sonos does not always provide it in their manuals as a “this product contains opensource software” notice. But when you do search “Sonos GPL” on google, you do get their GPL/LGPL page where you can download the GPL software. This is a bit better than DENON as DENON only is willing to share the software on request via their customer service.
SO i want to also base my design off this “2-primary-parts” design of the HEOS and Linkplay powered products. But ofcourse with my own hardware combinations.
My design #
Hardware. #
So i want to also have a main computer module + mcu on carrierboard layout. The carrier-board will be a custom PCB i will design myself and then produce through either Jlcpcb or Pcbway. On this PCB will be: power regulation, the MCU, audio inputs and possibly in the future an Amplifier chip if i put one in and want to have a dedicated Amplifier.
MCU (Micro-Controller-Unit) #
So for the MCU i was thinking about 4 choices. Below is a table with the 4 options and their features. I made it together with some claude AI but i did some research to make sure the facts line-up. Down below i will write some more choice consideration stuff.
| Feature | AVR (Arduino, e.g. ATmega328P) | ESP32 | ESP32-C3 | RP2040 (Raspberry Pi Pico) |
|---|---|---|---|---|
| Architecture | 8-bit AVR | 32-bit Xtensa LX6 (dual) | 32-bit RISC-V (single) | 32-bit ARM Cortex-M0+ (dual) |
| Clock Speed | ~16 MHz | Up to 240 MHz | Up to 160 MHz | Up to 133 MHz |
| Cores | 1 | 2 | 1 | 2 |
| RAM | 2 KB | ~520 KB SRAM | ~400 KB SRAM | 264 KB SRAM |
| Flash (typical) | 32 KB | External (4–16 MB common) | External (4–16 MB) | External (2–16 MB) |
| Wi-Fi | ❌ No | ✅ Yes | ✅ Yes | ❌ No |
| Bluetooth | ❌ No | ✅ Classic + BLE | ✅ BLE only | ❌ No |
| GPIO Pins | ~20 | ~34 | ~22 | 26 |
| ADC | 10-bit | 12-bit | 12-bit | 12-bit |
| DAC | ❌ No | ✅ 2 channels | ❌ No | ❌ No |
| PWM | Basic | Advanced | Advanced | Advanced |
| USB | ❌ No (except some models) | ❌ No (needs UART chip) | ✅ Native USB | ✅ Native USB |
| Power Consumption | Very low | Medium–High | Low–Medium | Low |
| Real-time Performance | Excellent | Good (RTOS-based) | Good | Excellent |
| Ease of Use | Very easy | Moderate | Moderate | Easy |
| Price | Low | Low | Very low | Very low |
| Typical Use Cases | Simple control, sensors | IoT, Wi-Fi apps | Low-cost IoT | Embedded, PIO, precise timing |
SO i think the ESP32-C3 will be the best option. It is not only very cheap, it also has integrated usb, wifi, bluetooth-LE (low energy) and has enough I/O and it runs at a pretty reasonable 160 MHz. Also i did some planning with claude and it also said that i should choose the esp32-c3 because it should suit my needs, but i myself also think its a great option! Also because it can be bought as a development board or module, means that opposed to the bare rp2040 chip i don’t need to care about signal integrity and such in my PCB design. It does have just 1 core but i don’t think that it needs more. I believe the renesas mcu inside the HEOS speakers also is a single core and it just needs to drive a statusled, read buttons, talk to the main computer module over UART and maybe switch the amplifier on if i implement one. I’ll also try and make the firmware as good as possible so it wont spend useless cpu cycles doing nothing.
SBC (Single-board-computer) #
SO for the SBC i was thinking about some options: raspberry pi zero2w, raspberry pi cm4, orangepi zero 3, radxa cm3. Below is a basic table that lists some of the stuff i care about.
| Feature | Raspberry Pi Zero 2 W | Raspberry Pi CM4 | Orange Pi Zero 3 | Radxa CM3 |
|---|---|---|---|---|
| SoC | Broadcom BCM2710A1 | Broadcom BCM2711 | Allwinner H618 | Rockchip RK3566 |
| CPU | 4× Cortex-A53 | 4× Cortex-A72 | 4× Cortex-A53 | 4× Cortex-A55 |
| CPU Speed | 1.0 GHz | Up to 1.5 GHz | Up to ~1.5 GHz | Up to ~1.8 GHz |
| RAM | 512 MB | 1–8 GB LPDDR4 | 1–4 GB DDR4 | 1–8 GB LPDDR4 |
| Storage Options | microSD | eMMC / microSD (carrier) | microSD / eMMC (variant) | eMMC onboard / microSD |
| SPI Flash Boot Support | ❌ No | ⚠️ Not typical | ⚠️ Limited / variant dep. | ✅ Yes (common) |
| Wireless | Wi-Fi 4 + BLE | Optional (Wi-Fi/BLE variant) | Wi-Fi 5 + BLE | Optional (depends variant) |
| Ethernet | ❌ No | ✅ Gigabit (via carrier) | ✅ Gigabit | ✅ Gigabit (via carrier) |
| USB | 1× USB 2.0 (OTG) | Via carrier (USB 2/3) | USB 2.0 + USB 3.0 | Via carrier (USB 3.0) |
| Connection Interface | 40-pin GPIO | 2× 100-pin board-to-board | 26-pin GPIO | 2× 100-pin (CM4 compatible) |
| Power Input | 5V via USB | 5V via carrier | 5V via USB-C / pins | 5V via carrier |
| Form Factor | Small SBC | Compute Module (CM form) | Small SBC | Compute Module (CM form) |
| I2S Support | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes |
| Native I2S Pins Exposed | ⚠️ Via GPIO (ALT funcs) | ⚠️ Via carrier design | ⚠️ Limited / board dep. | ✅ Yes (well exposed) |
| Linux Support | Good (Pi OS, mainline ok) | Good (but Broadcom quirks) | Moderate (improving) | Very good (mainline strong) |
I mainly care about things like SPI boot-flash, plenty of ram and a niche to have (not a must) is onboard EMMC. Also it must have a wireless module and usb and ethernet and also should have i2s natively exposed on the pins and have good Linux support. About the ram situation, that means the Raspberry pi zero2w is out of the game as it does not comply with my >1Gb ram rule. Also it lacks a SPI boot-flash i will talk more about later. The cm4 does support it, but there have not been many cases of it being used and its not typical.
Then onto the orangepi and radxa boards. The orangepi has a good cpu, meets my >1Gb ram spec and also has support for onboard SPI flash. As a bonus it comes with an onboard ethernet nic. But i dont see any I2S pins mentioned in the product page or pinout and i read that you need to apply some kernel and devicetree quirks and i also tried it myself but stopped due to loss of motivation and vague descriptions and pretty much no good stuff about it on the internet. Also the wireless module is powered by a Unisoc chip and the mainline kernel has no support for those and you need to apply patches and do all sorts of things. I can of course use the armbian kernel and or bootloader and devicetrees, but then customizing the software wont be easy and i read you need to use the build environment which of course is made for the orangepi boards and must be run on the orangepi boards directly. This means the radxa is the only option left and it seems like a good contestant! It has support for onboard SPI boot flash, has onboard EMMC, meets the >1Gb ram spec and it has native i2s pins for a dac available in the pinout diagram and it is pin compatible with the other compute modules. As a bonus it even uses those lego style connectors like the module inside a HEOS speaker uses and rockchip does have ton of pretty good documentation online and a buildroot/uboot port. It does not have a onboard nic but it does expose the nic connections on the connector. Also the carrier-boards that exist do all have the network interface and other interfaces broken out. And because it’s rpi cm4 compatible, there are also ton of reference designs for PCB design incorporating the module, which i can take inspiration from for my PCB design. It also has a more typical wireless chip/module which does have mainline kernel support. And it says its perfect for multimedia tasks. So i will try that. For development stage i will use the carrier-board to break-out any of the I/O and later will create a PCB around it.
Software #
So for the software i want to create a custom Embedded linux distribution for it. I will use buildroot as a framework to build this tiny embedded linux. Then ontop of that live my custom app stack that consist of a few off-the-shelve binaries, some custom ones and a few custom scripts. I wont create the software completely from scratch as thats not needed and only is more work/pain. I will use the linux userland and its tools and maybe write a few custom short C/C++ programs that interface with the OS. I wont go down to hardware/register level and i dont plan too. I will use the ALSA (Advanced Linux Sound Architecture) framework that Linux and buildroot support. denon HEOS also uses alsa as the underlying audio framework, cause why reinvent the wheel? Also i am not the best programmer, so more middleware stuff. Mostly shell scripts and maybe some python or C/C++ programs to tie it all together. I’ll probably also use a existing audio streaming framework like mpd or squeezebox. I will make a custom Web interface to control and manage it and maybe later create an mobile App.
Multiple partition #
So i want to make it have multiple partitions. Aside form a BOOT partition (kernel and maybe if needed a initramfs), it will have a main ROOT partition with the rootfs and then i also want to have a separate partiton for the configuration/userdata so when updating the system or restoring it, it only will overwrite the ROOT and BOOT partitions and wont touch the configurations that are set like settings and or setup details. Configuration partition will be called “Config” or “CONF”. And i want to make a redudant boot system with an “BOOT_A” and “BOOT_B” and “ROOT_A” and “ROOT_B” partition, over which i write more down below. I could even put the Application stack in its own partition like many other embedded linuxes do but i am not yet sure if i will do this. if i do go this way, the partition will be called “APP”.
Software damaged? no problem! #
I was also thinking about designing it this way so it can never be softbricked. That’s also why i value the SPI boot-flash so much. This SPI boot-flash will be where i store the UBOOT bootloader. SO in case the EMMC flash gets corrupted badly, the bootloader will at least be available. Also it makes it so i only have to update the bootloader when i really need to and thus making it so that the bootloader will be pretty much always there.
Also i want to have redundancy built-in. I know some devices have 2 partitions. So in case partition A gets corrupted, the bootloader can then switch to partition B and vice versa. This is pretty handy and makes it so it pretty much never can be bricked easily. I’ll think about it a bit more but this is my vision about the bootup situation. I could even embed a small always-there recovery Image on the SPI flash but i don’t know if i will go down that path yet.
Also i want to make t possible to restore the system using a USB flash drive. I want to make t that when both partitions are corrupted, that it then can be restored using a USB drive. I was thinking that you could format a USB drive to FAT32 and then put a specific file on it which is a UBOOT ITB (Image-tree-Blob) package that embeds a recovery kernel, recovery ramdisk and a DTB. Then plugging that into the devices usb port will then fix the system. I could also make regular fw_updates possible via USB instead of purely OTA (Over-The-Air), but i am also going to be thinking about that.
Opensource and hackable #
So the project is primarily meant to be a diy implementation of an already existing solution and also one that is opensource. It wont be big or professional like commercial network audio systems, but that’s also not the goal. That’s why one of the goals is also to make/leave this project as open and hackable as possible. It will be meant as a project that can be modified/hacked to the users liking and that also happens to perform its task as a network mediaplayer/streamer. This project will not have any DRM or other laws tied to it. The software and configurations will be made open source and i try and make it as nice while being as open as i can/want with as little restrictions put in as possible. I might change these terms a bit but I’ll try and remind myself of this goal.
Goals and terms #
AI usage #
So because its a solo project mostly, I wont be doing everything 100% myself/from scratch. I will use some AI but let me explain down below why i chose to use it even though I dislike it. Below i will describe the current situation and how i stand in it a bit, but if you don’t want to read all of it, you can Skip to the important sections.
The current AI situation #
If you came across me or my comments, you might know that i am not the biggest fan of Generative AI. I think its really damaging the world as its mostly now being used to generate low quality slop, instead of being used in actual good advancements like the medical sector or solving things like cancer or diabetes. And most people generate music, videos, pictures, code, other art and so on with AI just so they can try to get rich, while filling the market with more slop and making it so companies will hire those AI slop creators instead of actual talented people. Not to mention that most of those AI models also collect a ton of user data and don’t store it in a secure way.
Also the AI hype makes it so RAM and other component prices are through the roof. AI companies and formally those gigantic AI data-centers not only draw massive amounts of power and require a ton of water to keep them cool, they also need parts like RAM, GPU’s and storage drives to do those giant complex calculations. And they take up tons of space. If it would be used for good things like cancer research or research to other diseases or research into improving the world, i don’t mind it, but if its now mostly being used to make slop or propaganda, its is not put to good use and is only there to make the rich even richer. And they scream to us that we must go CO2 neutral, stop consuming a lot of electricity and or water but then they themselves do the same and in my opinion, the rich don’t have any more or less needs than us the normal folk.
Also to feed those AI models, the companies build things called scrapers. Scrapers, or scraper bots go on the internet and scrap the content like links, media, text, knowledge, other assets from websites. Often without permission from those website owners. This can cause tons of web server load and makes it so peoples hard work gets stolen without their permission and gets shared around the world/people by AI models so the original writer or creator is left in the dark. Imagine you spent your hard work and effort into writing a good article, which you hope brings some publicity to your website or blog and AI scraped it without your permission. Now nobody will know you just spent tons of effort and work into writing it on your blog and your blog wont get any more popularity, cause AI served them it.
That’s also why i deployed Anubis on my blog to keep out most of those scraper bots. In the past you simply could add a file to your website called “Robots.txt”, which would say “Please do not scrape this website” or “Please do not scrape X, but you are allowed to scrape Y”, but AI companies have changed the social contract around that they simply ignore these rules as they are just rules that themselves wont enforce stuff on their own. Its like telling someone they should stop doing the bad things they do, often you have to let them know in another way that their behavior is not good. So that’s why i deployed Anubis as a automated captcha without any 3rd parties like cloud flare.
So pretty bad things can be said about AI and it does not have the best reputation, but if its used as a tool, it can be very helpful. AI can really be used to assist into these big solo projects and can be used to assist in coding and creating art, as long as its not the only thing that spits out art/code.
I am still heavily against vibe coders and people who make videos or art with Al as its just soulless slop and they don’t do it to follow their passion anymore, they do it because they want to make a quick buck and are too much into their own bubble that they don’t care that the world gets filed with more slop and that actual creative people who code or make art are slowly vanishing as they are not worth it against the quick slop. So i will use AI in an ethical supportive way. Exactly like a tool, just like how on a mathematics test you can use a calculator to assist in math and unless the calculator has a hole CPU and flash and Os on it, it wont be able to make the math test for you. And at the end, the calculator does not need to pas the test, the person themselves is supposed to do that job.
How i will use AI #
So, as i already said, i will use AI to assist in the process. I will primarily use Claude AI but also sometimes ChatGPT. Why did i chose Claude? Well Claude AI and ChatGPT both have different personalities. ChatGPT is more of a peoples pleas-er and that means that ChatGPT will often just agree with the user or do/say anything that makes them feel good. This also means that often it wont do any huge research into if its even possible or if its plain nonsense what the user says and it often wont give any constructive feedback to the user.
Claude AI is more the engineer/colleague. Claude does not immediately say “I Agree”, it more goes like “Wait, is this possible?” or “wait is this a good idea?” and will let you know if it disagrees or has other advise. I will use Claude as my mentor/consultant who i can always ping for advise, ideas, tips and tops and more. I will also let Claude write some basic templates on which i can then further develop from. And I will let Claude handle the scope of the project and i also will have hims as the consultant who can give feedback on what is nice, what can be improved and what i better not do. Claude will be my engineer colleague, but i will always be the last one who makes a decision as AI is not perfect and it can miscalculate/misinterpret things and thus hallucinate bullshit. I’ll take its feedback and let it handle the scope of the project, but i will also manage that myself. Also because this is my first ever big solo project as a hobbyist engineer/developer, having an extra tool to do the job comes in clutch! I’ll let it write/optimize portions of code but i will write most of it myself. The code will be available on my GitHub and will also be stored on my forgejo git server when i get that figured out.
Conclusion/Outro #
So thats it for now! This project has been brewing in my head and free time already a bit but now I puled the trigger and started actually working on it. The timing is a bit inconvenient as i am in the exam period and thus have barely any time to work on it, but i wil work on it afterwards. I today had a DIS (Digital software engineering) exam which i kind of think/suspect i did not pass, but i dont know yet, but i can redo that one with no issue later. I also have a electronics engineering exam on the 21st of April and the 23th of April is a mathematics exam. I already do the full mathematics course over, so i really hope i pass this time, but i am also not sure/confident about it. We do the math exam and mathematics course in a online web based program called Aleks from MC Graw Hill and we must reach 80% mastered to pass (80% equals a 5.5 in grade terms). On the test we have to have a minimum of 70%, so quite strict borders and i dont fully agree with why we have to get such high percentages as we are not einstein are we? But i’ll try my best and i am working hard basically doing mathematics the whole day untill the exam every day and its tiring but i hope its worth the effort and hard work in the end as i really really want to ditch this annoying course….. So i wont be active much in the following 2 weeks and wil be mostly focussed on my mechatronics course and studying.
So thats what i am up to and what i currently have in mind. I am really stoked to work on the project but i first will focus on school ofcourse. And i also dont yet have all parts available. More posts related to the 309-MusicBox_project will be under the ‘MusicBox_project’ tag.