diff --git a/.tf5_mixer_cache/channels_cache.json b/.tf5_mixer_cache/channels_cache.json index be269e5..35d9786 100644 --- a/.tf5_mixer_cache/channels_cache.json +++ b/.tf5_mixer_cache/channels_cache.json @@ -11,21 +11,21 @@ "channel": 2, "name": "Gelato", "on": true, - "level_db": -6.25, + "level_db": -0.25, "pan": 0 }, "3": { "channel": 3, "name": "Talkback", "on": true, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "4": { "channel": 4, "name": "Sconosciuto", "on": false, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "5": { @@ -46,91 +46,91 @@ "channel": 7, "name": "Basso", "on": false, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "8": { "channel": 8, "name": "Sconosciuto", "on": false, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "9": { "channel": 9, "name": "Kick", "on": true, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "10": { "channel": 10, "name": "Snare", "on": true, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "11": { "channel": 11, "name": "Tom 1", "on": true, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "12": { "channel": 12, "name": "Tom 2", "on": true, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "13": { "channel": 13, "name": "Tom3", "on": true, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "14": { "channel": 14, "name": "Pan SX", "on": true, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "15": { "channel": 15, "name": "Pan dx", "on": true, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "16": { "channel": 16, "name": "Sconosciuto", "on": false, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "17": { "channel": 17, "name": "Sconosciuto", "on": false, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "18": { "channel": 18, "name": "Archetto", "on": false, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "19": { "channel": 19, "name": "Vox 5", "on": false, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "20": { @@ -144,14 +144,14 @@ "channel": 21, "name": "Sconosciuto", "on": false, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "22": { "channel": 22, "name": "Sconosciuto", "on": false, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "23": { @@ -179,7 +179,7 @@ "channel": 26, "name": "Sconosciuto", "on": false, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "27": { @@ -193,35 +193,35 @@ "channel": 28, "name": "Sconosciuto", "on": false, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "29": { "channel": 29, "name": "Pad", "on": true, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "30": { "channel": 30, "name": "Sconosciuto", "on": false, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "31": { "channel": 31, "name": "Sconosciuto", "on": false, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "32": { "channel": 32, "name": "Sconosciuto", "on": false, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "33": { @@ -242,42 +242,42 @@ "channel": 35, "name": "ch35", "on": true, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "36": { "channel": 36, "name": "ch36", "on": true, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "37": { "channel": 37, "name": "ch37", "on": true, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "38": { "channel": 38, "name": "ch38", "on": true, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "39": { "channel": 39, "name": "ch39", "on": true, - "level_db": -Infinity, + "level_db": null, "pan": 0 }, "40": { "channel": 40, "name": "ch40", "on": true, - "level_db": -Infinity, + "level_db": null, "pan": 0 } }, @@ -286,7 +286,7 @@ "mix": 1, "name": "Sinistro", "on": true, - "level_db": -Infinity + "level_db": null }, "2": { "mix": 2, @@ -310,7 +310,7 @@ "mix": 5, "name": "batteria", "on": true, - "level_db": 1.35 + "level_db": 1.1 }, "6": { "mix": 6, @@ -403,5 +403,5 @@ "level_db": 6.0 } }, - "timestamp": 1761592356.5132928 + "timestamp": 1761592662.917339 } \ No newline at end of file diff --git a/__pycache__/mixer_controller.cpython-312.pyc b/__pycache__/mixer_controller.cpython-312.pyc index 21741ab..b886b94 100644 Binary files a/__pycache__/mixer_controller.cpython-312.pyc and b/__pycache__/mixer_controller.cpython-312.pyc differ diff --git a/mixer_controller.py b/mixer_controller.py index 8c1b4b5..cc3e3df 100644 --- a/mixer_controller.py +++ b/mixer_controller.py @@ -63,7 +63,7 @@ class TF5MixerController: except socket.error as e: print(f'Errore di connessione dopo {max_retries} tentativi: {e}') - self._disconnect() # Forza riconnessione al prossimo tentativo + self._disconnect() if attempt < max_retries - 1: time.sleep(0.1) @@ -98,13 +98,30 @@ class TF5MixerController: return {"channels": {}, "mixes": {}, "timestamp": 0} def _save_cache(self): - """Salva la cache nel file.""" + """Salva la cache nel file, convertendo -inf in null.""" try: + # Crea una copia della cache per la serializzazione + cache_to_save = self._prepare_cache_for_json(self._cache) + with open(CACHE_FILE, 'w', encoding='utf-8') as f: - json.dump(self._cache, f, indent=2, ensure_ascii=False) + json.dump(cache_to_save, f, indent=2, ensure_ascii=False) except Exception as e: print(f"⚠️ Errore nel salvataggio della cache: {e}") + def _prepare_cache_for_json(self, obj): + """Converte ricorsivamente -inf in null per la serializzazione JSON.""" + if isinstance(obj, dict): + return {k: self._prepare_cache_for_json(v) for k, v in obj.items()} + elif isinstance(obj, list): + return [self._prepare_cache_for_json(item) for item in obj] + elif isinstance(obj, float): + # Converti -inf in null per JSON + if obj == float('-inf'): + return None + return obj + else: + return obj + def _is_cache_valid(self) -> bool: """Verifica se la cache è ancora valida.""" if not self._cache.get("channels"): @@ -112,6 +129,12 @@ class TF5MixerController: cache_age = time.time() - self._cache.get("timestamp", 0) return cache_age < CACHE_DURATION + def _normalize_level_from_cache(self, level_value): + """Normalizza il valore del livello dalla cache (gestisce None come -inf).""" + if level_value is None: + return float('-inf') + return level_value + def _update_channel_cache(self, channel: int): """Aggiorna la cache per un singolo canale leggendo dal mixer. @@ -555,10 +578,16 @@ class TF5MixerController: if not force_refresh and self._is_cache_valid(): cached_data = self._cache.get("channels", {}).get(str(channel)) if cached_data: + # Normalizza level_db (None -> -inf) + level_db = self._normalize_level_from_cache(cached_data.get("level_db")) return { "status": "success", "source": "cache", - **cached_data + "channel": cached_data["channel"], + "name": cached_data["name"], + "on": cached_data["on"], + "level_db": level_db, + "pan": cached_data.get("pan") } # Altrimenti leggi dal mixer @@ -613,10 +642,15 @@ class TF5MixerController: if not force_refresh and self._is_cache_valid(): cached_data = self._cache.get("mixes", {}).get(str(mix_number)) if cached_data: + # Normalizza level_db (None -> -inf) + level_db = self._normalize_level_from_cache(cached_data.get("level_db")) return { "status": "success", "source": "cache", - **cached_data + "mix": cached_data["mix"], + "name": cached_data["name"], + "on": cached_data["on"], + "level_db": level_db } # Altrimenti leggi dal mixer @@ -664,11 +698,13 @@ class TF5MixerController: for ch_str, info in self._cache.get("channels", {}).items(): if search_lower in info.get("name", "").lower(): + # Normalizza level_db quando restituisci i risultati + level_db = self._normalize_level_from_cache(info.get("level_db")) found_channels.append({ "channel": info["channel"], "name": info["name"], "on": info["on"], - "level_db": info["level_db"] + "level_db": level_db }) # Ordina per numero canale @@ -701,11 +737,13 @@ class TF5MixerController: for mix_str, info in self._cache.get("mixes", {}).items(): if search_lower in info.get("name", "").lower(): + # Normalizza level_db quando restituisci i risultati + level_db = self._normalize_level_from_cache(info.get("level_db")) found_mixes.append({ "mix": info["mix"], "name": info["name"], "on": info["on"], - "level_db": info["level_db"] + "level_db": level_db }) # Ordina per numero mix @@ -781,5 +819,4 @@ class TF5MixerController: "mixes": mixes, "cache_age_seconds": int(cache_age), "message": f"Riepilogo di {len(mixes)} mix (cache: {int(cache_age)}s fa)" - } - + } \ No newline at end of file