summaryrefslogtreecommitdiffstats
path: root/src/plugins/tts/android/src/qtexttospeech_android.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/tts/android/src/qtexttospeech_android.cpp')
-rw-r--r--src/plugins/tts/android/src/qtexttospeech_android.cpp49
1 files changed, 45 insertions, 4 deletions
diff --git a/src/plugins/tts/android/src/qtexttospeech_android.cpp b/src/plugins/tts/android/src/qtexttospeech_android.cpp
index a3cac58..b4bb006 100644
--- a/src/plugins/tts/android/src/qtexttospeech_android.cpp
+++ b/src/plugins/tts/android/src/qtexttospeech_android.cpp
@@ -250,7 +250,16 @@ bool QTextToSpeechEngineAndroid::setVolume(double volume)
QVector<QLocale> QTextToSpeechEngineAndroid::availableLocales() const
{
- return QVector<QLocale>();
+ auto locales = m_speech.callObjectMethod("getAvailableLocales", "()Ljava/util/List;");
+ int count = locales.callMethod<jint>("size");
+ QVector<QLocale> result;
+ result.reserve(count);
+ for (int i = 0; i < count; ++i) {
+ auto locale = locales.callObjectMethod("get", "(I)Ljava/lang/Object;", i);
+ auto localeName = locale.callObjectMethod<jstring>("toString").toString();
+ result << QLocale(localeName);
+ }
+ return result;
}
bool QTextToSpeechEngineAndroid::setLocale(const QLocale &locale)
@@ -272,21 +281,53 @@ bool QTextToSpeechEngineAndroid::setLocale(const QLocale &locale)
QLocale QTextToSpeechEngineAndroid::locale() const
{
+ auto locale = m_speech.callObjectMethod("getLocale", "()Ljava/util/Locale;");
+ if (locale.isValid()) {
+ auto localeName = locale.callObjectMethod<jstring>("toString").toString();
+ return QLocale(localeName);
+ }
return QLocale();
}
+QVoice QTextToSpeechEngineAndroid::javaVoiceObjectToQVoice(QJNIObjectPrivate &obj) const
+{
+ auto voiceName = obj.callObjectMethod<jstring>("getName").toString();
+ QVoice::Gender gender;
+ if (voiceName.contains(QStringLiteral("#male"))) {
+ gender = QVoice::Male;
+ } else if (voiceName.contains(QStringLiteral("#female"))) {
+ gender = QVoice::Female;
+ } else {
+ gender = QVoice::Unknown;
+ }
+ return createVoice(voiceName, gender, QVoice::Other, voiceName);
+}
+
QVector<QVoice> QTextToSpeechEngineAndroid::availableVoices() const
{
- return QVector<QVoice>();
+ auto voices = m_speech.callObjectMethod("getAvailableVoices", "()Ljava/util/List;");
+ int count = voices.callMethod<jint>("size");
+ QVector<QVoice> result;
+ result.reserve(count);
+ for (int i = 0; i < count; ++i) {
+ auto voice = voices.callObjectMethod("get", "(I)Ljava/lang/Object;", i);
+ result << javaVoiceObjectToQVoice(voice);
+ }
+ return result;
}
-bool QTextToSpeechEngineAndroid::setVoice(const QVoice & /* voice */)
+bool QTextToSpeechEngineAndroid::setVoice(const QVoice &voice)
{
- return false;
+ return m_speech.callMethod<jboolean>("setVoice", "(Ljava/lang/String;)Z",
+ QJNIObjectPrivate::fromString(voiceData(voice).toString()).object());
}
QVoice QTextToSpeechEngineAndroid::voice() const
{
+ auto voice = m_speech.callObjectMethod("getVoice", "()Ljava/lang/Object;");
+ if (voice.isValid()) {
+ return javaVoiceObjectToQVoice(voice);
+ }
return QVoice();
}