https://gitlab.synchro.net/main/sbbs/-/commit/969a17630973a69b89d980ad
Modified Files:
src/doors/syncconquer/door/door_io.c src/doors/syncdoom/syncdoom.c src/doors/syncduke/syncduke.h syncduke_input.c syncduke_io.c src/doors/syncmoo1/syncmoo1_input.c src/doors/syncretro/syncretro_audio.c syncretro_audio.h syncretro_input.c syncretro_io.c src/doors/termgfx/apc.c apc.h audio.c audio.h audio_mgr.c audio_mgr.h caps.c caps.h
Log Message:
doors: adopt SyncTERM APC blob media (audio + video), no cache files
SyncTERM's blob APC verbs (Deuce, ef5b7f98a3) carry base64 media inline and decode straight to a slot/screen with no cache file, gated on CTerm version
= 1.329. This teaches termgfx and all five doors to use them when the client is new enough, falling back to the existing cache path otherwise.
Detection (termgfx/caps.{c,h}):
- termgfx_caps_cterm_version() reads the version from the DA1 reply
("ESC[=67;84;101;114;109;MAJ;MIN;...c", 67.. spells "Cterm"): MAJ*1000+MIN.
- Named thresholds TERMGFX_CTERM_VER_{PPM=1002,BLOB=1329} replace scattered
magic numbers (syncdoom's inline copy now calls the shared helper).
Audio (termgfx/audio.c, audio_mgr.c):
- termgfx_audio_load_blob_file()/_load_blob() build A;LoadBlob (WAV/OGG).
- stream_chunk() ships inline when the manager's blob_ok is set, else the
legacy Store+Load with rotating cache names. Wins where audio actually
streams: syncconquer FMV and syncretro game audio (its OGG chunks now skip
the cache ring). The SFX/music doors keep the upload-once cache (better for
repeated sounds) -- blob_ok is set there only for uniformity.
Video (termgfx/apc.c):
- termgfx_apc_image() gains a blob mode: C;DrawJXLBlob/DrawPPMBlob inline vs.
the per-frame C;S Store + Draw. Wired in the JXL/PPM-tier doors
(syncconquer, syncduke, syncdoom). Sixel is already inline, unaffected.
Each door's DA1 handler enables the audio/video blob flags at >= 1329. The stats overlay shows a blob token only when actually in use (JXL/PPM tier inline, or retro's "a-blob" audio stream); moo1 has none.
#256 workaround (non-blob clients): the JXL/PPM frame cache filenames were fixed strings, so two SyncTERM windows of one dialing-entry -- which share a cache dir -- collided. Salt the name per session with the door's PID via termgfx_session_salt() (xpdev GetCurrentProcessId): syncalert_<pid>.jxl etc. Only the cache path is affected; blob clients write no file. (syncterm #256.)
Compile-verified across all five doors; the blob paths need SyncTERM >= 1.329 to live-test, and the fallback is unchanged so older clients are unaffected.
Co-Authored-By: Claude Opus 4.8 (1M context) <
noreply@anthropic.com>
---
þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net