/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package android.speech.tts; import android.content.Context; import android.media.MediaPlayer; import android.net.Uri; import android.os.ConditionVariable; import android.speech.tts.TextToSpeechService.UtteranceProgressDispatcher; import android.util.Log; class AudioPlaybackQueueItem extends PlaybackQueueItem { private static final String TAG = "TTS.AudioQueueItem"; private final Context mContext; private final Uri mUri; private final int mStreamType; private final ConditionVariable mDone; private MediaPlayer mPlayer; private volatile boolean mFinished; AudioPlaybackQueueItem(UtteranceProgressDispatcher dispatcher, Object callerIdentity, Context context, Uri uri, int streamType) { super(dispatcher, callerIdentity); mContext = context; mUri = uri; mStreamType = streamType; mDone = new ConditionVariable(); mPlayer = null; mFinished = false; } @Override public void run() { final UtteranceProgressDispatcher dispatcher = getDispatcher(); dispatcher.dispatchOnStart(); mPlayer = MediaPlayer.create(mContext, mUri); if (mPlayer == null) { dispatcher.dispatchOnError(); return; } try { mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Log.w(TAG, "Audio playback error: " + what + ", " + extra); mDone.open(); return true; } }); mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mFinished = true; mDone.open(); } }); mPlayer.setAudioStreamType(mStreamType); mPlayer.start(); mDone.block(); finish(); } catch (IllegalArgumentException ex) { Log.w(TAG, "MediaPlayer failed", ex); mDone.open(); } if (mFinished) { dispatcher.dispatchOnDone(); } else { dispatcher.dispatchOnError(); } } private void finish() { try { mPlayer.stop(); } catch (IllegalStateException ex) { // Do nothing, the player is already stopped } mPlayer.release(); } @Override void stop(boolean isError) { mDone.open(); } }