diff options
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() {  |