Soundboard

1. Ordnerstruktur anlegen

# Hauptordner für Soundboard-Dateien
sudo mkdir -p /var/soundboard
sudo chown [USER]:www-data /var/soundboard
sudo chmod 775 /var/soundboard
sudo chmod g+s /var/soundboard

# Queue-Datei
sudo touch /var/soundboard/queue
sudo chown [USER]:www-data /var/soundboard/queue
sudo chmod 664 /var/soundboard/queue

# Ordner für MP3-Dateien im Home-Verzeichnis des Users
mkdir -p ~/Sounds
# MP3-Dateien hier ablegen, z.B. AbDa.mp3, HauAb.mp3 etc.

Das g+s auf /var/soundboard sorgt dafür, dass neue Dateien automatisch die Gruppe www-data erhalten.


2. Daemon-Skript erstellen

Erstelle das Daemon-Skript, das die Queue überwacht und die Sounds abspielt:

sudo nano /usr/local/bin/soundboard-daemon.sh

Inhalt:

#!/bin/bash

QUEUE=/var/soundboard/queue
SOUND_DIR=/home/[USER]/Sounds
LOG=/var/soundboard/daemon.log

# PipeWire/ALSA für systemd User Service verfügbar machen
export XDG_RUNTIME_DIR=/run/user/1000
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus

echo "Daemon gestartet: $(date)" >> "$LOG"

while true; do
    if [ -s "$QUEUE" ]; then
        SOUND=$(head -n 1 "$QUEUE")
        sed -i '1d' "$QUEUE"
        FILE="$SOUND_DIR/$SOUND.mp3"

        echo "Eingang: $SOUND → Datei: $FILE" >> "$LOG"

        if [ -f "$FILE" ]; then
            echo "Starte ffplay..." >> "$LOG"
            /usr/bin/ffplay -nodisp -autoexit -loglevel quiet "$FILE"
            echo "ffplay beendet" >> "$LOG"
        else
            echo "FEHLER: Datei nicht gefunden" >> "$LOG"
        fi
    fi
    sleep 0.1
done
sudo chmod +x /usr/local/bin/soundboard-daemon.sh

3. Systemd User Service für den Daemon

mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/soundboard.service

Inhalt:

[Unit]
Description=Soundboard Daemon

[Service]
ExecStart=/usr/local/bin/soundboard-daemon.sh
Restart=always

[Install]
WantedBy=default.target
# Daemon registrieren und starten
systemctl --user daemon-reload
systemctl --user enable --now soundboard.service

# Status prüfen
systemctl --user status soundboard.service

4. Webinterface (PHP)

/var/www/html/index.php:

<?php
$queue_file = '/var/soundboard/queue';

if (isset($_GET['run'])) {
    $sound = preg_replace('/[^a-zA-Z0-9_-]/', '', $_GET['run']); // sanitizen
    if (is_writable($queue_file)) {
        file_put_contents($queue_file, $sound."\n", FILE_APPEND);
        $log_entry = "[Webinterface] Button '$sound' → in Queue geschrieben\n";
        file_put_contents('/var/soundboard/daemon.log', $log_entry, FILE_APPEND);
    } else {
        $log_entry = "[Webinterface] FEHLER: Queue nicht beschreibbar für '$sound'\n";
        file_put_contents('/var/soundboard/daemon.log', $log_entry, FILE_APPEND);
    }

    // Reload verhindern, dass Browser beim Refresh erneut schreibt
    header("Location: ".$_SERVER['PHP_SELF']);
    exit;
}

// Buttons alphabetisch
$buttons = [
    'AbDa', 'Baff', 'GehDaWeg', 'GIGA_AbDa', 'GIGA_HauAb', 'GIGA_RunterDa', 'GIGA_SeiLeise', 'HauAb', 'Rlps', 'Fart'
];

// Mapping für die Anzeige
$names = [
    'Baff' => 'Furz',
    'Rlps' => 'Rülps'
];
?>

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Soundboard</title>
<style>
  body { font-family: sans-serif; background:#f0f0f0; }
  .container { max-width:600px; margin:50px auto; text-align:center; }
  button { margin:5px; padding:10px 20px; font-size:16px; }
</style>
</head>
<body>
<div class="container">
<h1>Soundboard</h1>
<form method="get">
<?php
sort($buttons);
foreach ($buttons as $b) {
    $label = $names[$b] ?? $b;
    echo "<button type='submit' name='run' value='$b'>$label</button>";
}
?>
</form>
</div>
</body>
</html>

Achte darauf, dass www-data Schreibrechte auf /var/soundboard/queue hat, damit PHP die Sounds in die Queue schreiben kann.


5. Testen

  1. Starte den Daemon:
systemctl --user start soundboard.service
  1. Prüfe das Log:
tail -f /var/soundboard/daemon.log
  1. Öffne das Webinterface im Browser:
http://localhost/index.php
  1. Drücke einen Button → sollte im Log erscheinen und der Sound abgespielt werden.

6. Rechte-Check

ls -ld /var/soundboard
ls -l /var/soundboard/queue
  • Ordner: [USER]:www-data 775
  • Queue: [USER]:www-data 664

Damit kann [USER] (Daemon) lesen und www-data (PHP) schreiben.