• src/doors/syncretro/M3_MULTICORE.md syncretro_profile.c syncretro_prof

    From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Sat Jul 11 04:50:47 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/3bb2c270009a3e42b6d55439
    Added Files:
    src/doors/syncretro/M3_MULTICORE.md syncretro_profile.c syncretro_profile.h
    Modified Files:
    src/doors/syncretro/CMakeLists.txt M2_INPUT.md PROVENANCE.md README.md build.sh main.c retro_core.c retro_core.h syncretro.h syncretro_audio.c syncretro_audio.h syncretro_binds.c syncretro_binds.h syncretro_config.c syncretro_door.c syncretro_input.c syncretro_io.c syncretro_keypad.c syncretro_keypad.h test_binds.c test_keypad.c
    Log Message:
    syncretro: one door, many consoles -- the controller is the console's

    The frontend could host any libretro core, but exactly one console was
    wired into it: the keypad, the paddle disc and the two hand controllers
    were called unconditionally, and the key table was the Intellivision's.
    A second console had nowhere to live.

    The console is now a PROFILE (syncretro_profile.c), chosen from the
    lobby's -profile, else inferred from the core's own library_name, else
    `pad`. Two ship: `intv`, unchanged, and `pad` -- a plain RetroPad, which
    is the whole of the NES and of every other gamepad console, so a third
    console needs an install directory rather than new C.

    Compare the core's name CASE-INSENSITIVELY: FreeIntv reports its
    library_name as "freeintv", lower case, not the "FreeIntv" spelling used
    in its own repo and in every doc (PROVENANCE.md records the same trap for
    its .so filename). A case-sensitive match fails SILENTLY -- the
    Intellivision falls through to `pad` and loses its keypad, with no error anywhere.

    The arrows and the numpad belong to whoever is playing. The Intellivision drives both hand controllers at once, so its arrows are player 2's disc
    (port 1) and its numpad is player 2's keypad; on a gamepad console there
    is one player at one keyboard, so both are HIS -- the arrows are his
    d-pad and the numpad is a second one (diagonals included), on port 0.
    This is per-profile in all three input paths, including the evdev reports SyncTERM negotiates.

    Two facts now come from the core rather than from the one console we had:

    * The SAMPLE RATE. It was a hardcoded 44100 -- FreeIntv's. fceumm mixes
    at 48000, and a chunk sized or encoded at the wrong rate is both
    mis-pitched and mis-timed against the FIFO cushion the pacing rests
    on. sr_audio_start() takes it from retro_get_system_av_info(), after
    the game loads, because that is when it first exists.

    * The ASPECT. The fit assumed SQUARE PIXELS. A console's are not: the
    NES's 256x240 was shown on a 4:3 television and fceumm asks for 1.219,
    so fitting it at 256:240 draws it a quarter too narrow. FreeIntv hid
    this for a whole milestone -- its 352x224 IS the 1.5714 it reports, so
    ignoring the aspect happened to be right on the only console we had.
    [video] aspect = core (default) | 4:3 | square | <number> overrides it.

    Volume, on '+' and '-' ('=' and '_' alias them, so turning the sound down
    needs no shift key). ZERO IS NOT "very quiet": at 0 the door stops sending audio entirely -- no encode, no upload, no queue -- and flushes what is
    already queued, so the sound stops when the key is pressed rather than a cushion later, and a player who wants quiet costs zero uplink. The new
    level shows for a moment on the bottom text row.

    The Ctrl-S stats strip moves to that same bottom row. It is the one
    placement that works: the fit already reserves that row, so nothing else
    paints there -- and ../syncconquer found a strip over the image UNREADABLE under sixel, which shares the text plane and repaints progressively.

    Who's-online names the cartridge -- "playing Astrosmash (Intellivision)"
    -- as SyncDOOM names its WAD and map, instead of the BBS's generic
    "running external program". The lobby passes the title it has already
    parsed out of the filename; a door run by hand falls back to the filename.

    The keytrace now records what each key RESOLVED to (act/id/port), not just
    the byte arriving. A once-a-second direction sample cannot answer the only question a player ever asks -- "I pressed X and nothing happened".

    Also carries the earlier two-hand-controller keypad work that was sitting uncommitted in the tree (syncretro_keypad.c/h, M2_INPUT.md): the digit
    state is per port, and both controllers are live at once.

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net