From d0cbe42b3057b8790af5bdcb7942dc5b63a8302c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 6 Feb 2023 18:47:29 +0530 Subject: [PATCH] E-book viewer: Fix a regression that caused a spurious error on Windows when reading out selected text --- src/calibre/gui2/tts/windows.py | 46 ++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/calibre/gui2/tts/windows.py b/src/calibre/gui2/tts/windows.py index c540ce3cbf..5f57b3e2cf 100644 --- a/src/calibre/gui2/tts/windows.py +++ b/src/calibre/gui2/tts/windows.py @@ -76,35 +76,39 @@ class Client: self.backend.speak(self.current_chunks[self.current_chunk_idx], is_cued=True) def handle_event(self, x): - if isinstance(x, MarkReached) and self.current_chunks: - self.last_mark = x.id - self.callback_ignoring_errors(Event(EventType.mark, x.id)) - elif isinstance(x, MediaStateChanged) and self.current_chunks: - if x.state is MediaState.ended: - if self.current_chunk_idx >= len(self.current_chunks) - 1: + if isinstance(x, MarkReached): + if self.current_chunks: + self.last_mark = x.id + self.callback_ignoring_errors(Event(EventType.mark, x.id)) + elif isinstance(x, MediaStateChanged): + if self.current_chunks: + if x.state is MediaState.ended: + if self.current_chunk_idx >= len(self.current_chunks) - 1: + self.clear_chunks() + self.callback_ignoring_errors(Event(EventType.end)) + else: + self.current_chunk_idx += 1 + self.speak_current_chunk() + elif x.state is MediaState.failed: self.clear_chunks() - self.callback_ignoring_errors(Event(EventType.end)) - else: - self.current_chunk_idx += 1 - self.speak_current_chunk() - elif x.state is MediaState.failed: - self.clear_chunks() - self.callback_ignoring_errors(Event(EventType.cancel)) - e = x.as_exception() - e.display_to_user = True - raise e - elif x.state is MediaState.opened: - self.callback_ignoring_errors(Event(EventType.resume if self.next_start_is_resume else EventType.begin)) - self.next_start_is_resume = False + self.callback_ignoring_errors(Event(EventType.cancel)) + e = x.as_exception() + e.display_to_user = True + raise e + elif x.state is MediaState.opened: + self.callback_ignoring_errors(Event(EventType.resume if self.next_start_is_resume else EventType.begin)) + self.next_start_is_resume = False elif isinstance(x, Error): raise x.as_exception(check_for_no_audio_devices=True) else: raise KeyError(f'Unknown event type: {x}') def speak_simple_text(self, text): - self.current_callback = None + self.backend.pause() self.clear_chunks() - self.backend.speak(text) + self.current_callback = None + if text: + self.backend.speak(text) def speak_marked_text(self, text, callback): self.backend.pause()