80 Commits

Author SHA1 Message Date
Username
67467c846c fix: debounce on_resize to prevent audio stutter 2026-02-28 14:18:18 +01:00
Username
2e70e73086 docs: add slash commands section 2026-02-28 14:12:12 +01:00
Username
4bf8adc5e2 app: add slash commands 2026-02-28 14:11:51 +01:00
Username
15fbf0040a client: add set_self_mute and register_self 2026-02-28 14:04:17 +01:00
Username
2533e43391 docs: add pitch shifting documentation
F6/F7 keybindings, audio.pitch config option, voice pitch section
in USAGE.md.  Updated profiling notes to reflect per-thread coverage.
2026-02-28 13:55:46 +01:00
Username
f94f94907d test: add pitch shifting and modulator tests
Covers PitchShifter passthrough, frequency shift direction, output
length preservation, semitone clamping.  AudioPipeline tests verify
pitch property defaults, get/set, clamping, and dequeue integration.
2026-02-28 13:55:40 +01:00
Username
26695e6e70 feat: add voice pitch shifting
F6/F7 adjust outgoing voice pitch in 1-semitone steps (-12 to +12).
PitchShifter integrates into the capture path at dequeue time so the
PortAudio callback is never blocked.  Status bar shows current pitch
when non-zero.  Config reload treats pitch as a safe change.
2026-02-28 13:55:34 +01:00
Username
e8f34b4d80 profiler: add per-thread cProfile support
threading.setprofile installs a bootstrap that creates a per-thread
cProfile.Profile.  Stats from all threads are merged on periodic
dumps and at exit, capturing worker-thread hotspots (audio send
loop, pitch shifting).
2026-02-28 13:55:18 +01:00
Username
b62993459a modulator: remove state reset on pitch change
The semitones setter called _reset() which zeroed _prev_in and
discarded _phase on every pitch adjustment.  Both buffers are
independent of the pitch ratio — the vocoder recomputes time-stretch
positions each frame — so the reset produced hard discontinuities
(clicks) and a thread-safety race with no benefit.
2026-02-28 13:53:29 +01:00
Username
76c9c494a7 update roadmap and tasklist: phase 4 complete 2026-02-25 09:05:06 +01:00
Username
d9373f8a3b test: add widget unit and integration tests 2026-02-25 09:03:36 +01:00
Username
3dbd126239 app: wire audio device hot-swap on change 2026-02-25 00:26:27 +01:00
Username
9e6c11e588 audio: add DeviceMonitor for device list polling 2026-02-24 23:50:23 +01:00
Username
df6f2ff354 fix input alignment and double border in chat area 2026-02-24 17:03:05 +01:00
Username
85f373a8b5 fix lint and formatting violations in tests and source 2026-02-24 16:50:51 +01:00
Username
0f476a25d5 docs: add code review response with applied changes summary 2026-02-24 16:47:50 +01:00
Username
d4a8f34dac update tasklist: phase E complete 2026-02-24 16:46:03 +01:00
Username
aa17159f7e client: add return annotations and cache users/channels properties 2026-02-24 16:45:45 +01:00
Username
bbd28e2840 audio: add -> None return annotations 2026-02-24 16:45:41 +01:00
Username
0ae0e77814 app: deduplicate config detection, suppress hold-mode PTT spam 2026-02-24 16:45:30 +01:00
Username
c0be5f164e update tasklist: phase D complete 2026-02-24 16:38:31 +01:00
Username
d117576449 test: refactor audio tests to use public interfaces
Replace direct queue/attribute access with capture_callback and
get_capture_frame. Add stop-drains-queues test.
2026-02-24 16:38:03 +01:00
Username
65de74193a test: add _strip_html edge cases and config validation tests
strip_html: nested tags, malformed HTML, comments, entities.
config: unknown key filtering, missing file, mixed valid/invalid.
2026-02-24 16:38:02 +01:00
Username
7c57e03e6d test: add InputHistory unit tests
Covers empty history, push/up/down navigation, draft preservation,
boundary clamping, and full navigation cycle.
2026-02-24 16:37:59 +01:00
Username
4c1a545a8b test: add ReconnectManager unit tests
Covers success, retry, non-retryable abort, max-retry exhaustion,
cancel from another thread, and backoff formula.
2026-02-24 16:37:57 +01:00
Username
e2039558d7 update tasklist: phase C complete 2026-02-24 16:33:14 +01:00
Username
0cf3702c8f app: extract ReconnectManager to reconnect.py
Self-contained reconnection state machine with threading.Event
for instant, thread-safe cancellation. Removes ~50 lines and
all reconnect state from TuimbleApp.
2026-02-24 16:32:29 +01:00
Username
216a4be4fd app: extract InputHistory, _make_client factory, cache _find_root
InputHistory encapsulates history navigation (up/down/push).
_make_client() deduplicates 4 MumbleClient instantiation sites.
_find_root() result cached in set_state() to avoid double lookup.
2026-02-24 16:32:16 +01:00
Username
a6380b53f7 update tasklist: phase A and B complete 2026-02-24 16:26:02 +01:00
Username
bfa79eadcb app: replace audio send polling with blocking queue.get
Deterministic wake on data arrival instead of 5ms sleep loop.
Reduces CPU wake-ups and eliminates up to 5ms of added latency.
2026-02-24 16:25:42 +01:00
Username
7a2c8e3a5d audio: replace struct pack/unpack with array module in _apply_gain
Eliminates format string construction and intermediate tuple/list
allocations. Also drains stale frames from queues on stop().
2026-02-24 16:25:32 +01:00
Username
88e8d4d923 update tasklist with phased improvement plan 2026-02-24 16:23:11 +01:00
Username
897c5b1f6c client: guard join_channel and send_text against stale ids
join_channel raises ValueError on missing channel instead of
KeyError. send_text handles missing channel_id gracefully.
2026-02-24 16:23:05 +01:00
Username
44da57d084 config: filter unknown toml keys before dataclass init
Prevents opaque TypeError on typos in config.toml; unknown
keys are logged as warnings and silently dropped.
2026-02-24 16:23:04 +01:00
Username
8be475f23f app: replace regex html stripping with stdlib parser
Handles malformed tags, nested markup, and CDATA that the
naive regex missed.
2026-02-24 16:23:03 +01:00
Username
be6574ae79 app: debounce channel tree and cache render width 2026-02-24 15:32:57 +01:00
Username
57f4559a38 update roadmap and tasklist 2026-02-24 14:55:03 +01:00
Username
351b980b42 docs: add reconnection and error recovery docs 2026-02-24 14:54:40 +01:00
Username
6f590ede38 app: add reconnection status to status bar 2026-02-24 14:54:07 +01:00
Username
e443facd3b app: add auto-reconnect with backoff 2026-02-24 14:43:29 +01:00
Username
d02bb5239a app: stop audio on disconnect 2026-02-24 14:40:24 +01:00
Username
a041069cc9 client: add ConnectionFailed and reconnect method 2026-02-24 14:34:40 +01:00
Username
0b186f1f0c update roadmap and tasklist 2026-02-24 14:19:48 +01:00
Username
0b178d371e docs: add volume, certificate, and reload docs 2026-02-24 14:19:15 +01:00
Username
0bc41d1a46 app: add config reload on F5 2026-02-24 14:18:19 +01:00
Username
e9726da401 app: add volume key bindings and status display 2026-02-24 14:17:02 +01:00
Username
5e44ee9e38 app: wire volume and certificate config 2026-02-24 14:15:42 +01:00
Username
6467f5fe32 client: add certificate parameters 2026-02-24 14:15:24 +01:00
Username
e9944c88eb audio: add gain control to capture and playback 2026-02-24 14:14:52 +01:00
Username
eb98165370 config: add gain and certificate fields 2026-02-24 14:13:18 +01:00