diff --git a/timeturner.py b/timeturner.py index bda9d61..76b63b8 100644 --- a/timeturner.py +++ b/timeturner.py @@ -7,35 +7,35 @@ import time import select def start_ltc_stream(): - ffmpeg = subprocess.Popen( - ["ffmpeg", "-f", "alsa", "-i", "hw:2", "-ac", "1", "-ar", "48000", "-f", "s16le", "-"], + # Launch arecord piped into ltcdump + arecord = subprocess.Popen( + ["arecord", "-f", "S16_LE", "-c", "1", "-r", "48000", "-D", "hw:2,0"], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL ) ltcdump = subprocess.Popen( ["ltcdump", "-f", "-"], - stdin=ffmpeg.stdout, + stdin=arecord.stdout, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, text=True, bufsize=1 ) - ffmpeg.stdout.close() - return ffmpeg, ltcdump - + arecord.stdout.close() # Let ltcdump consume the pipe + return arecord, ltcdump def main(stdscr): curses.curs_set(0) stdscr.nodelay(True) - ffmpeg_proc, ltcdump_proc = start_ltc_stream() + arecord_proc, ltcdump_proc = start_ltc_stream() latest_tc = "⌛ Waiting for LTC..." last_update = time.time() try: while True: - # Check for new LTC output (non-blocking) + # Non-blocking read from ltcdump rlist, _, _ = select.select([ltcdump_proc.stdout], [], [], 0) if rlist: line = ltcdump_proc.stdout.readline() @@ -45,17 +45,17 @@ def main(stdscr): latest_tc = line last_update = time.time() - # Check if signal or subprocess died + # Timeout / error detection if time.time() - last_update > 1: - if ltcdump_proc.poll() is not None or ffmpeg_proc.poll() is not None: + if ltcdump_proc.poll() is not None or arecord_proc.poll() is not None: latest_tc = "💥 Decoder crashed or stream stopped" else: latest_tc = "⚠️ No LTC signal" - # Draw UI + # Draw the curses UI stdscr.erase() stdscr.addstr(1, 2, "🌀 NTP Timeturner Status") - stdscr.addstr(3, 4, "Streaming LTC from default input...") + stdscr.addstr(3, 4, "Streaming LTC from hw:2,0...") stdscr.addstr(5, 6, f"🕰️ LTC Timecode: {latest_tc}") stdscr.refresh() @@ -66,12 +66,12 @@ def main(stdscr): stdscr.refresh() time.sleep(1) finally: - ffmpeg_proc.terminate() + arecord_proc.terminate() ltcdump_proc.terminate() if __name__ == "__main__": - if not shutil.which("ltcdump") or not shutil.which("ffmpeg"): - print("❌ Required tools not found (ltcdump or ffmpeg). Install and retry.") + if not shutil.which("ltcdump") or not shutil.which("arecord"): + print("❌ Required tools not found (ltcdump or arecord). Install and retry.") exit(1) curses.wrapper(main)