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