diff --git a/src/auracast/multicast.py b/src/auracast/multicast.py index a1f99f7..02203bb 100644 --- a/src/auracast/multicast.py +++ b/src/auracast/multicast.py @@ -674,7 +674,12 @@ class Streamer(): self.is_streaming = True # frame drop algo parameters - sample_rate = big['audio_input']._pcm_format.sample_rate + # In demo/precoded modes there may be no audio_input or no _pcm_format yet + ai = big.get('audio_input') + if ai is not None and hasattr(ai, '_pcm_format') and getattr(ai, '_pcm_format') is not None: + sample_rate = ai._pcm_format.sample_rate + else: + sample_rate = global_config.auracast_sampling_rate_hz samples_discarded_total = 0 # Total samples discarded discard_events = 0 # Number of times we discarded samples frames_since_last_discard = 999 # Guard: frames since last discard (start high to allow first drop) @@ -813,9 +818,11 @@ class Streamer(): # Increment guard counter (tracks frames since last discard) frames_since_last_discard += 1 - # Periodic stats logging + # Periodic stats logging (only for device/sounddevice streams, not WAV files) + # WAV file concurrent access causes deadlock in ThreadedAudioInput now = time.perf_counter() - if now - last_stats_log >= stats_interval: + is_device_stream = hasattr(big['audio_input'], '_stream') and big['audio_input']._stream is not None + if is_device_stream and now - last_stats_log >= stats_interval: # Get current buffer status from PortAudio current_sd_buffer = 0 if hasattr(big['audio_input'], '_stream') and big['audio_input']._stream: