jamulussoftware / jamulussoftware/jamulus

Index of measured findings not yet filed as issues

Aperta
#3,916 17 commenti 0 reazioni 1 assegnatario Vedi su GitHub

@mcfnord ci sta già lavorando.

Dal 22/8/2026.

Lingua principale
C
Stelle
1.1k
Fork
248
Merge medio
2g 3h
PR unite (30g)
9

Descrizione

**🤖 AI:** An index of measured findings and candidate improvements against Jamulus that were not yet filed as issues, kept current 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. Status as of 2026-09-11, checked against `main` at [`292506eb`](https://github.com/jamulussoftware/jamulus/commit/292506ebb485f4fa98b56256aa6eb1b34be7d782).

None of this is a new PR, it is a menu. If one of these turns into code later, it goes through the usual [contribution process](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/CONTRIBUTING.md).

### Filed since this index was posted (2026-08-21)

- [#3923](https://github.com/jamulussoftware/jamulus/issues/3923) auto jitter buffer hysteresis compares against a constant (split out of this thread, open)
- [#3924](https://github.com/jamulussoftware/jamulus/discussions/3924) adaptive `OPUS_SET_PACKET_LOSS_PERC` (Discussion, open)
- [#3934](https://github.com/jamulussoftware/jamulus/issues/3934) directory re-registration resolves DNS on the mix thread (open)
- [#3937](https://github.com/jamulussoftware/jamulus/issues/3937) `setRecordingDirectory` acknowledges a bad path while disabling recording (open)
- [#3942](https://github.com/jamulussoftware/jamulus/issues/3942) MIDI pick-up mode's rapid-movement branch is unreachable (open)
- [#3945](https://github.com/jamulussoftware/jamulus/issues/3945) fade-in gain computed once per channel pair instead of once per channel per frame (open)
- Merged: [#3931](https://github.com/jamulussoftware/jamulus/pull/3931) out-of-range `customdirectoryindex` startup crash, [#3932](https://github.com/jamulussoftware/jamulus/pull/3932) `bIsIdentified` made atomic, [#3943](https://github.com/jamulussoftware/jamulus/pull/3943) `setSkillLevel` with `null` returns `ok`, [#3861](https://github.com/jamulussoftware/jamulus/pull/3861) JSON-RPC read-buffer and `setWelcomeMessage` bounds.

### JSON-RPC

- **Four doc defects where the published table disagrees with the code. Still present.** [`countryName` is documented as a number](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/docs/JSON-RPC.md#L419) but [emits a string](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/serverrpc.cpp#L204); `getChannelInfo` documents a [`result.id` field](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/docs/JSON-RPC.md#L146) no revision has ever emitted ([the handler's own comment](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/clientrpc.cpp#L249) says why); `skillLevel` is [documented twice](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/docs/JSON-RPC.md#L148-L154). Root cause is structural: [CI regenerates the docs *from* the markers](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/.github/workflows/check-json-rpcs-docs.yml), so the markers are never checked against what the code emits.
- **String parameters are bounded inconsistently across the methods that take one. Narrowed, not closed.** [`privateChatMessage` rejects overlong input](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/serverrpc.cpp#L125-L130), and since #3861 [`setWelcomeMessage` rejects too](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/serverrpc.cpp#L325-L329) instead of [silently truncating](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/server.cpp#L1655); [`setServerName`](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/serverlist.cpp#L337-L344) and [`broadcastChatMessage`](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/serverrpc.cpp#L103-L114) remain unbounded.

### Auto jitter buffer (all in corrados's [#545](https://github.com/jamulussoftware/jamulus/issues/545) territory)

- **The hysteresis term has never functioned since it was added in 2011. Filed as #3923.** [`iCurDecidedResult` is assigned only in `Init()`](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/buffer.cpp#L521) and [passed to `DecideWithHysteresis()` by value](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/buffer.cpp#L683), so the "previous decision" it compares against is a frozen constant for the life of every connection. None of the three candidate behaviours (leave it frozen, delete it, or write the decision back) is free, and they differ in both latency and how often the size moves, so this is a design question rather than a cleanup.
- **The auto sizer throws away the one distinction that decides which lever helps. Not filed.** It collapses every failure into a single scalar error rate, so it cannot 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`](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/buffer.cpp#L325-L373) separates the two regimes cleanly in recorded traces. This is a design conversation, not a patch.

### Server performance

- **The `--multithreading` pool-size default may be wrong. Not filed; still [hoffie's own unanswered checkbox on #2446](https://github.com/jamulussoftware/jamulus/issues/2446).** On bare metal at realistic client counts, `NUM_CORES-1` beats [the shipped `idealThreadCount()`](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/server.cpp#L245); and `idealThreadCount()` ignores CPU affinity on Qt5, so `taskset` does not resize the pool. 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](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/server.cpp#L1018) has meaningful headroom. Two pieces are now in flight, the rewrite itself is not filed.** The per-pair [`GetGain`](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/server.cpp#L906)/[`GetPan`](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/server.cpp#L919) locking is ann0see's [ann0see/jamulus#293](https://github.com/ann0see/jamulus/pull/293) (draft), completed by [ann0see/jamulus#320](https://github.com/ann0see/jamulus/pull/320); the per-pair fade-in read is #3945. The remaining candidate is a loop-interchange/vectorization rewrite that measured bit-identical to current output. It only matters on a busy (tens-of-clients) server and does nothing for a small jam, and it is 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)`](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/client.cpp#L121-L122) is a fixed point on a tradeoff that is measured on both sides. Now Discussion #3924.** 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 re-verified with a root cause

- **[#1591](https://github.com/jamulussoftware/jamulus/issues/1591)** (scrollbar resets on mute toggle) is still live on current `main`, localized to [`lblGlobalInfoLabel` show/hide](https://github.com/jamulussoftware/jamulus/blob/292506ebb485f4fa98b56256aa6eb1b34be7d782/src/clientdlg.cpp#L1066-L1079) reflowing the mixer's `QScrollArea`. Milestone 4.1.0; pljones's note above stands: verify on all platforms and under Qt 6 before a fix.
- **[#3604](https://github.com/jamulussoftware/jamulus/issues/3604)** (dedup the client/server "check for update" code) and **[#2438](https://github.com/jamulussoftware/jamulus/issues/2438)** (`setChannelName` written in two places with divergent truncation) both have small, verified refactor scopes ready to implement. Both open, milestone 4.1.0.

If any of these are worth pursuing, name it and a focused issue with the full evidence follows. Pointers to overlapping [open issues](https://github.com/jamulussoftware/jamulus/issues) or PRs are welcome.

---

🤖 *This message was written by AI and reviewed by @mcfnord.*

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.