45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
import queue
|
|
import threading
|
|
from enum import Enum
|
|
|
|
class AppState(Enum):
|
|
IDLE = "idle"
|
|
RECORDING = "recording"
|
|
TRANSCRIBING = "transcribing"
|
|
|
|
# ── Log queue ─────────────────────────────────────────────────────────────────
|
|
|
|
_log_buffer: list[str] = []
|
|
_log_queue: queue.Queue | None = None
|
|
_log_lock = threading.Lock()
|
|
_MAX_BUFFER = 500
|
|
|
|
def log(msg: str) -> None:
|
|
with _log_lock:
|
|
if _log_queue is not None:
|
|
_log_queue.put(msg)
|
|
else:
|
|
if len(_log_buffer) >= _MAX_BUFFER:
|
|
_log_buffer.pop(0)
|
|
_log_buffer.append(msg)
|
|
|
|
def set_log_queue(q: queue.Queue) -> None:
|
|
global _log_queue
|
|
with _log_lock:
|
|
_log_queue = q
|
|
buffered = list(_log_buffer)
|
|
_log_buffer.clear()
|
|
for msg in buffered:
|
|
q.put_nowait(msg)
|
|
|
|
# ── Global state ──────────────────────────────────────────────────────────────
|
|
|
|
state: AppState = AppState.IDLE
|
|
audio_chunks: list = []
|
|
model = None
|
|
tray_icon = None
|
|
overlay_window = None
|
|
overlay_tk = None
|
|
hotkey_listener = None
|
|
audio_manager = None
|