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>
69 lines
2.0 KiB
Bash
Executable File
69 lines
2.0 KiB
Bash
Executable File
#!/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)?"
|