diff --git a/routes/listening_post.py b/routes/listening_post.py index d023207..271e043 100644 --- a/routes/listening_post.py +++ b/routes/listening_post.py @@ -839,9 +839,13 @@ def _start_audio_stream(frequency: float, modulation: str): try: ready, _, _ = select.select([audio_process.stdout], [], [], 4.0) if not ready: - logger.warning("Audio pipeline produced no data in startup window") + logger.warning("Audio pipeline produced no data in startup window — killing stalled pipeline") + _stop_audio_stream_internal() + return except Exception as e: logger.warning(f"Audio startup check failed: {e}") + _stop_audio_stream_internal() + return audio_running = True audio_frequency = frequency @@ -866,6 +870,8 @@ def _stop_audio_stream_internal(): audio_running = False audio_frequency = 0.0 + had_processes = audio_process is not None or audio_rtl_process is not None + # Kill the pipeline processes and their groups if audio_process: try: @@ -892,7 +898,8 @@ def _stop_audio_stream_internal(): audio_rtl_process = None # Pause for SDR device USB interface to be released by kernel - time.sleep(1.0) + if had_processes: + time.sleep(1.0) # ============================================ @@ -1400,13 +1407,6 @@ def audio_probe() -> Response: @listening_post_bp.route('/audio/stream') def stream_audio() -> Response: """Stream WAV audio.""" - # Optionally restart pipeline so the stream starts with a fresh header - if request.args.get('fresh') == '1' and audio_running: - try: - _start_audio_stream(audio_frequency or 0.0, audio_modulation or 'fm') - except Exception as e: - logger.error(f"Audio stream restart failed: {e}") - # Wait for audio to be ready (up to 2 seconds for modulation/squelch changes) for _ in range(40): if audio_running and audio_process: diff --git a/static/js/modes/listening-post.js b/static/js/modes/listening-post.js index 35485cc..e40e40b 100644 --- a/static/js/modes/listening-post.js +++ b/static/js/modes/listening-post.js @@ -319,7 +319,7 @@ function stopScanner() { ? `/controller/agents/${listeningPostCurrentAgent}/listening_post/stop` : '/listening/scanner/stop'; - fetch(endpoint, { method: 'POST' }) + return fetch(endpoint, { method: 'POST' }) .then(() => { if (!isAgentMode && typeof releaseDevice === 'function') releaseDevice('scanner'); listeningPostCurrentAgent = null; @@ -2245,7 +2245,7 @@ async function _startDirectListenInternal() { try { if (isScannerRunning) { - stopScanner(); + await stopScanner(); } const freqInput = document.getElementById('radioScanStart');