diff --git a/modules/ffmpeg_procman.py b/modules/ffmpeg_procman.py index f97b2e1..1f73cfd 100644 --- a/modules/ffmpeg_procman.py +++ b/modules/ffmpeg_procman.py @@ -28,7 +28,13 @@ class ProcessManager(ABC_ProcessManager): return pr def anything_playing(self) -> bool: with self.lock: - self.processes = [p for p in self.processes if p.process.poll() is None] + alive = [] + for p in self.processes: + if p.process.poll() is None: alive.append(p) + else: + try: p.process.wait(timeout=0) + except subprocess.TimeoutExpired: pass + self.processes = alive return bool(self.processes) def stop_all(self, timeout: float | None = None) -> None: with self.lock: diff --git a/radioPlayer.py b/radioPlayer.py index feab647..fda537b 100644 --- a/radioPlayer.py +++ b/radioPlayer.py @@ -267,12 +267,14 @@ class RadioPlayer: pr = self.procman.play(track) [module.on_new_track(song_i, pr.track, next_track) for module in self.modman.simple_modules if module] end_time = pr.started_at + pr.duration + pr.track.focus_time_offset + self.procman.anything_playing() while end_time >= time.monotonic() and pr.process.poll() is None: start = time.monotonic() [module.progress(song_i, track, time.monotonic() - pr.started_at, pr.duration, end_time - pr.started_at) for module in self.modman.simple_modules if module] if (elapsed := time.monotonic() - start) < 1 and (remaining_until_end := end_time - time.monotonic()) > 0: time.sleep(min(1 - elapsed, remaining_until_end)) + self.procman.anything_playing() if next_track: prefetch(next_track.path) i += 1 if not extend: song_i += 1