Compare commits

..
9 Commits
Author SHA1 Message Date
menekis 75f2b607a6 adding images 2026-07-20 13:39:04 -04:00
menekis 20ce8d0f58 flow fixes 2026-07-20 13:29:53 -04:00
menekis 5f3200c55f add hardware connection flow 2026-07-20 13:28:36 -04:00
menekis f18fc02e4c adding M-A info 2026-07-19 14:52:14 -04:00
menekis e7346411c1 formating fixes 2026-07-19 14:49:40 -04:00
menekis 9b3839f621 adding images 2026-07-19 14:47:46 -04:00
menekis 9fcccc1ad7 adding icecasts configs 2026-07-19 14:47:37 -04:00
menekis 686880ad46 move the docker compose file out to make it simplier for deployment 2026-07-19 14:34:03 -04:00
menekis 6ac695aed4 edit on the readme 2026-07-19 14:33:42 -04:00
7 changed files with 102 additions and 29 deletions
+79 -29
View File
@@ -7,24 +7,47 @@ A lightweight, local-network streaming service that captures analog audio from a
To build this streaming node, you will need the following physical components: To build this streaming node, you will need the following physical components:
* **Raspberry Pi:** A Raspberry Pi 3B, 4, or Zero 2 W is recommended, along with a reliable power supply and MicroSD card. * **Raspberry Pi:** A Raspberry Pi 3B, 4, or Zero 2 W is recommended, along with a reliable power supply and MicroSD card.
* **USB Audio Interface (ADC):** A device to convert the analog audio to a digital signal for the Pi. (e.g., Behringer UCA202, ART USB Phono Plus, or a HiFiBerry DAC+ ADC hat). * **USB Audio Interface (ADC):** A device to convert the analog audio to a digital signal for the Pi.
* **Turntable:** Your vinyl record player. I had best restults with the [Behringer UCA202](https://www.amazon.ca/-/fr/Behringer-UCA222-Interface-audio-rouge/dp/B0023BYDHK/)
* **Phono Preamplifier:** Required to boost the turntable's low-level phono signal to a standard line-level signal. *Note: You can skip this if your turntable has a built-in preamp or if your USB audio interface includes a dedicated phono stage.*
* **RCA Cables:** To connect the turntable/preamp to the audio interface. <img src="img/UCA202.jpg" width="200">
* **Turntable:** Your vinyl record player with analog output like the [Audio-Technica AT-LP60XBT-BK](https://www.amazon.ca/-/fr/dp/B07N3RFXRL)
<img src="img/turntable_front.jpg" width="200" ><img src="img/turntable_back.jpg" width="200" >
* **[3.5mm to RCA Cables]((https://www.amazon.ca/VCE-adaptateurs-st%C3%A9r%C3%A9o-femelle-Plaqu%C3%A9/dp/B06XCR898P)):** To connect the turntable/preamp to the audio interface.
<img src="img/35mm_to_rca.jpg" width="200" >
* **[3.5 mm Splitters](https://www.amazon.ca/-/fr/R%C3%A9partiteur-femelle-dextension-Adaptateur-Compatible/dp/B0CN8WRSNG):** To keep the connection available to your Home Theater or Speakers
<img src="img/35mmsplit.jpg" width="200" >
## 💻 Software Prerequisites ## 💻 Software Prerequisites
The streamer relies on two core pieces of software: a capture/encoding client and a broadcast server. The streamer relies on two core pieces of software: a capture/encoding client and a broadcast server.
* **Linux OS:** A headless Linux distribution like Raspberry Pi OS Lite or a customized container environment. * **Linux OS:** A headless Linux distribution like Raspberry Pi OS Lite or Dietpi if you want fast bootup.
* **ALSA (Advanced Linux Sound Architecture):** Standard Linux sound drivers to detect and manage the USB audio interface (`alsa-utils`). * **ALSA (Advanced Linux Sound Architecture):** Standard Linux sound drivers to detect and manage the USB audio interface (`alsa-utils`).
* **Darkice:** The streaming client. It captures the live audio from the ALSA device, encodes it (to MP3, Ogg Vorbis, etc.), and sends it to the server. *(Note: **Liquidsoap** is a powerful alternative to Darkice if you want to implement advanced scripting, like silence detection).* * **Darkice:** The streaming client. It captures the live audio from the ALSA device, encodes it (to MP3, Ogg Vorbis, etc.), and sends it to the server. *(Note: **Liquidsoap** is a powerful alternative to Darkice if you want to implement advanced scripting, like silence detection).*
* **Icecast2:** The streaming media server. It receives the encoded stream from Darkice and serves it to network clients (browsers, media players, smart speakers) via a local HTTP URL. * **Icecast2:** The streaming media server. It receives the encoded stream from Darkice and serves it to network clients (browsers, media players, smart speakers) via a local HTTP URL.
* **Docker or podman**: The virtualization software if you dont want to install on bare metal
--- ---
## 🚀 Installation & Setup ## 🚀 Installation & Setup
### Hardware Flow
```mermaid
flowchart TD
A[Turntable] --> |3.5mm|B[3.5mm Splitter]
B --> |3.5mm|C[3.5mm to RCA converter]
B --> |3.5mm|D[Home Theater]
C --> |RCA|E[Behringer UCA202]
E --> |USB|F[Raspberry Pi3]
```
### Option A: Bare-Metal Package Installation ### Option A: Bare-Metal Package Installation
1. Update your system and install the required packages: 1. Update your system and install the required packages:
@@ -34,37 +57,62 @@ The streamer relies on two core pieces of software: a capture/encoding client an
``` ```
2. Configure Icecast by following the prompts to set your broadcast passwords. 2. Configure Icecast by following the prompts to set your broadcast passwords.
3. Identify your USB audio device using `arecord -l` to find the correct ALSA card number. 3. Identify your USB audio device using `arecord -l` to find the correct ALSA card number.
you should see something similar to
```
**** List of CAPTURE Hardware Devices ****
card 1: Codec [USB Audio Codec], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
```
4. Edit the `/etc/darkice.cfg` file to link your hardware capture device to the Icecast server. 4. Edit the `/etc/darkice.cfg` file to link your hardware capture device to the Icecast server.
```
[input]
device = hw:1,0 # OSS DSP soundcard device for the audio input
sampleRate = 44100 # sample rate in Hz. try 11025, 22050 or 44100
bitsPerSample = 16 # bits per sample. try 16
channel = 2 # channels. 1 = mono, 2 = stereo
```
5. Icecast streams: continue to edit the '/etc/darkice.cfg' file and add the configuration nof your choice, or both
MP3 is compatible with more devices but Opus has usually greater quality
```
# ==========================================
# Stream 1: High Compatibility (MP3)
# URL: http://<RASPBERRY_PI_IP>:8000/vinyl.mp3
# ==========================================
[icecast2-0]
bitrateMode = cbr # Constant bitrate for maximum MP3 compatibility
format = mp3
bitrate = 320 # High quality MP3
server = localhost # Or the IP of your Icecast container
port = 8000
password = hackme # Must match ICECAST_SOURCE_PASSWORD
mountPoint = vinyl.mp3
name = Vinyl Stream (MP3)
description = Turntable broadcast in MP3 format
# ==========================================
# Stream 2: High Efficiency / Quality (Opus)
# URL: http://<RASPBERRY_PI_IP>:8000/vinyl.opus
# ==========================================
[icecast2-1]
bitrateMode = vbr # Variable bitrate is ideal for Opus
format = opus
bitrate = 128 # Opus sounds incredibly transparent at 128kbps
server = localhost # Or the IP of your Icecast container
port = 8000
password = hackme # Must match ICECAST_SOURCE_PASSWORD
mountPoint = vinyl.opus
name = Vinyl Stream (Opus)
description = Turntable broadcast in Opus format
```
### Option B: Docker Compose Deployment ### Option B: Docker Compose Deployment
If you prefer a containerized homelab setup, you can deploy the stack using Docker Compose. If you prefer a containerized homelab setup, you can deploy the stack using Docker Compose.
**`docker-compose.yml`** **`docker-compose.yml`**
```yaml run
services: ```
icecast: docker compose up -d
image: infiniteproject/icecast
container_name: vinyl-icecast
ports:
- "8000:8000"
environment:
- ICECAST_SOURCE_PASSWORD=hackme
- ICECAST_ADMIN_PASSWORD=admin
- ICECAST_PASSWORD=hackme
- ICECAST_RELAY_PASSWORD=hackme
restart: unless-stopped
darkice:
image: pltnk/darkice
container_name: vinyl-darkice
devices:
- /dev/snd:/dev/snd # Pass through the ALSA audio device
volumes:
- ./darkice.cfg:/etc/darkice.cfg:ro
depends_on:
- icecast
restart: unless-stopped
``` ```
*(Ensure your ALSA device is mapped correctly and your `darkice.cfg` points to the `icecast` container hostname).* *(Ensure your ALSA device is mapped correctly and your `darkice.cfg` points to the `icecast` container hostname).*
@@ -73,3 +121,5 @@ services:
Once the services are running and a record is spinning, you can access the stream from any device on your local network by pointing your browser or a network media player to: Once the services are running and a record is spinning, you can access the stream from any device on your local network by pointing your browser or a network media player to:
`http://<RASPBERRY_PI_IP>:8000/vinyl` `http://<RASPBERRY_PI_IP>:8000/vinyl`
You can use a service like [Music Assistant](https://www.music-assistant.io/) to add that stream as an internet radio and cast to your Cast devices (google cast / Snap / Sonos/ etc)
+23
View File
@@ -0,0 +1,23 @@
services:
icecast:
image: infiniteproject/icecast
container_name: vinyl-icecast
ports:
- "8000:8000"
environment:
- ICECAST_SOURCE_PASSWORD=hackme
- ICECAST_ADMIN_PASSWORD=admin
- ICECAST_PASSWORD=hackme
- ICECAST_RELAY_PASSWORD=hackme
restart: unless-stopped
darkice:
image: pltnk/darkice
container_name: vinyl-darkice
devices:
- /dev/snd:/dev/snd # Pass through the ALSA audio device
volumes:
- ./darkice.cfg:/etc/darkice.cfg:ro
depends_on:
- icecast
restart: unless-stopped
Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB