The Challenge: Creating an All-in-One Wireless Audio System

It all started with a simple desire: to transform my used LG SK9Y soundbar into a comprehensive wireless audio streaming solution. I wanted to stream audio from multiple sources - my Mac, Apple devices, Windows laptop, and Fire TV - all wirelessly through WiFi and route it to an Alexa home theater setup.

The goal was ambitious: create a seamless, multi-protocol audio streaming system that could handle various streaming standards while maintaining high audio quality and minimal latency.

🎡 The Hardware Foundation: LG SK9Y Soundbar

I purchased a used LG SK9Y soundbar from eBay, which came with several built-in streaming capabilities:

  • Chromecast Built-in: Native Google Cast support
  • Bluetooth 4.0: Wireless audio streaming
  • Wi-Fi Streaming: Network-based audio streaming
  • HDMI ARC: Audio return channel support
  • Optical/Analog Inputs: Traditional audio connections

However, I quickly discovered limitations with the native features:

  • Disappointing Bass: The soundbar’s bass response was underwhelming
  • Limited Max Volume: Not powerful enough for my space
  • Bright Sound Signature: The audio profile was too bright for my preference

This led me to explore external streaming solutions that could enhance the soundbar’s capabilities.

🧩 Audio Streaming Solutions Explored

1. Moode Audio (Raspberry Pi)

Official Resources:

Setup Process:

# Flashing Moode Audio to SD card
sudo dd if=moode.img of=/dev/sdX bs=4M status=progress

# Finding the Pi's IP address
nmap -sn 192.168.1.0/24

# Accessing web UI
# Open browser: http://moode.local or http://<RaspberryPi_IP>

Features Tested:

  • AirPlay receiver functionality
  • DLNA/UPnP streaming
  • Spotify Connect integration
  • Web-based audio player
  • Multi-room audio support

Issues Encountered:

  • Setup completed successfully, but streaming configuration steps were unclear
  • Web UI was functional but lacked intuitive streaming setup guidance
  • AirPlay worked but had occasional audio lag

2. Volumio (Raspberry Pi)

Official Resources:

Setup Process:

# Download Volumio image
wget https://volumio.org/get-started/

# Flash to SD card using balenaEtcher
# 1. Download balenaEtcher from https://www.balena.io/etcher/
# 2. Insert SD card into computer
# 3. Open balenaEtcher and select Volumio image
# 4. Select target SD card
# 5. Click "Flash!"

# Boot Raspberry Pi with Volumio SD card
# 1. Insert SD card into Raspberry Pi
# 2. Connect power and network
# 3. Wait for initial boot (LED activity)

# Access Volumio web interface
# 1. Find Pi's IP address: http://volumio.local
# 2. Or scan network: nmap -sn 192.168.1.0/24
# 3. Open browser to http://<volumio-ip>

# Initial configuration
# 1. Select language and timezone
# 2. Configure network settings
# 3. Set up audio output (HDMI, USB DAC, etc.)
# 4. Configure streaming services

Features Attempted:

  • AirPlay receiver
  • DLNA streaming
  • Spotify Connect
  • Web-based interface
  • USB audio output

Issues Encountered:

  • Setup process got stuck on blank/black screen after initial phase
  • Couldn’t continue setup; no UI response after initial configuration
  • Multiple attempts with different SD cards yielded same result

3. Balena Sound (BalenaOS)

Official Resources:

Setup Process:

# Method 1: BalenaCloud Deployment
# 1. Create account at https://www.balena-cloud.com/
# 2. Create new application
# 3. Download balenaOS image for your device
# 4. Flash image to SD card using balenaEtcher
# 5. Boot device and wait for it to appear in dashboard

# Method 2: Local Deployment
git clone https://github.com/balena-io-playground/balena-sound.git
cd balena-sound

# Configure device variables in BalenaCloud dashboard:
# - AUDIO_OUTPUT: "auto" | "dac" | "bluetooth" | "hdmi"
# - AIRPLAY_NAME: "Balena Sound"
# - SPOTIFY_USERNAME: "your-spotify-username"
# - SPOTIFY_PASSWORD: "your-spotify-password"
# - BLUETOOTH_DEVICE_NAME: "Balena Sound"

# Enable services via device variables:
# - AIRPLAY_ENABLED: "true"
# - SPOTIFY_ENABLED: "true"
# - BLUETOOTH_ENABLED: "true"
# - DLNA_ENABLED: "true"

# Access web interface
# Open browser to http://<device-ip>:3000

Features Tested:

  • Multi-protocol streaming (AirPlay, Bluetooth, Spotify Connect, DLNA)
  • Multi-room audio synchronization
  • Different audio output configurations
  • Docker-based service management

Issues Encountered:

  • Required correct service configuration for audio output
  • Experienced audio dropouts and inconsistent quality
  • Network stability issues affecting streaming reliability
  • Complex service management through BalenaCloud

4. piCorePlayer (Raspberry Pi)

Official Resources:

Setup Process:

# Download piCorePlayer image
# Visit https://www.picoreplayer.org/downloads.shtml
# Download appropriate image for your Raspberry Pi model

# Flash image to SD card
# 1. Use balenaEtcher or similar tool
# 2. Select piCorePlayer image
# 3. Select target SD card
# 4. Flash image

# Boot Raspberry Pi
# 1. Insert SD card into Pi
# 2. Connect power and network
# 3. Wait for boot (check LED activity)

# Access web interface
# 1. Find Pi's IP: http://picoreplayer.local
# 2. Or scan network: nmap -sn 192.168.1.0/24
# 3. Open browser to http://<pi-ip>:8080

# Initial configuration
# 1. Set hostname and timezone
# 2. Configure network settings
# 3. Set up Squeezelite parameters
# 4. Configure audio output

# LMS (Logitech Media Server) setup
# 1. Install LMS on separate server/computer
# 2. Configure LMS to scan your music library
# 3. Add piCorePlayer as a player in LMS
# 4. Configure player settings in LMS web interface

Features Tested:

  • Squeezebox/LMS client functionality
  • Network audio streaming
  • Web-based control interface
  • Multi-room audio support

Issues Encountered:

  • Required separate Logitech Media Server (LMS) running
  • Setup complexity for network audio streaming
  • Limited protocol support beyond LMS ecosystem

5. Snapcast

Official Resources:

Setup Process:

# Installing Snapcast server and client
sudo apt-get install snapcast

# Starting services
sudo systemctl enable --now snapserver
sudo systemctl enable --now snapclient

Features Tested:

  • Synchronized multi-room audio
  • Multiple client support
  • Network-based audio distribution
  • Low-latency streaming

Issues Encountered:

  • Required separate server and client setup
  • Network synchronization issues
  • Complex configuration for stable streaming
  • Potential sync delays between devices

6. Shairport Sync

Official Resources:

Setup Process:

# Installing Shairport Sync
sudo apt-get update
sudo apt-get install shairport-sync

# Enabling and starting service
sudo systemctl enable --now shairport-sync

# Configuration file: /etc/shairport-sync.conf

Features Tested:

  • AirPlay receiver functionality
  • High-quality audio streaming
  • Network discovery via Bonjour
  • Multiple simultaneous connections

Issues Encountered:

  • Sometimes experienced audio lag
  • Required fine-tuning for stable streaming
  • Configuration complexity for optimal performance

🐳 Docker-Based Streaming Solutions

Individual Protocol Containers

I explored deploying individual streaming services as Docker containers:

librespot (Spotify Connect)

Official Resources:

# Spotify Connect receiver
docker run -d --name spotify \
  --restart=always \
  -e DEVICE_NAME=PiSpotify \
  --network=host \
  --device /dev/snd \
  dtcooper/raspotify

Shairport Sync (AirPlay)

Official Resources:

# AirPlay receiver
docker run -d --name=shairport-sync \
  --network=host \
  --device /dev/snd \
  mikebrady/shairport-sync

DLNA Renderer

Official Resources:

# DLNA audio renderer
docker run -d --name=dlna \
  --network=host \
  --device /dev/snd \
  vladgh/minidlna

AirConnect (Chromecast ↔ AirPlay Bridge)

Official Resources:

# Chromecast to AirPlay bridge
docker run -d --network=host \
  1activegeek/airconnect

Snapcast Server

Official Resources:

# Multi-room audio server
docker run -d --name snapcast-server \
  --network=host \
  --device /dev/snd \
  balenablocks/snapcast

Docker Compose Setup

I attempted to orchestrate multiple services using Docker Compose:

# docker-compose.yml
version: '3.8'
services:
  shairport-sync:
    image: mikebrady/shairport-sync
    network_mode: host
    devices:
      - /dev/snd
    restart: unless-stopped
    
  librespot:
    image: dtcooper/raspotify
    network_mode: host
    devices:
      - /dev/snd
    environment:
      - DEVICE_NAME=PiSpotify
    restart: unless-stopped
    
  airconnect:
    image: 1activegeek/airconnect
    network_mode: host
    restart: unless-stopped
    
  snapcast-server:
    image: balenablocks/snapcast
    network_mode: host
    devices:
      - /dev/snd
    restart: unless-stopped

🎡 Standalone Service Installations

Direct Raspberry Pi OS Installations

Shairport Sync (AirPlay Receiver)

# Installation
sudo apt-get update
sudo apt-get install shairport-sync

# Enable and start service
sudo systemctl enable --now shairport-sync

# Configuration file: /etc/shairport-sync.conf
sudo nano /etc/shairport-sync.conf

# Key settings to configure:
# - audio_backend = "alsa"
# - name = "Pi AirPlay"
# - port = 5000
# - buffer_start_threshold = 0.1
# - buffer_max_play_time = 0.2

# Test configuration
sudo shairport-sync -t

# Restart service after configuration
sudo systemctl restart shairport-sync

# Check service status
sudo systemctl status shairport-sync

librespot (Spotify Connect Receiver)

Official Resources:

# Download and install librespot
curl -sSL https://github.com/librespot-org/librespot/releases/latest/download/librespot-linux-armv7.zip -o librespot.zip
unzip librespot.zip
chmod +x librespot

# Run Spotify Connect receiver
./librespot --name RasPiSpotify --device default

GMediaRender (DLNA Renderer)

Official Resources:

# Installation
sudo apt-get install gmediarender

# Run DLNA renderer
gmediarender -f PiDLNA --gstout-audiosink=alsasink

Snapcast (Multi-room Audio)

Official Resources:

# Installation
sudo apt-get install snapcast

# Enable services
sudo systemctl enable --now snapserver
sudo systemctl enable --now snapclient

# Configuration files:
# - /etc/snapserver.conf (server)
# - /etc/snapclient.conf (client)

Bluetooth Audio Sink

Official Resources:

# Installation
sudo apt-get update
sudo apt-get install pulseaudio pulseaudio-module-bluetooth bluez bluez-tools

# Start Bluetooth service
sudo systemctl enable --now bluetooth

# Load Bluetooth module for PulseAudio
pactl load-module module-bluetooth-discover

# Configure PulseAudio for Bluetooth
sudo nano /etc/pulse/default.pa
# Add: load-module module-bluetooth-discover

# Bluetooth device management
bluetoothctl
# Commands to run in bluetoothctl:
# - scan on
# - devices
# - pair <device-mac>
# - trust <device-mac>
# - connect <device-mac>

# Alternative: Use bluetoothctl script
echo -e "scan on\nsleep 10\npair <device-mac>\ntrust <device-mac>\nconnect <device-mac>" | bluetoothctl

# Check audio devices
pactl list sinks
pactl list sources

# Set default sink (if needed)
pactl set-default-sink <sink-name>

πŸ› οΈ Configuration and Troubleshooting

Audio Configuration

ALSA Configuration

# /etc/asound.conf or ~/.asoundrc
pcm.!default {
    type hw
    card 0
    device 0
}

ctl.!default {
    type hw
    card 0
}

PulseAudio Configuration

# /etc/pulse/default.pa
# Load Bluetooth module
load-module module-bluetooth-discover

# Set default sink
set-default-sink alsa_output.0.analog-stereo

Network Configuration

Service Discovery

# Install Avahi for Bonjour/mDNS
sudo apt-get install avahi-daemon
sudo systemctl enable --now avahi-daemon

# Check running services
sudo netstat -tulpn
sudo systemctl status <service>

Port Management

Common ports used by streaming services:

  • AirPlay: 5000, 7000
  • DLNA: 8000, 8001
  • Spotify Connect: 5353
  • Chromecast: 8008, 8009
  • Snapcast: 1704, 1705

Troubleshooting Commands

Audio Testing

# Test audio output
speaker-test -t wav
aplay /usr/share/sounds/alsa/Front_Center.wav

# Check audio devices
aplay -l
pactl list sinks

Service Monitoring

# Monitor service logs
journalctl -u shairport-sync -f
journalctl -u mpd -f
docker logs <container-name>

# Check service status
sudo systemctl status shairport-sync
sudo systemctl status snapserver

Network Diagnostics

# Check network connectivity
ping <device-ip>
nmap -p 5000,8000,8008 <device-ip>

# Check service discovery
avahi-browse -at

πŸ“Š Solution Comparison Table

Solution/ServiceProtocol/FeatureProsConsKey Issues
Moode AudioAirPlay, DLNA, SpotifyWeb UI, Multi-protocolUnclear setup stepsUI stuck/blank
VolumioAirPlay, DLNA, SpotifyClean interfaceSetup complexitySetup stuck on blank screen
Balena SoundMulti-protocol, Multi-roomEasy deploymentService managementAudio dropouts, inconsistent quality
piCorePlayerLMS, Multi-roomStable LMS clientLimited protocolsSetup complexity, LMS dependency
SnapcastMulti-room syncLow latencyNetwork sync issuesComplex setup, sync problems
Shairport SyncAirPlayHigh quality, stableAudio lagConfiguration complexity
Docker-basedAll protocolsFlexible, isolatedNetworking complexityService fragmentation
Individual installsBluetooth, Spotify, DLNADirect controlManual managementQuality, compatibility, lag
LG SK9Y NativeChromecast, BT, Wi-FiBuilt-in, simpleLimited qualitySound quality, max volume

🎯 Key Technical Challenges

1. Audio Latency Issues

Problem: Audio lag between video and audio streams Solutions Explored:

  • Buffer size adjustments in Shairport Sync
  • Network optimization for streaming
  • Hardware audio processing vs software
  • Direct audio routing vs network streaming

2. Multi-Protocol Synchronization

Problem: Coordinating multiple streaming protocols simultaneously Solutions Explored:

  • Docker container orchestration
  • PulseAudio as central audio router
  • Hardware audio mixing
  • Protocol-specific audio routing

3. Network Stability

Problem: Intermittent network connectivity affecting streaming Solutions Explored:

  • Static IP configuration
  • QoS (Quality of Service) settings
  • Network isolation for audio traffic
  • Redundant network paths

4. Audio Quality Optimization

Problem: Maintaining high audio quality across different protocols Solutions Explored:

  • DAC (Digital-to-Analog Converter) upgrades
  • Audio format optimization
  • Bitrate and sample rate adjustments
  • Hardware audio processing

πŸ—οΈ Architecture Evolution

Initial Approach: Single-Service Solutions

Source Device β†’ Single Protocol β†’ Raspberry Pi β†’ Soundbar

Intermediate Approach: Multi-Service Docker

Multiple Sources β†’ Docker Containers β†’ Audio Router β†’ Soundbar

Final Approach: Hybrid Solution

Multiple Sources β†’ Protocol-Specific Services β†’ Central Audio Hub β†’ Enhanced Soundbar

πŸ’‘ Lessons Learned

1. Protocol-Specific Limitations

Each streaming protocol has inherent limitations:

  • AirPlay: Good quality, but can have latency
  • Chromecast: Stable but limited device support
  • DLNA: Universal but complex setup
  • Bluetooth: Simple but quality limitations
  • Spotify Connect: Good integration but platform-specific

2. Hardware vs Software Trade-offs

  • Hardware Solutions: Better performance, less flexibility
  • Software Solutions: More flexibility, potential performance issues
  • Hybrid Approach: Best of both worlds but increased complexity

3. Network Considerations

  • WiFi vs Ethernet: Ethernet provides more stable streaming
  • Network Isolation: Dedicated network for audio reduces interference
  • QoS Settings: Prioritize audio traffic for better performance

4. Audio Quality Factors

  • DAC Quality: External DAC significantly improves audio quality
  • Audio Format: Lossless formats provide better quality
  • Buffer Settings: Balance between latency and stability
  • Sample Rates: Higher sample rates for better quality

For Minimal Latency

# Shairport Sync with optimized settings
sudo nano /etc/shairport-sync.conf

# Key optimizations:
# - audio_backend = "alsa"
# - buffer_start_threshold = 0.1
# - buffer_max_play_time = 0.2
# - audio_backend_buffer_desired_length = 0.1

For Multi-Protocol Support

# Docker Compose with multiple services
version: '3.8'
services:
  shairport-sync:
    image: mikebrady/shairport-sync
    network_mode: host
    devices: ["/dev/snd"]
    restart: unless-stopped
    
  librespot:
    image: dtcooper/raspotify
    network_mode: host
    devices: ["/dev/snd"]
    environment:
      - DEVICE_NAME=PiSpotify
    restart: unless-stopped

For Audio Quality

  • External DAC: USB DAC for improved audio quality
  • High-Quality Cables: Balanced audio cables
  • Room Acoustics: Proper speaker placement and room treatment
  • Audio Processing: Minimal processing for best quality

πŸš€ Future Enhancements

Planned Improvements

  1. Hardware DAC Integration: External DAC for better audio quality
  2. Multi-Room Expansion: Additional streaming endpoints
  3. Voice Control: Alexa/Google Assistant integration
  4. Advanced Audio Processing: Room correction and EQ
  5. Mobile App: Custom control interface

Advanced Features

  • Audio Synchronization: Perfect sync across multiple devices
  • Room Acoustics: Automatic room correction
  • Voice Commands: “Play music in living room”
  • Smart Scheduling: Time-based audio routing
  • Audio Analytics: Usage patterns and preferences

πŸ“ˆ Performance Metrics

Latency Measurements

  • AirPlay: 100-200ms latency
  • Chromecast: 50-150ms latency
  • DLNA: 200-500ms latency
  • Bluetooth: 100-300ms latency

Audio Quality Metrics

  • Bitrate: 320kbps for Spotify, 256kbps for AirPlay
  • Sample Rate: 44.1kHz standard, 48kHz for high-quality
  • Dynamic Range: 16-bit standard, 24-bit for high-quality

Network Performance

  • Bandwidth: 1-5 Mbps per audio stream
  • Packet Loss: <1% for stable streaming
  • Jitter: <10ms for smooth playback

🎯 Conclusion

This journey through wireless audio streaming solutions taught me that there’s no perfect one-size-fits-all solution. Each protocol and platform has its strengths and limitations. The key is understanding your specific requirements and finding the right balance between simplicity, performance, and functionality.

The LG SK9Y soundbar, despite its limitations, provided a solid foundation for experimentation. The various Raspberry Pi-based solutions offered flexibility and learning opportunities that wouldn’t have been possible with commercial solutions alone.

Key Takeaways

  1. Start Simple: Begin with basic solutions before adding complexity
  2. Test Thoroughly: Each protocol behaves differently in your environment
  3. Consider Latency: Audio-video sync is crucial for good user experience
  4. Plan for Growth: Design your system to accommodate future needs
  5. Document Everything: Keep detailed notes of configurations and issues

Final Recommendation

For a balanced solution, I recommend:

  • Primary: Shairport Sync for AirPlay (lowest latency)
  • Secondary: librespot for Spotify Connect
  • Tertiary: DLNA renderer for universal compatibility
  • Hardware: External DAC for improved audio quality
  • Network: Dedicated WiFi network for audio traffic

This combination provides the best balance of compatibility, performance, and ease of use for most home audio streaming needs.

πŸ”— Resources and References

Audio Streaming Solutions

Streaming Protocols

Hardware Resources

Development Tools

Community and Support

Documentation and Guides


This project continues to evolve as new streaming protocols and hardware solutions become available. The learning experience has been invaluable for understanding the complexities of wireless audio streaming and the trade-offs involved in building a comprehensive audio solution.

Keywords: Wireless Audio, Streaming, Raspberry Pi, Soundbar, AirPlay, Chromecast, DLNA, Bluetooth, Multi-room Audio, Shairport Sync, Balena Sound, Moode Audio, Volumio, Home Theater, DIY Audio