#!/usr/bin/env bash # # Builds the arm64 headless audio-endpoint image (Raspberry Pi + HiFiBerry # Amp2) with rpi-image-gen. Read hosts/audio-endpoint/README.md before running # this — in particular the callout that rpi-image-gen's exact config/layer # schema (config/audio-endpoint.yaml) was not hands-on validated while writing # this script; a real build may need that file adjusted first. # # Output: a real bootable .img. Each physical unit then gets its own # hostname/Wi-Fi via Raspberry Pi Imager's OS Customisation dialog when # flashing — see the README's "Per-room identity" section. This script builds # ONE generic image, not one per room. set -euo pipefail # --------------------------------------------------------------------------- # CONFIGURATION — edit if needed # --------------------------------------------------------------------------- RPI_IMAGE_GEN_SRC="${RPI_IMAGE_GEN_SRC:-/opt/smart-home/src/rpi-image-gen}" RPI_IMAGE_GEN_REPO="https://github.com/raspberrypi/rpi-image-gen.git" # --------------------------------------------------------------------------- # Paths # --------------------------------------------------------------------------- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=lib/coreconfig.sh source "${SCRIPT_DIR}/lib/coreconfig.sh" core_select_audio_endpoint arm64 "${1:-}" # This script now lives in tools/, so the host directory it drives is addressed from # the repo root rather than relative to the script. AUDIO_ENDPOINT_DIR="${CORE_REPO_ROOT}/hosts/audio-endpoint" RPI_IMAGE_GEN_DIR="${AUDIO_ENDPOINT_DIR}/rpi-image-gen" SHARED_CONFIGS_DIR="$AUDIO_ENDPOINT_DIR/configs" BUILD_CONFIG="$RPI_IMAGE_GEN_DIR/config/audio-endpoint.yaml" # --------------------------------------------------------------------------- # Sanity checks # --------------------------------------------------------------------------- for f in spotify-connect.service spotify-connect-start; do if [ ! -f "$SHARED_CONFIGS_DIR/$f" ]; then echo "Missing $SHARED_CONFIGS_DIR/$f — is this script running from a full checkout?" >&2 exit 1 fi done if [ ! -f "$BUILD_CONFIG" ]; then echo "Missing $BUILD_CONFIG" >&2 exit 1 fi if ! command -v git >/dev/null 2>&1; then echo "git is required to fetch rpi-image-gen. Install it first: sudo apt-get install git" >&2 exit 1 fi # --------------------------------------------------------------------------- # 1. Fetch rpi-image-gen if not already present # --------------------------------------------------------------------------- if [ ! -d "$RPI_IMAGE_GEN_SRC" ]; then echo "--- Cloning rpi-image-gen into $RPI_IMAGE_GEN_SRC ---" git clone --depth 1 "$RPI_IMAGE_GEN_REPO" "$RPI_IMAGE_GEN_SRC" else echo "--- rpi-image-gen already present at $RPI_IMAGE_GEN_SRC, skipping clone ---" fi # --------------------------------------------------------------------------- # 2. Build # --------------------------------------------------------------------------- echo "--- Running rpi-image-gen build ---" echo " Config: $BUILD_CONFIG" cd "$RPI_IMAGE_GEN_SRC" # UNVERIFIED: assumes a ./rpi-image-gen entry point at the repo root, matching # common conventions for this class of tool (e.g. pi-gen's own build.sh). If # the real tool exposes a different entry point (a pip-installed console # script, a Python module, etc.), fix this one line — everything else in this # script and config/audio-endpoint.yaml is unaffected either way. ./rpi-image-gen build -c "$BUILD_CONFIG" echo echo "=== Done (if rpi-image-gen's invocation above matched the real tool) ===" echo "Image should be under $RPI_IMAGE_GEN_SRC/work/ — check rpi-image-gen's own" echo "build output above for the exact path; this wrapper does not parse it." echo echo "Next steps:" echo " 1. Flash with Raspberry Pi Imager (GUI) or:" echo " rpi-imager --cli .img /dev/" echo " 2. BEFORE writing, use Imager's OS Customisation (gear icon / Ctrl+Shift+X)" echo " to set THIS unit's hostname (= its Spotify Connect device name — see" echo " the README's 'Per-room identity' section), Wi-Fi SSID/password, and" echo " an SSH key if you want remote access. This is per physical unit, not" echo " per build — the same .img is reused for every room." echo " 3. Attach the HiFiBerry Amp2 HAT and passive speakers before first boot." echo " 4. First boot checklist (see README.md for the full unverified list):" echo " systemctl status spotify-connect" echo " # confirm the room's hostname shows up as a Spotify Connect device" echo " aplay -l # confirm the HiFiBerry is card 0 (onboard audio disabled)"