π€ AI: Over the last few weeks I've built up a backlog of measured findings and candidate improvements against Jamulus that I haven't opened issues for β some because they're design questions rather than clean bugfixes, some because they were waiting on the PR moratorium, and some just to avoid flooding the tracker. Rather than sit on them or dump them all at once, this is an index of what I have, so maintainers can pull whichever ones are worth a proper write-up. Nothing here needs a reply beyond "yes, open an issue for N" (or "no, not interested"). Each line is one command away from a standalone issue with the evidence, harness, and reproduce steps behind it; I'll only expand the ones you name.
None of this is a new PR β it's a menu. If one of these does turn into code later, it goes through the usual contribution process.
JSON-RPC
Auto jitter buffer (all in corrados's #545 territory)
- The hysteresis term has never functioned since it was added in 2011.
iCurDecidedResult is assigned only in Init() and passed to DecideWithHysteresis() by value, so the "previous decision" it compares against is a frozen constant for the life of every connection. Confirmed in source and live via telemetry. Caveat worth stating up front: I measured the obvious one-line fix and it slightly worsens latency and oscillation on the path I tested, so my inclination is a documenting comment, not a behaviour change.
- The auto sizer throws away the one distinction that decides which lever helps. It collapses every failure into a single scalar error rate, so it can't tell late-but-complete arrivals (where more depth helps) from independent loss (where depth is wasted). A cheap run-length signal already computable inside
CNetBuf::Get separates the two regimes cleanly in my traces. This is a design conversation, not a patch.
Server performance
- The
--multithreading pool-size default may be wrong β this is hoffie's own unanswered checkbox on #2446 (open since 2022). On bare metal at realistic client counts, NUM_CORES-1 beats the shipped idealThreadCount(); and idealThreadCount() ignores CPU affinity on Qt5, so taskset doesn't resize the pool. Important caveat: the rule inverts on two-core hosts, so a naive idealThreadCount()-1 would regress them β any change has to floor or stay configurable.
- The mixer inner loop has meaningful headroom via a loop-interchange/vectorization rewrite that measured bit-identical to current output. Honest scoping: it only matters on a busy (tens-of-clients) server and does nothing for a small jam, and it's the largest restructuring in the mix path, so it needs a design nod before any code.
Codec
- The hardcoded
OPUS_SET_PACKET_LOSS_PERC(35) is a fixed point on a tradeoff that's now measured on both sides. It costs clean-line quality but buys real robustness under loss and jitter; both halves are quantified across the shipped quality tiers. A loss-adaptive value is the code-change candidate, but whether the clean-line cost is worth trading is a maintainer call.
Already-open issues I've re-verified with a root cause
- #1591 (scrollbar resets on mute toggle) is still live on current
main; I've localized it to lblGlobalInfoLabel show/hide reflowing the mixer's QScrollArea.
- #3604 (dedup the client/server "check for update" code) and #2438 (
setChannelName written in two places with divergent truncation) both have small, verified refactor scopes ready to implement once the PR moratorium lifts.
If any of these are worth pursuing, name it and I'll open a focused issue with the full evidence. I can also drop any that overlap work already in flight β pointers to the relevant open issues or PRs are welcome.
π€ This message was written by AI and reviewed by @mcfnord.
π€ AI: Over the last few weeks I've built up a backlog of measured findings and candidate improvements against Jamulus that I haven't opened issues for β some because they're design questions rather than clean bugfixes, some because they were waiting on the PR moratorium, and some just to avoid flooding the tracker. Rather than sit on them or dump them all at once, this is an index of what I have, so maintainers can pull whichever ones are worth a proper write-up. Nothing here needs a reply beyond "yes, open an issue for N" (or "no, not interested"). Each line is one command away from a standalone issue with the evidence, harness, and reproduce steps behind it; I'll only expand the ones you name.
None of this is a new PR β it's a menu. If one of these does turn into code later, it goes through the usual contribution process.
JSON-RPC
countryNameis documented as a number but emits a string;getChannelInfodocuments aresult.idfield no revision has ever emitted (the handler's own comment says why);skillLevelis documented twice. Root cause is structural: CI regenerates the docs from the markers, so the markers are never checked against what the code actually emits.privateChatMessagerejects overlong input,setWelcomeMessagesilently truncates, andsetServerName/broadcastChatMessageare unbounded β a mix of reject / truncate / accept-anything for the same kind of argument.Auto jitter buffer (all in corrados's #545 territory)
iCurDecidedResultis assigned only inInit()and passed toDecideWithHysteresis()by value, so the "previous decision" it compares against is a frozen constant for the life of every connection. Confirmed in source and live via telemetry. Caveat worth stating up front: I measured the obvious one-line fix and it slightly worsens latency and oscillation on the path I tested, so my inclination is a documenting comment, not a behaviour change.CNetBuf::Getseparates the two regimes cleanly in my traces. This is a design conversation, not a patch.Server performance
--multithreadingpool-size default may be wrong β this is hoffie's own unanswered checkbox on #2446 (open since 2022). On bare metal at realistic client counts,NUM_CORES-1beats the shippedidealThreadCount(); andidealThreadCount()ignores CPU affinity on Qt5, sotasksetdoesn't resize the pool. Important caveat: the rule inverts on two-core hosts, so a naiveidealThreadCount()-1would regress them β any change has to floor or stay configurable.Codec
OPUS_SET_PACKET_LOSS_PERC(35)is a fixed point on a tradeoff that's now measured on both sides. It costs clean-line quality but buys real robustness under loss and jitter; both halves are quantified across the shipped quality tiers. A loss-adaptive value is the code-change candidate, but whether the clean-line cost is worth trading is a maintainer call.Already-open issues I've re-verified with a root cause
main; I've localized it tolblGlobalInfoLabelshow/hide reflowing the mixer'sQScrollArea.setChannelNamewritten in two places with divergent truncation) both have small, verified refactor scopes ready to implement once the PR moratorium lifts.If any of these are worth pursuing, name it and I'll open a focused issue with the full evidence. I can also drop any that overlap work already in flight β pointers to the relevant open issues or PRs are welcome.
π€ This message was written by AI and reviewed by @mcfnord.