Le peripherique audio ne peut plus geler l'interface
Le halo s'est fige une seconde fois, bloque sur « Je vous ecoute… », forme d'onde plate, process a 0 % CPU. Une autre application (Loom) tenait le micro : le stream.stop() de PortAudio s'est bloque. Or toggle() s'executait sur le thread principal Cocoa — toute l'interface a gele avec lui. Et le garde-fou pose le matin meme etait inoperant PAR CONSTRUCTION : c'est un NSTimer, il vit sur la boucle d'evenements que le blocage venait justement d'arreter. Un garde-fou qui depend de ce qu'il est cense sauver ne sauve rien. Desormais, le chemin appele depuis le thread principal ne touche PLUS JAMAIS au peripherique : ouverture et fermeture du flux partent en tache de fond, le thread principal ne fait que changer l'etat et rafraichir l'overlay. Deux tests verrouillent la regle avec un recorder qui leve si on l'appelle depuis le mauvais endroit. S'ajoute une garde COURTE (20 s) armee des l'arret : passe ce point il ne reste que la transcription, quelques secondes ; laisser 210 s de halo, c'est « fige » pour l'utilisateur meme si le code finit par se rattraper. Prouve en reproduisant la panne — un stop() qui ne rend jamais la main : l'interface continue de battre (6, 12, 24 battements) et le halo se ferme seul. Avant, le compteur serait reste fige. 69 tests passent. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -18,7 +18,10 @@ CONFIG = {
|
||||
"max_duration_s": 120.0,
|
||||
# Duree de vie MAXIMALE de l'overlay, garde-fou contre un halo fige (2026-08-21).
|
||||
# Doit couvrir un enregistrement maximal PUIS sa transcription.
|
||||
"duree_max_overlay_s": 210.0, # sécurité : arrêt auto après 2 min (fenêtre jamais figée)
|
||||
"duree_max_overlay_s": 210.0,
|
||||
# Garde COURTE, armee des l'arret : il ne reste alors que la transcription,
|
||||
# qui se compte en secondes. 210 s a ce stade, c'est « fige » pour l'utilisateur.
|
||||
"duree_max_transcription_s": 20.0, # sécurité : arrêt auto après 2 min (fenêtre jamais figée)
|
||||
"sample_rate": 16000,
|
||||
"fps": 30,
|
||||
# --- overlay « barre de dictee » (bas de l'ecran) ---
|
||||
@@ -158,6 +161,11 @@ def validate_config(config):
|
||||
raise ValueError("sample_rate doit être > 0")
|
||||
if not config["hotkey"]:
|
||||
raise ValueError("hotkey ne peut pas être vide")
|
||||
d = config.get("duree_max_transcription_s")
|
||||
if d is not None and not (10.0 <= d <= 30.0):
|
||||
raise ValueError("duree_max_transcription_s doit tenir entre 10 et 30 s")
|
||||
if d is not None and d >= config["duree_max_overlay_s"]:
|
||||
raise ValueError("duree_max_transcription_s doit rester sous duree_max_overlay_s")
|
||||
if not duree_vie_overlay_coherente(config):
|
||||
raise ValueError(
|
||||
"duree_max_overlay_s doit couvrir max_duration_s + "
|
||||
|
||||
Reference in New Issue
Block a user