diff --git a/config.yaml b/config.yaml index 76adcc2..8e3be9c 100644 --- a/config.yaml +++ b/config.yaml @@ -39,6 +39,10 @@ artifact_detection: enabled: true threshold_db: 6.0 # Energy change threshold in dB between consecutive windows (detects level changes) +latency: + max_std_dev_ms: 0.5 # Maximum allowed std deviation; test fails if exceeded + min_avg_ms: 1.0 # Minimum expected average latency; near-zero indicates bad loopback + latency_buildup: measurement_interval: 10 # seconds between latency measurements max_duration: null # maximum test duration in seconds (null = run until canceled) diff --git a/src/audio_tests.py b/src/audio_tests.py index 24ea935..511871a 100644 --- a/src/audio_tests.py +++ b/src/audio_tests.py @@ -235,11 +235,22 @@ def run_latency_test(config: Dict, num_measurements: int = 5, save_plots: bool = last_correlation = correlation last_lags = lags + avg = float(np.mean(latencies)) + std_dev = float(np.std(latencies)) + latency_cfg = config.get('latency', {}) + max_std_dev_ms = latency_cfg.get('max_std_dev_ms', None) + min_avg_ms = latency_cfg.get('min_avg_ms', None) + valid = True + if max_std_dev_ms is not None and std_dev > max_std_dev_ms: + valid = False + if min_avg_ms is not None and avg < min_avg_ms: + valid = False latency_stats = { - 'avg': float(np.mean(latencies)), + 'avg': avg, 'min': float(np.min(latencies)), 'max': float(np.max(latencies)), - 'std': float(np.std(latencies)) + 'std': std_dev, + 'valid': valid } if save_plots and output_dir and last_recording is not None: diff --git a/test_latency.py b/test_latency.py index 2f7258e..9ab7947 100644 --- a/test_latency.py +++ b/test_latency.py @@ -47,7 +47,9 @@ def main(): try: latency_stats = run_latency_test(config, num_measurements=args.measurements, save_plots=save_plots, output_dir=test_output_dir) - print(f"✓ Latency: avg={latency_stats['avg']:.3f}ms, " + valid = latency_stats.get('valid', True) + status = "PASS" if valid else "FAIL" + print(f"{'✓' if valid else '✗'} Latency [{status}]: avg={latency_stats['avg']:.3f}ms, " f"min={latency_stats['min']:.3f}ms, max={latency_stats['max']:.3f}ms, " f"std={latency_stats['std']:.3f}ms") except Exception as e: