summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/speech/hello_speak/mainwindow.cpp5
-rw-r--r--examples/speech/quickspeech/main.qml2
-rw-r--r--src/plugins/tts/darwin/darwin_plugin.json1
-rw-r--r--src/plugins/tts/flite/flite_plugin.json1
-rw-r--r--src/plugins/tts/macos/macos_plugin.json1
-rw-r--r--src/plugins/tts/mock/mock_plugin.json1
-rw-r--r--src/plugins/tts/sapi/sapi_plugin.json1
-rw-r--r--src/plugins/tts/speechdispatcher/speechd_plugin.json3
-rw-r--r--src/plugins/tts/winrt/winrt_plugin.json1
-rw-r--r--src/tts/doc/src/qttexttospeech-engines.qdoc9
-rw-r--r--src/tts/qtexttospeech.cpp9
-rw-r--r--src/tts/qtexttospeech.h5
-rw-r--r--tests/auto/qtexttospeech/tst_qtexttospeech.cpp4
13 files changed, 38 insertions, 5 deletions
diff --git a/examples/speech/hello_speak/mainwindow.cpp b/examples/speech/hello_speak/mainwindow.cpp
index 336f9dc..0f5d915 100644
--- a/examples/speech/hello_speak/mainwindow.cpp
+++ b/examples/speech/hello_speak/mainwindow.cpp
@@ -76,6 +76,11 @@ void MainWindow::engineSelected(int index)
? new QTextToSpeech(this)
: new QTextToSpeech(engineName, this);
+ const bool hasPauseResume = m_speech->engineCapabilities()
+ & QTextToSpeech::Capability::PauseResume;
+ ui.pauseButton->setVisible(hasPauseResume);
+ ui.resumeButton->setVisible(hasPauseResume);
+
// Block signals of the languages combobox while populating
QSignalBlocker blocker(ui.language);
diff --git a/examples/speech/quickspeech/main.qml b/examples/speech/quickspeech/main.qml
index 169a33c..3d7b019 100644
--- a/examples/speech/quickspeech/main.qml
+++ b/examples/speech/quickspeech/main.qml
@@ -79,6 +79,7 @@ ApplicationWindow {
text: qsTr("Pause")
enabled: tts.state == TextToSpeech.Speaking
onClicked: tts.pause()
+ visible: tts.engineCapabilities & TextToSpeech.Capabilities.PauseResume
}
//! [pause]
//! [resume]
@@ -86,6 +87,7 @@ ApplicationWindow {
text: qsTr("Resume")
enabled: tts.state == TextToSpeech.Paused
onClicked: tts.resume()
+ visible: tts.engineCapabilities & TextToSpeech.Capabilities.PauseResume
}
//! [resume]
Button {
diff --git a/src/plugins/tts/darwin/darwin_plugin.json b/src/plugins/tts/darwin/darwin_plugin.json
index 98b428a..6d82519 100644
--- a/src/plugins/tts/darwin/darwin_plugin.json
+++ b/src/plugins/tts/darwin/darwin_plugin.json
@@ -5,6 +5,7 @@
"Priority": 100,
"Capabilities": [
"Speak",
+ "PauseResume",
"WordByWordProgress",
"Synthesize"
]
diff --git a/src/plugins/tts/flite/flite_plugin.json b/src/plugins/tts/flite/flite_plugin.json
index b9fd6ef..48d89dc 100644
--- a/src/plugins/tts/flite/flite_plugin.json
+++ b/src/plugins/tts/flite/flite_plugin.json
@@ -5,6 +5,7 @@
"Priority": 50,
"Capabilities": [
"Speak",
+ "PauseResume",
"WordByWordProgress",
"Synthesize"
]
diff --git a/src/plugins/tts/macos/macos_plugin.json b/src/plugins/tts/macos/macos_plugin.json
index b779e4f..56c6b5a 100644
--- a/src/plugins/tts/macos/macos_plugin.json
+++ b/src/plugins/tts/macos/macos_plugin.json
@@ -5,6 +5,7 @@
"Priority": 50,
"Capabilities": [
"Speak",
+ "PauseResume",
"WordByWordProgress"
]
}
diff --git a/src/plugins/tts/mock/mock_plugin.json b/src/plugins/tts/mock/mock_plugin.json
index 7785016..57a9d37 100644
--- a/src/plugins/tts/mock/mock_plugin.json
+++ b/src/plugins/tts/mock/mock_plugin.json
@@ -5,6 +5,7 @@
"Priority": -1,
"Capabilities": [
"Speak",
+ "PauseResume",
"Synthesize",
"WordByWordProgress"
]
diff --git a/src/plugins/tts/sapi/sapi_plugin.json b/src/plugins/tts/sapi/sapi_plugin.json
index 95de0bf..049e152 100644
--- a/src/plugins/tts/sapi/sapi_plugin.json
+++ b/src/plugins/tts/sapi/sapi_plugin.json
@@ -5,6 +5,7 @@
"Priority": 50,
"Capabilities": [
"Speak",
+ "PauseResume",
"WordByWordProgress",
"Synthesize"
]
diff --git a/src/plugins/tts/speechdispatcher/speechd_plugin.json b/src/plugins/tts/speechdispatcher/speechd_plugin.json
index ba403c6..4c0e2fa 100644
--- a/src/plugins/tts/speechdispatcher/speechd_plugin.json
+++ b/src/plugins/tts/speechdispatcher/speechd_plugin.json
@@ -4,6 +4,7 @@
"Version": 100,
"Priority": 80,
"Capabilities": [
- "Speak"
+ "Speak",
+ "PauseResume"
]
}
diff --git a/src/plugins/tts/winrt/winrt_plugin.json b/src/plugins/tts/winrt/winrt_plugin.json
index f47e3f6..0911bb4 100644
--- a/src/plugins/tts/winrt/winrt_plugin.json
+++ b/src/plugins/tts/winrt/winrt_plugin.json
@@ -5,6 +5,7 @@
"Priority": 80,
"Capabilities": [
"Speak",
+ "PauseResume",
"WordByWordProgress",
"Synthesize"
]
diff --git a/src/tts/doc/src/qttexttospeech-engines.qdoc b/src/tts/doc/src/qttexttospeech-engines.qdoc
index 0fc2745..3546c0b 100644
--- a/src/tts/doc/src/qttexttospeech-engines.qdoc
+++ b/src/tts/doc/src/qttexttospeech-engines.qdoc
@@ -68,12 +68,18 @@
The macOS engine does not support any engine specific parameters.
+ \note The "macos" engine does not have the \l{QTextToSpeech::Capabilities}{Synthesize}
+ capability.
+
\section1 Android
The "android" engine is the only engine available on the Android platform. It uses the
\l{https://developer.android.com/reference/android/speech/tts/TextToSpeech}{TextToSpeech}
package, which in turn supports multiple engine backends.
+ \note The "android" engine does not have the \l{QTextToSpeech::Capabilities}
+ {PauseResume} capability.
+
\table
\header
\li Name
@@ -118,5 +124,8 @@
\l{https://htmlpreview.github.io/?https://github.com/brailcom/speechd/blob/master/doc/speech-dispatcher.html#Top}
{speech-dispatcher} daemon, and requires at least libspeechd 0.9.
+ \note The speech-dispatcher engine does not have the \l {QTextToSpeech::Capabilities}
+ {WordByWordProgress} or \l {QTextToSpeech::Capabilities}{Synthesize} capabilities.
+
The speech-dispatcher engine does not support any engine specific parameters.
*/
diff --git a/src/tts/qtexttospeech.cpp b/src/tts/qtexttospeech.cpp
index 9121a8b..47cad9c 100644
--- a/src/tts/qtexttospeech.cpp
+++ b/src/tts/qtexttospeech.cpp
@@ -518,6 +518,7 @@ QString QTextToSpeech::engine() const
\value None The engine implements none of the capabilities.
\value Speak The engine can play audio output from text.
+ \value PauseResume The engine can pause and then resume the audo output.
\value WordByWordProgress The engine emits the sayingWord() signal for
each word that gets spoken.
\value Synthesize The engine can \l{synthesize()}{synthesize} PCM
@@ -994,7 +995,8 @@ void QTextToSpeech::stop(BoundaryHint boundaryHint)
Whether the \a boundaryHint is respected depends on the \l engine.
- \sa resume(), QTextToSpeech::BoundaryHint
+ \sa resume(), QTextToSpeech::BoundaryHint,
+ {QTextToSpeech::Capabilities}{PauseResume}
*/
/*!
@@ -1002,7 +1004,7 @@ void QTextToSpeech::stop(BoundaryHint boundaryHint)
Whether the \a boundaryHint is respected depends on the \l engine.
- \sa resume()
+ \sa resume(), {QTextToSpeech::Capabilities}{PauseResume}
*/
void QTextToSpeech::pause(BoundaryHint boundaryHint)
{
@@ -1033,6 +1035,9 @@ void QTextToSpeech::pause(BoundaryHint boundaryHint)
/*!
Resume speaking after \l pause() has been called.
+ \note On Android, resuming paused speech will restart from the beginning.
+ This is a limitation of the underlying text-to-speech engine.
+
\sa pause()
*/
void QTextToSpeech::resume()
diff --git a/src/tts/qtexttospeech.h b/src/tts/qtexttospeech.h
index fb586b5..2b3951b 100644
--- a/src/tts/qtexttospeech.h
+++ b/src/tts/qtexttospeech.h
@@ -63,8 +63,9 @@ public:
enum class Capability {
None = 0,
Speak = 1 << 0,
- WordByWordProgress = 1 << 1,
- Synthesize = 1 << 2,
+ PauseResume = 1 << 1,
+ WordByWordProgress = 1 << 2,
+ Synthesize = 1 << 3,
};
Q_DECLARE_FLAGS(Capabilities, Capability)
Q_FLAG(Capabilities)
diff --git a/tests/auto/qtexttospeech/tst_qtexttospeech.cpp b/tests/auto/qtexttospeech/tst_qtexttospeech.cpp
index 1ab869c..701effe 100644
--- a/tests/auto/qtexttospeech/tst_qtexttospeech.cpp
+++ b/tests/auto/qtexttospeech/tst_qtexttospeech.cpp
@@ -557,6 +557,10 @@ void tst_QTextToSpeech::pauseResume()
const QString text = QStringLiteral("Hello. World.");
QTextToSpeech tts(engine);
+
+ if (!(tts.engineCapabilities() & QTextToSpeech::Capability::PauseResume))
+ QSKIP("This engine doesn't support PauseResume");
+
QTRY_COMPARE(tts.state(), QTextToSpeech::Ready);
selectWorkingVoice(&tts);