summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/speech/tts/FileSynthesisRequest.java17
-rw-r--r--core/java/android/speech/tts/PlaybackSynthesisRequest.java16
-rw-r--r--core/java/android/speech/tts/SynthesisRequest.java13
-rw-r--r--core/java/android/speech/tts/TextToSpeechService.java11
4 files changed, 51 insertions, 6 deletions
diff --git a/core/java/android/speech/tts/FileSynthesisRequest.java b/core/java/android/speech/tts/FileSynthesisRequest.java
index 6a9b2dc14de3..7efc26466c8e 100644
--- a/core/java/android/speech/tts/FileSynthesisRequest.java
+++ b/core/java/android/speech/tts/FileSynthesisRequest.java
@@ -45,6 +45,7 @@ class FileSynthesisRequest extends SynthesisRequest {
private int mChannelCount;
private RandomAccessFile mFile;
private boolean mStopped = false;
+ private boolean mDone = false;
FileSynthesisRequest(String text, File fileName) {
super(text);
@@ -89,6 +90,11 @@ class FileSynthesisRequest extends SynthesisRequest {
}
@Override
+ boolean isDone() {
+ return mDone;
+ }
+
+ @Override
public int start(int sampleRateInHz, int audioFormat, int channelCount) {
if (DBG) {
Log.d(TAG, "FileSynthesisRequest.start(" + sampleRateInHz + "," + audioFormat
@@ -164,6 +170,7 @@ class FileSynthesisRequest extends SynthesisRequest {
mFile.write(
makeWavHeader(mSampleRateInHz, mAudioFormat, mChannelCount, dataLength));
closeFile();
+ mDone = true;
return TextToSpeech.SUCCESS;
} catch (IOException ex) {
Log.e(TAG, "Failed to write to " + mFileName + ": " + ex);
@@ -174,6 +181,14 @@ class FileSynthesisRequest extends SynthesisRequest {
}
@Override
+ public void error() {
+ if (DBG) Log.d(TAG, "FileSynthesisRequest.error()");
+ synchronized (mStateLock) {
+ cleanUp();
+ }
+ }
+
+ @Override
public int completeAudioAvailable(int sampleRateInHz, int audioFormat, int channelCount,
byte[] buffer, int offset, int length) {
synchronized (mStateLock) {
@@ -187,9 +202,11 @@ class FileSynthesisRequest extends SynthesisRequest {
out = new FileOutputStream(mFileName);
out.write(makeWavHeader(sampleRateInHz, audioFormat, channelCount, length));
out.write(buffer, offset, length);
+ mDone = true;
return TextToSpeech.SUCCESS;
} catch (IOException ex) {
Log.e(TAG, "Failed to write to " + mFileName + ": " + ex);
+ mFileName.delete();
return TextToSpeech.ERROR;
} finally {
try {
diff --git a/core/java/android/speech/tts/PlaybackSynthesisRequest.java b/core/java/android/speech/tts/PlaybackSynthesisRequest.java
index 226701518805..227b0428ed03 100644
--- a/core/java/android/speech/tts/PlaybackSynthesisRequest.java
+++ b/core/java/android/speech/tts/PlaybackSynthesisRequest.java
@@ -50,6 +50,7 @@ class PlaybackSynthesisRequest extends SynthesisRequest {
private final Object mStateLock = new Object();
private AudioTrack mAudioTrack = null;
private boolean mStopped = false;
+ private boolean mDone = false;
PlaybackSynthesisRequest(String text, int streamType, float volume, float pan) {
super(text);
@@ -85,6 +86,11 @@ class PlaybackSynthesisRequest extends SynthesisRequest {
return MIN_AUDIO_BUFFER_SIZE;
}
+ @Override
+ boolean isDone() {
+ return mDone;
+ }
+
// TODO: add a thread that writes to the AudioTrack?
@Override
public int start(int sampleRateInHz, int audioFormat, int channelCount) {
@@ -183,12 +189,21 @@ class PlaybackSynthesisRequest extends SynthesisRequest {
Log.e(TAG, "done(): Not started");
return TextToSpeech.ERROR;
}
+ mDone = true;
cleanUp();
}
return TextToSpeech.SUCCESS;
}
@Override
+ public void error() {
+ if (DBG) Log.d(TAG, "error()");
+ synchronized (mStateLock) {
+ cleanUp();
+ }
+ }
+
+ @Override
public int completeAudioAvailable(int sampleRateInHz, int audioFormat, int channelCount,
byte[] buffer, int offset, int length) {
if (DBG) {
@@ -217,6 +232,7 @@ class PlaybackSynthesisRequest extends SynthesisRequest {
try {
mAudioTrack.write(buffer, offset, length);
mAudioTrack.play();
+ mDone = true;
} catch (IllegalStateException ex) {
Log.e(TAG, "Playback error", ex);
return TextToSpeech.ERROR;
diff --git a/core/java/android/speech/tts/SynthesisRequest.java b/core/java/android/speech/tts/SynthesisRequest.java
index f4bb85228901..515218b2a38e 100644
--- a/core/java/android/speech/tts/SynthesisRequest.java
+++ b/core/java/android/speech/tts/SynthesisRequest.java
@@ -114,6 +114,11 @@ public abstract class SynthesisRequest {
public abstract int getMaxBufferSize();
/**
+ * Checks whether the synthesis request completed successfully.
+ */
+ abstract boolean isDone();
+
+ /**
* Aborts the speech request.
*
* Can be called from multiple threads.
@@ -162,6 +167,14 @@ public abstract class SynthesisRequest {
public abstract int done();
/**
+ * The service should call this method if the speech synthesis fails.
+ *
+ * This method should only be called on the synthesis thread,
+ * while in {@link TextToSpeechService#onSynthesizeText}.
+ */
+ public abstract void error();
+
+ /**
* The service can call this method instead of using {@link #start}, {@link #audioAvailable}
* and {@link #done} if all the audio data is available in a single buffer.
*
diff --git a/core/java/android/speech/tts/TextToSpeechService.java b/core/java/android/speech/tts/TextToSpeechService.java
index a408ea2e9665..da97fb4bdf80 100644
--- a/core/java/android/speech/tts/TextToSpeechService.java
+++ b/core/java/android/speech/tts/TextToSpeechService.java
@@ -150,12 +150,10 @@ public abstract class TextToSpeechService extends Service {
*
* Called on the synthesis thread.
*
- * @param request The synthesis request. The method should
- * call {@link SynthesisRequest#start}, {@link SynthesisRequest#audioAvailable},
- * and {@link SynthesisRequest#done} on this request.
- * @return {@link TextToSpeech#SUCCESS} or {@link TextToSpeech#ERROR}.
+ * @param request The synthesis request. The method should use the methods in the request
+ * object to communicate the results of the synthesis.
*/
- protected abstract int onSynthesizeText(SynthesisRequest request);
+ protected abstract void onSynthesizeText(SynthesisRequest request);
private boolean areDefaultsEnforced() {
return getSecureSettingInt(Settings.Secure.TTS_USE_DEFAULTS,
@@ -442,7 +440,8 @@ public abstract class TextToSpeechService extends Service {
synthesisRequest = mSynthesisRequest;
}
setRequestParams(synthesisRequest);
- return TextToSpeechService.this.onSynthesizeText(synthesisRequest);
+ TextToSpeechService.this.onSynthesizeText(synthesisRequest);
+ return synthesisRequest.isDone() ? TextToSpeech.SUCCESS : TextToSpeech.ERROR;
}
protected SynthesisRequest createSynthesisRequest() {