diff --git a/tests/xvf3800_probe.py b/tests/xvf3800_probe.py new file mode 100644 index 0000000..4de7a96 --- /dev/null +++ b/tests/xvf3800_probe.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +import argparse +import time + +import numpy as np +import sounddevice as sd + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + "--device", + help="Exact input device name to test (as shown by --list-input-devices)", + required=True, + ) + parser.add_argument( + "--samplerate", + type=float, + default=16000.0, + help="Sample rate to test (default: 16000)", + ) + parser.add_argument( + "--seconds", + type=float, + default=2.0, + help="Duration to record for debug (default: 2s)", + ) + args = parser.parse_args() + + print("=== sounddevice.query_devices() (input subset) ===") + devices = sd.query_devices() + for idx, dev in enumerate(devices): + if dev["max_input_channels"] > 0: + flag = "*" if args.device in (dev["name"], str(idx)) else " " + print( + f"{flag} [{idx}] {dev['name']} " + f"(max_input_channels={dev['max_input_channels']}, " + f"default_samplerate={dev['default_samplerate']})" + ) + + print("\n=== Opening stream ===") + sd.default.samplerate = args.samplerate + sd.default.dtype = "int16" + + # Allow using either index or full name + device = args.device + try: + device = int(args.device) + except ValueError: + pass + + # First just open/close the stream to see what PortAudio says + with sd.InputStream(device=device, channels=0) as stream: + print(f"Opened stream with device={device}") + print(f" samplerate: {stream.samplerate}") + print(f" channels: {stream.channels}") + print(f" dtype: {stream.dtype}") + print(f" blocksize: {stream.blocksize}") + + # Now actually record a short block and inspect the shape + print("\n=== Recording test block ===") + duration = args.seconds + num_frames = int(duration * args.samplerate) + print(f"Recording {duration} seconds ({num_frames} frames)...") + + recorded = sd.rec(frames=num_frames, samplerate=args.samplerate, + channels=0, dtype="int16", device=device) + sd.wait() + + arr = np.array(recorded) + print(f"Recorded array shape: {arr.shape}, dtype={arr.dtype}") + if arr.ndim == 1: + print("-> Mono (1D) array returned") + elif arr.ndim == 2: + print(f"-> Multichannel: {arr.shape[1]} channels") + else: + print("-> Unexpected ndim:", arr.ndim) + + print(f"Sample min/max: {arr.min()} / {arr.max()}") + + +if __name__ == "__main__": + main()