mirror of
https://github.com/jamiepine/voicebox.git
synced 2026-09-18 22:30:40 -07:00
Dep swap: - Drop the git-pinned jamiepine/rdev fork we were carrying since the upstream crate is abandoned. - Depend on keytap 0.2 from crates.io — our own cross-platform global keyboard tap crate. Clean shutdown via Drop, Sonoma-safe by design (no TSMGetInputSourceProperty calls off the main thread, so `set_is_main_thread(false)` is gone), and properly versioned. Chord engine rewrite: - Delete hotkey_monitor.rs's internal Chord state machine (Match enum, KeyEvent enum, step()/classify() methods, associated unit tests). keytap's ChordMatcher subsumes it: Momentary chord for PTT, add_toggle() for Toggle-to-talk, longest-match resolution, sticky-end for Toggle. Net: -80 LOC in hotkey_monitor.rs; the remaining module is the dispatcher loop + Effect→Tauri translation. - Preserve the PTT→Toggle "RestartRecording" upgrade signal. keytap emits End(PTT)+Start(Toggle) atomically (same Instant) when the held set upgrades from a shorter chord to a longer superset. The dispatcher peeks at the matcher with a 5 ms recv_timeout after any End and coalesces the pair into Effect::RestartRecording so the frontend still gets the "discard the transition-moment audio" signal instead of an unrelated Stop+Start pair. - HotkeyMonitor::update_bindings now actually tears down the tap on empty bindings instead of leaving an idle CGEventTap around. New bindings rebuild the matcher and the dispatcher thread from scratch. key_codes.rs: - Rewrite the browser-code → Key table against keytap's cleaner Key variant names (`A`..`Z` not `KeyA`..`KeyZ`, `Digit0`..`Digit9` not `Num0`..`Num9`, `ArrowUp` not `UpArrow`, `AltLeft`/`AltRight` instead of `Alt`/`AltGr`, `Period` not `Dot`, …). On-disk chord string format (W3C `KeyboardEvent.code` identifiers) is unchanged, so capture_settings rows written before the swap round-trip identically. Legacy aliases (`Alt`, `AltGr`, `Num0`, `UpArrow`, `Dot`, …) kept for forward-compat on old rows. main.rs / input_monitoring.rs: - Update the few doc comments that referenced `rdev::listen` to describe keytap's Tap; no behavioural change. - build_chord_bindings now imports from keytap::Key. - enable_hotkey / disable_hotkey / update_chord_bindings reach into HotkeyMonitor via &mut since apply()/update_bindings() now mutate. Tests live in keytap now (22 chord-related tests in keytap 0.2, including the PTT→Toggle upgrade scenario that used to be tested in hotkey_monitor.rs). Voicebox's hotkey_monitor.rs is thin enough that local testing would be trivia. Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
68 lines
2.2 KiB
TOML
68 lines
2.2 KiB
TOML
[package]
|
|
name = "voicebox"
|
|
version = "0.5.0"
|
|
description = "A production-quality desktop app for Qwen3-TTS voice cloning and generation"
|
|
authors = ["you"]
|
|
license = ""
|
|
repository = ""
|
|
edition = "2021"
|
|
|
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
|
|
[build-dependencies]
|
|
tauri-build = { version = "2.0", features = [] }
|
|
|
|
[dependencies]
|
|
tauri = { version = "2.0", features = ["macos-private-api"] }
|
|
tauri-plugin-dialog = "2.0"
|
|
tauri-plugin-fs = "2.0"
|
|
tauri-plugin-shell = "2.0"
|
|
serde = { version = "1.0", features = ["derive"] }
|
|
serde_json = "1.0"
|
|
tokio = { version = "1", features = ["full"] }
|
|
reqwest = { version = "0.12", features = ["blocking", "json", "stream"] }
|
|
hound = "3.5"
|
|
base64 = "0.22"
|
|
cpal = "0.15"
|
|
symphonia = { version = "0.5", features = ["all"] }
|
|
scopeguard = "1.2.0"
|
|
|
|
[target.'cfg(target_os = "macos")'.dependencies]
|
|
screencapturekit = { version = "1", features = ["async"] }
|
|
coreaudio-sys = "0.2"
|
|
objc = "0.2"
|
|
core-foundation-sys = "0.8"
|
|
|
|
[target.'cfg(target_os = "windows")'.dependencies]
|
|
wasapi = "0.22"
|
|
windows = { version = "0.62", features = [
|
|
"Win32_Foundation",
|
|
"Win32_UI_WindowsAndMessaging",
|
|
"Win32_UI_Accessibility",
|
|
"Win32_UI_Input_KeyboardAndMouse",
|
|
"Win32_System_Com",
|
|
"Win32_System_DataExchange",
|
|
"Win32_System_Memory",
|
|
"Win32_System_Threading",
|
|
] }
|
|
|
|
[target.'cfg(target_os = "linux")'.dependencies]
|
|
webkit2gtk = "2.0"
|
|
|
|
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
|
|
tauri-plugin-updater = "2.0"
|
|
tauri-plugin-process = "2.0"
|
|
# Observe-only global keyboard tap. Covers macOS, Windows, and Linux
|
|
# (evdev) with left/right modifier fidelity, which is the hard
|
|
# requirement the chord engine needs. keytap is our own crate
|
|
# (jamiepine/keytap), published to crates.io, that replaces the
|
|
# abandoned Narsil/rdev we previously pinned via git — same capability
|
|
# surface, clean shutdown via Drop, no `set_is_main_thread(false)`
|
|
# dance required (the Sonoma-crashing layout-translation path simply
|
|
# isn't called).
|
|
keytap = "0.2"
|
|
|
|
[features]
|
|
# This feature is used for production builds or when `devPath` points to the filesystem
|
|
custom-protocol = ["tauri/custom-protocol"]
|