diff options
| author | 2011-04-19 03:06:13 -0700 | |
|---|---|---|
| committer | 2011-04-19 03:06:13 -0700 | |
| commit | a210e15c891e681fefb946116d4f7fc89a62fd91 (patch) | |
| tree | e89727cfb70c7d2746da6fa1ea5c139021f5d588 | |
| parent | 578492e999b3919cfc587024c5f86d6837c3aa7c (diff) | |
| parent | 360eb168d6f9c967543852c7bbab370ef5d8c1bd (diff) | |
Merge "TTS: SynthesisRequest.error() instead of return value"
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() { |