#!/usr/bin/env python3 import subprocess import json import sys import time def get_default_sink_name(): """ Obtiene el nombre del sink predeterminado usando pactl. Retorna el nombre del sink como una cadena, o None si no se encuentra. """ try: result = subprocess.run(['pactl', 'get-default-sink'], stdout=subprocess.PIPE, text=True, check=True) sink_name = result.stdout.strip() if sink_name: return sink_name else: return None except subprocess.CalledProcessError as e: print(f"Error al ejecutar pactl: {e}", file=sys.stderr) return None def get_sink_rate(sink_name): """ Ejecuta pw-dump y extrae la tasa de muestreo ('rate') del sink con el nombre dado. Retorna la tasa como un entero, o None si no se encuentra. """ try: # Ejecuta pw-dump y captura la salida result = subprocess.run(['pw-dump'], stdout=subprocess.PIPE, text=True, check=True) data = json.loads(result.stdout) # Verifica si los datos son una lista o un diccionario if isinstance(data, list): nodes = data elif isinstance(data, dict): nodes = data.get('nodes', []) else: print(f"Tipo de datos no soportado: {type(data)}", file=sys.stderr) return None for node in nodes: props = node.get('info', {}).get('props', {}) node_name = props.get('node.name', '') media_class = props.get('media.class', '') if media_class != 'Audio/Sink': continue if node_name != sink_name: continue formats = node.get('info', {}).get('params', {}).get('Format', []) for fmt in formats: rate = fmt.get('rate') if rate: return rate return None except subprocess.CalledProcessError as e: print(f"Error al ejecutar pw-dump: {e}", file=sys.stderr) return None except json.JSONDecodeError as e: print(f"Error al decodificar JSON: {e}", file=sys.stderr) return None def main(): default_sink = get_default_sink_name() if not default_sink: print("No se pudo obtener el sink predeterminado.", file=sys.stderr) sys.exit(1) previous_rate = get_sink_rate(default_sink) if previous_rate: print(f"{previous_rate} Hz") else: print("No se encontrĂ³ una tasa de muestreo en el sink predeterminado.") while True: try: time.sleep(1) # Intervalo de 1 segundo entre sondeos current_rate = get_sink_rate(default_sink) if current_rate != previous_rate and current_rate is not None: print(f"{current_rate} Hz") previous_rate = current_rate except KeyboardInterrupt: print("\nMonitoreo terminado por el usuario.") sys.exit(0) if __name__ == "__main__": main()