diff --git a/TTS.gd b/TTS.gd index 5c7a4b4..cccc2c4 100644 --- a/TTS.gd +++ b/TTS.gd @@ -166,7 +166,7 @@ var is_rate_supported setget , _get_is_rate_supported func _get_are_utterance_callbacks_supported(): if Engine.has_singleton("GodotTTS"): - return false + return true elif OS.has_feature('JavaScript'): return false elif tts != null: diff --git a/src/main/java/games/lightsout/godot/tts/TTS.java b/src/main/java/games/lightsout/godot/tts/TTS.java index ccfe20d..4617a4c 100644 --- a/src/main/java/games/lightsout/godot/tts/TTS.java +++ b/src/main/java/games/lightsout/godot/tts/TTS.java @@ -1,14 +1,18 @@ package games.lightsout.godot.tts; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.godotengine.godot.Godot; import org.godotengine.godot.plugin.GodotPlugin; +import org.godotengine.godot.plugin.SignalInfo; import android.accessibilityservice.AccessibilityServiceInfo; import android.content.Context; import android.speech.tts.TextToSpeech; +import android.speech.tts.UtteranceProgressListener; import android.view.accessibility.AccessibilityManager; public class TTS extends GodotPlugin implements TextToSpeech.OnInitListener { @@ -18,12 +22,14 @@ public class TTS extends GodotPlugin implements TextToSpeech.OnInitListener { private Integer utteranceId = 0; - public void speak(String text, boolean interrupt) { + public int speak(String text, boolean interrupt) { int mode = TextToSpeech.QUEUE_ADD; if (interrupt) mode = TextToSpeech.QUEUE_FLUSH; tts.speak(text, mode, null, this.utteranceId.toString()); + int rv = this.utteranceId.intValue(); this.utteranceId++; + return rv; } public void stop() { @@ -55,9 +61,27 @@ public class TTS extends GodotPlugin implements TextToSpeech.OnInitListener { } } + class Listener extends UtteranceProgressListener { + public void onStart(String utteranceId) { + Integer id = Integer.parseInt(utteranceId); + TTS.this.emitSignal("utterance_begin", id); + } + + public void onDone(String utteranceId) { + Integer id = Integer.parseInt(utteranceId); + TTS.this.emitSignal("utterance_end", id); + } + + public void onError(String utteranceId) { + Integer id = Integer.parseInt(utteranceId); + TTS.this.emitSignal("utterance_end", id); + } + } + public TTS(Godot godot) { super(godot); this.tts = new TextToSpeech(this.getActivity(), this); + tts.setOnUtteranceProgressListener(new Listener()); } @Override @@ -70,6 +94,13 @@ public class TTS extends GodotPlugin implements TextToSpeech.OnInitListener { return Arrays.asList("speak", "stop", "get_rate", "set_rate", "has_screen_reader", "is_speaking"); } + @Override + public Set getPluginSignals() { + SignalInfo begin = new SignalInfo("utterance_begin", Integer.class); + SignalInfo end = new SignalInfo("utterance_end", Integer.class); + return new HashSet(Arrays.asList(begin, end)); + } + public void onInit(int status) { }