Commit Graph

13 Commits

Author SHA1 Message Date
Michael Smith
3728e9499c Implement power button monitor, document device input devices
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 20:07:37 +01:00
Michael Smith
0f653d4395 Handle SIGTERM/SIGINT for clean shutdown, add device wrapper script
sdlamp2 now catches SIGTERM and SIGINT via a sig_atomic_t flag checked
in the main loop, ensuring position and volume are saved before exit.
Previously, a kill signal would terminate instantly without saving.

New tools/rg35xx-wrapper.sh replaces sdlamp2 as the dmenu_ln CMD on
the RG35XX Plus. Skeleton includes placeholders for WiFi hotspot and
power button monitoring (TBD after on-device investigation).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 15:49:38 +01:00
Michael Smith
a0f95c7252 Combine Play/Stop into toggle, add Previous Cassette button
Merge the separate Stop and Play buttons into one slot that toggles
between play/stop and shows the corresponding icon. Use the freed
slot for a Previous Cassette button, mirroring Next Cassette.

Layout: [Volume] [Prev] [Rewind] [Play/Stop] [FF] [Next]

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 14:38:17 +01:00
Michael Smith
2daf9f7955 Start paused, respect pause state on next-tape, quiet joystick log
Player was autoplaying on startup and on file switch. Now switch_file()
preserves the current paused state so the app launches paused and
"next tape" only continues playing if already playing. Joystick name
printf moved behind --debug flag.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 14:30:33 +01:00
Michael Smith
71debd0be2 Update docs to reflect arm64 Docker build container
Replace Buildroot toolchain references with the new docker-arm64 setup
in CLAUDE.md, TOOLCHAIN.md, and the changelog.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 14:08:58 +01:00
Michael Smith
cbe3d67132 Replace build scripts with a Makefile
Single Makefile supports native builds (pkg-config) and cross-compilation
(CROSS_COMPILE/PREFIX env vars). Fixes -Wformat-truncation and
-Wstringop-truncation warnings at -O2 by sizing current_file to match
audio_files (256) and replacing strncpy with snprintf.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 11:54:36 +01:00
Michael Smith
2fd764f60f Add raw joystick fallback for non-standard controllers
Open the joystick via SDL_JoystickOpen() when no GameController mapping
exists, fixing d-pad and face button input on devices like the Anbernic
retro handheld (GUID not in SDL's database). Handles JOYHATMOTION for
d-pad navigation and JOYBUTTONDOWN button 0 for activation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 11:37:19 +01:00
Michael Smith
7e67589150 Embed controls.png into binary so it can run from any directory
The spritesheet is compiled in as a C byte array. An external
controls.png in cwd still takes precedence for skinning. Includes
tools/embed_png.py to regenerate the header if the asset changes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 10:25:22 +01:00
Michael Smith
e3a2bca794 Add --debug flag for diagnosing controller input on handheld
Logs joystick enumeration at startup (name, GameController status, GUID)
and all SDL input events in the main loop to help diagnose why the retro
handheld's d-pad/buttons aren't recognized by the GameController API.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 16:08:13 +01:00
Michael Smith
6209a087d7 Add lossless M4A concatenation tool
Shell script to recombine individual story m4a files back into
per-cassette files using ffmpeg concat demuxer (stream copy, no
re-encoding). Generates chapter markers from input filenames and
preserves album art.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 09:45:27 +01:00
Michael Smith
3ba7b31148 Add volume control and d-pad/keyboard navigation
Replace mouse input with cursor-based navigation (arrow keys / d-pad +
Enter / A button) and add app-level volume control with a persistent
vertical slider, enabling use on a handheld gaming device without mouse
or system mixer access.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 09:06:00 +01:00
Michael Smith
9db8dfdd48 Implement streaming decoder, seeking, persistence, file switching, album art
Replace fire-and-forget decode_audio() with a streaming Decoder that uses
libswresample to convert planar float to interleaved stereo, fixing the
sped-up audio bug and eliminating multi-GB memory usage for long files.

Add 10-second rewind/fast-forward, stop (pause in place), position
persistence per file via positions.txt, directory scanning with file
switching, embedded album art display, and a progress bar. Handles both
old and new FFmpeg channel layout APIs via version preprocessor check.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 20:41:40 +01:00
Michael Smith
d03d0a1f8b Add functional specification document 2026-02-10 20:00:19 +01:00