#!/usr/bin/env python3 """bit-exact verification — прогон всех свипов, побайтовое сравнение int24 PCM.""" import subprocess import os import glob import wave import struct import sys RENDERER = "/home/m/re-tools/dsp/harness" TEST_ROOT = "/home/m/soothe-bt" def read_wav24(path): """Read WAV24 file and return numpy array or list of int24 samples.""" with wave.open(path, 'rb') as w: n = w.getnframes() data = w.readframes(n * w.getnchannels()) sw = w.getsampwidth() nc = w.getnchannels() if sw == 3: samples = [] for i in range(0, len(data), 3): val = struct.unpack(' render -> out.wav, compare to ref.wav.""" in_wav = f"{TEST_ROOT}/{name}.wav" ref_wav = f"{TEST_ROOT}/{name}_ref.wav" out_wav = f"/tmp/out_{name}.wav" if not os.path.exists(in_wav): print(f"SKIP {name}: no input") return None if not run_harness(in_wav, out_wav): print(f"FAIL {name}: renderer error") return False match, diff, max_diff = compare_bytes(ref_wav, out_wav) if match: print(f"PASS {name}") return True else: print(f"FAIL {name}: {diff} byte differences") return False def main(): rpps = sorted(glob.glob(f"{TEST_ROOT}/*.rpp")) print(f"Found {len(rpps)} RPP files") passed = 0 failed = 0 skipped = 0 for rpp in rpps[:10]: # Test first 10 name = os.path.splitext(os.path.basename(rpp))[0] wav = f"{TEST_ROOT}/{name}.wav" if not os.path.exists(wav): skipped += 1 continue result = test_sweep(name) if result is True: passed += 1 elif result is False: failed += 1 else: skipped += 1 print(f"\nSummary: {passed} passed, {failed} failed, {skipped} skipped") if __name__ == "__main__": main()