From a71bf417b6e2b84b30bd042e5ce09a2aee5f7a2a Mon Sep 17 00:00:00 2001 From: Nolan Darilek Date: Tue, 29 Sep 2020 11:41:00 -0500 Subject: [PATCH] Bridge TTS callbacks to signals. --- TTS.gd | 21 ++++++++++++--------- src/lib.rs | 27 +++++++++++++++++---------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/TTS.gd b/TTS.gd index b84c855..7f3f2a9 100644 --- a/TTS.gd +++ b/TTS.gd @@ -1,12 +1,14 @@ tool extends Node +signal utterance_begin + +signal utterance_end + var TTS var tts -signal done - func _init(): if OS.get_name() == "Server" or OS.has_feature("JavaScript"): @@ -17,6 +19,10 @@ func _init(): TTS = preload("godot-tts.gdns") if TTS and (TTS.can_instance() or Engine.editor_hint): tts = TTS.new() + self.add_child(tts) + if self.are_utterance_callbacks_supported: + tts.connect("utterance_begin", self, "_on_utterance_begin") + tts.connect("utterance_end", self, "_on_utterance_end") else: print_debug("TTS not available!") @@ -229,15 +235,12 @@ func singular_or_plural(count, singular, plural): return plural -var _was_speaking = false +func _on_utterance_begin(): + emit_signal("utterance_begin") -func _process(delta): - if self.is_speaking: - _was_speaking = true - elif _was_speaking: - emit_signal("done") - _was_speaking = false +func _on_utterance_end(): + emit_signal("utterance_end") func _exit_tree(): diff --git a/src/lib.rs b/src/lib.rs index 8e51317..e6d0f87 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -15,18 +15,25 @@ struct TTS(Tts, Receiver); #[methods] impl TTS { - fn new(_owner: &Node) -> Self { + fn new(owner: &Node) -> Self { + owner.set_pause_mode(2); let tts = Tts::default().unwrap(); let (tx, rx) = channel(); - let tx_end = tx.clone(); - tts.on_utterance_begin(Some(Box::new(move |utterance| { - tx.send(Msg::UtteranceBegin(utterance)).unwrap(); - }))) - .expect("Failed to set utterance_begin callback"); - tts.on_utterance_end(Some(Box::new(move |utterance| { - tx_end.send(Msg::UtteranceEnd(utterance)).unwrap(); - }))) - .expect("Failed to set utterance_end callback"); + let Features { + utterance_callbacks, + .. + } = tts.supported_features(); + if utterance_callbacks { + let tx_end = tx.clone(); + tts.on_utterance_begin(Some(Box::new(move |utterance| { + tx.send(Msg::UtteranceBegin(utterance)).unwrap(); + }))) + .expect("Failed to set utterance_begin callback"); + tts.on_utterance_end(Some(Box::new(move |utterance| { + tx_end.send(Msg::UtteranceEnd(utterance)).unwrap(); + }))) + .expect("Failed to set utterance_end callback"); + } Self(tts, rx) }