A professional audio recording interface for Raspberry Pi 5 designed to fit in a 1U rack unit.
- Raspberry Pi 5
- 2.7" 256×64 OLED Display (SSD1322) via SPI
- Rotary Encoder (EC11) with push button
- 3x Momentary buttons (Record, Stop, Play)
- Audio interface (USB or HAT)
- VCC → 3.3V
- GND → GND
- D0/SCLK → GPIO11 (SPI0 SCLK)
- D1/MOSI → GPIO10 (SPI0 MOSI)
- CS → GPIO8 (SPI0 CE0)
- DC → GPIO25
- RES → GPIO24
- A → GPIO17
- B → GPIO27
- SW (Push) → GPIO22
- VCC → 3.3V
- GND → GND
- Record → GPIO5
- Stop → GPIO6
- Play → GPIO13
- All buttons use internal pull-ups
- Enable SPI interface:
sudo raspi-config
# Navigate to Interface Options > SPI > Enable- Install Go (if not already installed):
wget https://go.dev/dl/go1.21.0.linux-arm64.tar.gz
sudo tar -C /usr/local -xzf go1.21.0.linux-arm64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc- Install Inferno Audio over IP server and dependencies:
sudo apt update
sudo apt install alsa-utils ffmpeg
# Run the setup script to configure Inferno server integration
./setup.sh- Create recording directories:
sudo mkdir -p /rec/raw
sudo chown -R pi:pi /rec- Clone or copy the project files to your Pi
- Build the application:
cd PI9696
go mod tidy
go build -o pi9696 .sudo ./pi9696Note: Requires sudo for GPIO access.
Create a systemd service:
sudo tee /etc/systemd/system/pi9696.service > /dev/null <<EOF
[Unit]
Description=PI9696 Audio Recorder
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/home/pi/PI9696
ExecStart=/home/pi/PI9696/pi9696
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable pi9696.service
sudo systemctl start pi9696.service- Record Button: Start recording (only when idle, requires Inferno server running)
- Stop Button: Stop current recording (leaves Inferno server running)
- Play Button: Reserved for future playback functionality
- Rotary Encoder: Navigate menus, toggle between elapsed/remaining time
- Encoder Push: Enter menus, confirm selections
- Encoder Hold (3s): Cancel copy operations
- Left Panel: Status information (time, storage, settings)
- Right Panel: Menu system (when active)
- Full Width: Status display when not in menu
- Sample Rate: 44.1kHz, 48kHz, 96kHz, 192kHz (auto-restarts Inferno server)
- Channel Count: Adjust from 1 to 128 channels (auto-restarts Inferno server)
- Copy Files: Transfer recordings to USB drive
- System Options: System management submenu
- Network Info: Display network connection details
- Restart Inferno: Manually restart Inferno Audio over IP server
- Exit: Return to main display
- Delete All: Remove all recordings with confirmation
- Format USB: Format connected USB drive (FAT32)
- Shutdown: Power off system with confirmation
- Restart: Reboot system with confirmation
- Exit: Return to settings menu
- [All]: Select all recordings
- [NONE]: Deselect all recordings
- Individual file selection with checkboxes
- Start Copy: Begin transfer operation
- Output Format: WAV (PCM 24-bit)
- Internal Pipeline: 32-bit signed little-endian via FIFO
- Sample Rates: 44.1kHz, 48kHz, 96kHz, 192kHz
- Channel Support: 1-128 channels
- File Naming:
recording_YYYYMMDD_HHMMSS_chN_NNkHz.wav - Raw FIFO:
/rec/raw/inferno_YYYYMMDD_HHMMSS_chN_NNkHz.raw(temporary)
- Startup: Automatic when eth0 networking becomes available
- Persistence: Runs continuously between recordings
- Auto-Restart: When sample rate or channel count changes
- Status Display: Flame icon (🔥) in status bar when running
- Manual Control: "Restart Inferno" option in settings menu
- Check SPI is enabled:
lsmod | grep spi - Verify wiring connections
- Check permissions:
ls -l /dev/spidev*
- List audio devices:
arecord -l - Test recording:
arecord -D hw:0 -f S32_LE -r 48000 -c 2 test.wav - Check ALSA configuration:
cat /proc/asound/cards - Check Inferno server: Look for flame icon in status bar
- Test Inferno manually:
cd inferno && INFERNO_SAMPLE_RATE=48000 cargo run -- -c 2 -o /tmp/test.fifo
- Check eth0 interface:
ip addr show eth0 - Monitor network status: Watch network icon in status bar
- Check connectivity:
ping 8.8.8.8 - Inferno server requires network: Ensure eth0 is up and configured
- Ensure running as root/sudo
- Check GPIO permissions:
ls -l /dev/gpiomem - Verify pin assignments don't conflict
- Check USB device:
lsblk - Manual mount:
sudo mount /dev/sda1 /media/usb - Check filesystem:
sudo fsck /dev/sda1
The project is structured as follows:
main.go: Main application logic, state management, and Inferno server controlhardware/: Hardware abstraction layer with display, encoder, buttons, and network detectioninferno/: Inferno Audio over IP server project directory (Rust/Cargo)svg/: Icon assets including inferno.svg for status barrec/: Final recording output directoryrec/raw/: Temporary FIFO files for audio pipeline
- Directory:
./inferno/contains the Rust/Cargo project - Command:
INFERNO_SAMPLE_RATE=<rate> cargo run -- -c <channels> -o <fifo> - Pipeline: Inferno → FIFO → FFmpeg → WAV file
- Management: Automatic startup, restart, and monitoring
This project is licensed under the MIT License - see the LICENSE file for details.