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