rebase: Phase B — trivial files for the v0.6.0 base

Build-system, config, usb, and CI wiring on top of upstream's
v0.6.0-hotfix tree. Build will still fail until Phase C+D land bt.h
accessors that oled.cpp references; that's expected mid-rebase.

CMakeLists.txt: add src/oled.cpp + src/slots.cpp to add_executable,
link hardware_spi, restore OUTPUT_NAME ds5-bridge-oled.

src/config.h: append the 4 OLED Edition Config_body fields
(current_slot + auto_haptics_enable/gain/lowpass). Preserves
upstream's field order for the first 8 fields.

src/config.cpp:
- speaker_volume validity default -100 dB → 0 dB (footgun fix)
- 4 new validity guards for the appended fields with sensible
  defaults (Fallback / 100 % / 160 Hz / slot 0)
- config_default() impl (was declared in upstream's config.h since
  v0.5.4 but never defined; the OLED Edition's "Reset to defaults"
  Settings item calls it)

src/usb.cpp: drop the UAC1 SET_CUR Volume → flash-config sync that
let PipeWire/Pulse silently override the user's saved Spk Vol on
every device reconnect. Borrowed from loteran/DS5Dongle commit
03fa1e4.

src/usb_descriptors.cpp: restore iSerialNumber = STRID_SERIAL.
Upstream's commit e79c762 zeroed it to work around SpecialK (#32),
but that broke Windows device identity (#100) — users lost
per-device volume / app preferences when moving USB ports. The
OLED Edition prioritizes Windows device-identity stability for
the broader user base over SpecialK compat for a narrower one.

.github/workflows/{build,release}.yml: artifact filenames use
ds5-bridge-oled.uf2 (and -debug / -picow variants) per the
OUTPUT_NAME rebrand.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
MarcelineVPQ
2026-05-17 07:53:41 -06:00
co-authored by Claude Opus 4.7
parent 0ed05d3f56
commit 4b6a72b70a
22 changed files with 2087 additions and 17 deletions
+68
View File
@@ -0,0 +1,68 @@
#!/usr/bin/env bash
# test_speaker.sh — play audio through the DualSense speaker via the Pico bridge.
#
# The Pico exposes itself as a 4-channel UAC1 audio device (VID:PID 054c:0ce6).
# Channels 0+1 route to the DS5 speaker; channels 2+3 drive the HD haptic motors.
# Stereo audio fills 0+1 and leaves 2+3 silent (no haptic noise).
#
# Usage:
# scripts/test_speaker.sh # 3-second 440 Hz sine
# scripts/test_speaker.sh --tone 880 5 # 5-second 880 Hz sine
# scripts/test_speaker.sh path/to/audio # play a file (anything paplay accepts)
set -euo pipefail
find_sink() {
pactl list short sinks 2>/dev/null \
| grep -iE 'dualsense|sony|054c' \
| awk '{print $2}' \
| head -n1
}
play_tone() {
local freq="$1" dur="$2"
echo "Playing ${dur}s sine at ${freq} Hz on $SINK ..."
ffmpeg -hide_banner -loglevel error -nostdin \
-f lavfi -i "sine=frequency=${freq}:duration=${dur}" \
-ac 2 -ar 48000 -f wav - \
| paplay --device="$SINK"
}
play_file() {
local path="$1"
[[ -f "$path" ]] || { echo "Error: file not found: $path" >&2; exit 1; }
echo "Playing $path on $SINK ..."
paplay --device="$SINK" "$path"
}
if [[ "${1-}" == -h || "${1-}" == --help ]]; then
sed -n '2,11p' "$0"
exit 0
fi
SINK="$(find_sink)"
if [[ -z "$SINK" ]]; then
echo "Error: no DualSense audio sink found." >&2
echo " Check the DS5 is paired: lsusb | grep 054c:0ce6" >&2
echo " Check the sink shows up: pactl list short sinks" >&2
exit 1
fi
case "${1-}" in
--tone)
play_tone "${2:-440}" "${3:-3}"
;;
"")
play_tone 440 3
;;
*)
play_file "$1"
;;
esac
echo
echo "If you heard nothing on the DS5 speaker, sanity checks:"
echo " - DS5 is paired and connected? (lsusb | grep 054c:0ce6)"
echo " - Sink not muted? pactl get-sink-mute $SINK"
echo " - DS5 hardware speaker switch / mute LED not on?"
echo " - OLED Settings -> Spk Vol not set to -100 dB (silent floor)?"