AudioPlaybackQueueItem.java revision 90d15d2371ad85f22254be6985455aa2baa5d15d
18d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath/* 28d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath * Copyright (C) 2011 The Android Open Source Project 38d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath * 48d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath * Licensed under the Apache License, Version 2.0 (the "License"); you may not 58d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath * use this file except in compliance with the License. You may obtain a copy of 68d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath * the License at 78d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath * 88d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath * http://www.apache.org/licenses/LICENSE-2.0 98d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath * 108d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath * Unless required by applicable law or agreed to in writing, software 118d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 128d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 138d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath * License for the specific language governing permissions and limitations under 148d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath * the License. 158d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath */ 168d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamathpackage android.speech.tts; 178d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath 18af802c6831551323126537cf8edabea97d2fc762Narayan Kamathimport android.content.Context; 19af802c6831551323126537cf8edabea97d2fc762Narayan Kamathimport android.media.MediaPlayer; 20af802c6831551323126537cf8edabea97d2fc762Narayan Kamathimport android.net.Uri; 21af802c6831551323126537cf8edabea97d2fc762Narayan Kamathimport android.os.ConditionVariable; 22754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamathimport android.speech.tts.TextToSpeechService.UtteranceProgressDispatcher; 2367ae6bc83cf2b30b0c61b9ebba5fed7a0038549cNarayan Kamathimport android.util.Log; 248d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath 2567ae6bc83cf2b30b0c61b9ebba5fed7a0038549cNarayan Kamathclass AudioPlaybackQueueItem extends PlaybackQueueItem { 26af802c6831551323126537cf8edabea97d2fc762Narayan Kamath private static final String TAG = "TTS.AudioQueueItem"; 27af802c6831551323126537cf8edabea97d2fc762Narayan Kamath 28af802c6831551323126537cf8edabea97d2fc762Narayan Kamath private final Context mContext; 29af802c6831551323126537cf8edabea97d2fc762Narayan Kamath private final Uri mUri; 30af802c6831551323126537cf8edabea97d2fc762Narayan Kamath private final int mStreamType; 31af802c6831551323126537cf8edabea97d2fc762Narayan Kamath 32af802c6831551323126537cf8edabea97d2fc762Narayan Kamath private final ConditionVariable mDone; 33af802c6831551323126537cf8edabea97d2fc762Narayan Kamath private MediaPlayer mPlayer; 34af802c6831551323126537cf8edabea97d2fc762Narayan Kamath private volatile boolean mFinished; 358d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath 3667ae6bc83cf2b30b0c61b9ebba5fed7a0038549cNarayan Kamath AudioPlaybackQueueItem(UtteranceProgressDispatcher dispatcher, 37af802c6831551323126537cf8edabea97d2fc762Narayan Kamath Object callerIdentity, 38af802c6831551323126537cf8edabea97d2fc762Narayan Kamath Context context, Uri uri, int streamType) { 39492b7f0d51f53164aa6eb974cd7ab6a7889af677Narayan Kamath super(dispatcher, callerIdentity); 40af802c6831551323126537cf8edabea97d2fc762Narayan Kamath 41af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mContext = context; 42af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mUri = uri; 43af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mStreamType = streamType; 44af802c6831551323126537cf8edabea97d2fc762Narayan Kamath 45af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mDone = new ConditionVariable(); 46af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mPlayer = null; 47af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mFinished = false; 488d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath } 4967ae6bc83cf2b30b0c61b9ebba5fed7a0038549cNarayan Kamath @Override 5067ae6bc83cf2b30b0c61b9ebba5fed7a0038549cNarayan Kamath public void run() { 51af802c6831551323126537cf8edabea97d2fc762Narayan Kamath final UtteranceProgressDispatcher dispatcher = getDispatcher(); 52af802c6831551323126537cf8edabea97d2fc762Narayan Kamath 53af802c6831551323126537cf8edabea97d2fc762Narayan Kamath dispatcher.dispatchOnStart(); 54af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mPlayer = MediaPlayer.create(mContext, mUri); 55af802c6831551323126537cf8edabea97d2fc762Narayan Kamath if (mPlayer == null) { 5690d15d2371ad85f22254be6985455aa2baa5d15dPrzemyslaw Szczepaniak dispatcher.dispatchOnError(TextToSpeechClient.Status.ERROR_OUTPUT); 57af802c6831551323126537cf8edabea97d2fc762Narayan Kamath return; 58af802c6831551323126537cf8edabea97d2fc762Narayan Kamath } 59af802c6831551323126537cf8edabea97d2fc762Narayan Kamath 60af802c6831551323126537cf8edabea97d2fc762Narayan Kamath try { 61af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { 62af802c6831551323126537cf8edabea97d2fc762Narayan Kamath @Override 63af802c6831551323126537cf8edabea97d2fc762Narayan Kamath public boolean onError(MediaPlayer mp, int what, int extra) { 64af802c6831551323126537cf8edabea97d2fc762Narayan Kamath Log.w(TAG, "Audio playback error: " + what + ", " + extra); 65af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mDone.open(); 66af802c6831551323126537cf8edabea97d2fc762Narayan Kamath return true; 67af802c6831551323126537cf8edabea97d2fc762Narayan Kamath } 68af802c6831551323126537cf8edabea97d2fc762Narayan Kamath }); 69af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 70af802c6831551323126537cf8edabea97d2fc762Narayan Kamath @Override 71af802c6831551323126537cf8edabea97d2fc762Narayan Kamath public void onCompletion(MediaPlayer mp) { 72af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mFinished = true; 73af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mDone.open(); 74af802c6831551323126537cf8edabea97d2fc762Narayan Kamath } 75af802c6831551323126537cf8edabea97d2fc762Narayan Kamath }); 76af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mPlayer.setAudioStreamType(mStreamType); 77af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mPlayer.start(); 78af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mDone.block(); 79af802c6831551323126537cf8edabea97d2fc762Narayan Kamath finish(); 80af802c6831551323126537cf8edabea97d2fc762Narayan Kamath } catch (IllegalArgumentException ex) { 81af802c6831551323126537cf8edabea97d2fc762Narayan Kamath Log.w(TAG, "MediaPlayer failed", ex); 82af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mDone.open(); 83af802c6831551323126537cf8edabea97d2fc762Narayan Kamath } 84af802c6831551323126537cf8edabea97d2fc762Narayan Kamath 85af802c6831551323126537cf8edabea97d2fc762Narayan Kamath if (mFinished) { 8690d15d2371ad85f22254be6985455aa2baa5d15dPrzemyslaw Szczepaniak dispatcher.dispatchOnSuccess(); 87af802c6831551323126537cf8edabea97d2fc762Narayan Kamath } else { 8890d15d2371ad85f22254be6985455aa2baa5d15dPrzemyslaw Szczepaniak dispatcher.dispatchOnStop(); 89af802c6831551323126537cf8edabea97d2fc762Narayan Kamath } 90af802c6831551323126537cf8edabea97d2fc762Narayan Kamath } 91af802c6831551323126537cf8edabea97d2fc762Narayan Kamath 92af802c6831551323126537cf8edabea97d2fc762Narayan Kamath private void finish() { 93af802c6831551323126537cf8edabea97d2fc762Narayan Kamath try { 94af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mPlayer.stop(); 95af802c6831551323126537cf8edabea97d2fc762Narayan Kamath } catch (IllegalStateException ex) { 96af802c6831551323126537cf8edabea97d2fc762Narayan Kamath // Do nothing, the player is already stopped 97af802c6831551323126537cf8edabea97d2fc762Narayan Kamath } 98af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mPlayer.release(); 998d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath } 1008d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath 1018d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath @Override 10290d15d2371ad85f22254be6985455aa2baa5d15dPrzemyslaw Szczepaniak void stop(int errorCode) { 103af802c6831551323126537cf8edabea97d2fc762Narayan Kamath mDone.open(); 1048d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath } 1058d1fc2403b8277e68d7816b2bbf05464a4c7a58aNarayan Kamath} 106