macOS: Workaround for the OS not sending speak end events

This commit is contained in:
Kovid Goyal 2020-12-07 15:35:14 +05:30
parent 80256b2e49
commit a3d2870af1
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -8,6 +8,7 @@ from .common import Event, EventType
class Client: class Client:
mark_template = '[[sync 0x{:x}]]' mark_template = '[[sync 0x{:x}]]'
END_MARK = 0xffffffff
name = 'nsss' name = 'nsss'
@classmethod @classmethod
@ -35,10 +36,17 @@ class Client:
def handle_message(self, message_type, data): def handle_message(self, message_type, data):
from calibre_extensions.cocoa import MARK, END from calibre_extensions.cocoa import MARK, END
print(message_type, data)
if message_type == MARK: if message_type == MARK:
event = Event(EventType.mark, data) if data == self.END_MARK:
event = Event(EventType.end)
self.status = {'synthesizing': False, 'paused': False}
else:
event = Event(EventType.mark, data)
elif message_type == END: elif message_type == END:
event = Event(EventType.end if data else EventType.cancel) if data:
return # normal end event is handled by END_MARK
event = Event(EventType.cancel)
self.status = {'synthesizing': False, 'paused': False} self.status = {'synthesizing': False, 'paused': False}
else: else:
return return
@ -56,6 +64,9 @@ class Client:
def speak_marked_text(self, text, callback): def speak_marked_text(self, text, callback):
self.current_callback = callback self.current_callback = callback
# on macOS didFinishSpeaking is never called for some reason, so work
# around it by adding an extra, special mark at the end
text += self.mark_template.format(self.END_MARK)
self.nsss.speak(text) self.nsss.speak(text)
self.status = {'synthesizing': True, 'paused': False} self.status = {'synthesizing': True, 'paused': False}
self.current_callback(Event(EventType.begin)) self.current_callback(Event(EventType.begin))