• src/doors/syncconquer/door/door_io.c src/doors/syncdoom/syncdoom.c src

    From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Saturday, July 11, 2026 15:00:28
    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

Website Placeholder For System Operator Hub