1e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi/*
2e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Copyright (C) 2009 Google Inc.
3e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi *
4e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * use this file except in compliance with the License. You may obtain a copy of
6e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * the License at
7e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi *
8e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0
9e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi *
10e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * License for the specific language governing permissions and limitations under
14e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * the License.
15e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */
1621a6a6d26baf32593d63226f9728ddd66f0bd571Jean-Michel Trivipackage android.speech.tts;
1721a6a6d26baf32593d63226f9728ddd66f0bd571Jean-Michel Trivi
18f85aa5a4d4e6f1ef7e07638568e27d709b8085c6Charles Chenimport android.speech.tts.ITts;
19f85aa5a4d4e6f1ef7e07638568e27d709b8085c6Charles Chenimport android.speech.tts.ITtsCallback;
20e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
21ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Triviimport android.annotation.SdkConstant;
22ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Triviimport android.annotation.SdkConstant.SdkConstantType;
23e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Triviimport android.content.ComponentName;
24e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Triviimport android.content.Context;
25e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Triviimport android.content.Intent;
26e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Triviimport android.content.ServiceConnection;
27a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Triviimport android.media.AudioManager;
28e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Triviimport android.os.IBinder;
29e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Triviimport android.os.RemoteException;
30e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Triviimport android.util.Log;
31e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
32a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Triviimport java.util.HashMap;
33679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Triviimport java.util.Locale;
34a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi
35e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi/**
36e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi *
3762788e9b48f884a35b89c88911b581daa6a14e08Jean-Michel Trivi * Synthesizes speech from text for immediate playback or to create a sound file.
38a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * <p>A TextToSpeech instance can only be used to synthesize text once it has completed its
39a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * initialization. Implement the {@link TextToSpeech.OnInitListener} to be
40a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * notified of the completion of the initialization.<br>
41a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * When you are done using the TextToSpeech instance, call the {@link #shutdown()} method
42a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * to release the native resources used by the TextToSpeech engine.
43e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi *
44e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */
45a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivipublic class TextToSpeech {
46e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
4791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    /**
4891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi     * Denotes a successful operation.
4991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi     */
50ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int SUCCESS                = 0;
5191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    /**
5291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi     * Denotes a generic operation failure.
5391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi     */
54ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int ERROR                  = -1;
5591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi
56679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi    /**
57679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     * Queue mode where all entries in the playback queue (media to be played
58679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     * and text to be synthesized) are dropped and replaced by the new entry.
59679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     */
60ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int QUEUE_FLUSH = 0;
61679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi    /**
62679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     * Queue mode where the new entry is added at the end of the playback queue.
63679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     */
64ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int QUEUE_ADD = 1;
65e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
66aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
67aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    /**
689f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi     * Denotes the language is available exactly as specified by the locale.
69aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     */
70ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int LANG_COUNTRY_VAR_AVAILABLE = 2;
71aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
72aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
73aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    /**
74aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     * Denotes the language is available for the language and country specified
75aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     * by the locale, but not the variant.
76aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     */
77ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int LANG_COUNTRY_AVAILABLE = 1;
78aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
79aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
80aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    /**
81aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     * Denotes the language is available for the language by the locale,
82aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     * but not the country and variant.
83aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     */
84ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int LANG_AVAILABLE = 0;
85aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
86aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    /**
87aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     * Denotes the language data is missing.
88aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     */
89ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int LANG_MISSING_DATA = -1;
90aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
91aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    /**
92a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * Denotes the language is not supported.
93aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     */
94ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int LANG_NOT_SUPPORTED = -2;
95ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi
96ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi
97ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    /**
98ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * Broadcast Action: The TextToSpeech synthesizer has completed processing
99ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * of all the text in the speech queue.
100ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     */
101ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
102ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final String ACTION_TTS_QUEUE_PROCESSING_COMPLETED =
103ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            "android.speech.tts.TTS_QUEUE_PROCESSING_COMPLETED";
104aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
105aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
106e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
107a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * Interface definition of a callback to be invoked indicating the completion of the
108a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * TextToSpeech engine initialization.
109e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
110e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    public interface OnInitListener {
111a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi        /**
112a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * Called to signal the completion of the TextToSpeech engine initialization.
113a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * @param status {@link TextToSpeech#SUCCESS} or {@link TextToSpeech#ERROR}.
114a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         */
11591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        public void onInit(int status);
116e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
117e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
118e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
119a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * Interface definition of a callback to be invoked indicating the TextToSpeech engine has
120a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * completed synthesizing an utterance with an utterance ID set.
12178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     *
12278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     */
123a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi    public interface OnUtteranceCompletedListener {
124a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi        /**
125a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * Called to signal the completion of the synthesis of the utterance that was identified
126a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * with the string parameter. This identifier is the one originally passed in the
127a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * parameter hashmap of the synthesis request in
128a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * {@link TextToSpeech#speak(String, int, HashMap)} or
129a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * {@link TextToSpeech#synthesizeToFile(String, HashMap, String)} with the
130a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * {@link TextToSpeech.Engine#KEY_PARAM_UTTERANCE_ID} key.
131a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * @param utteranceId the identifier of the utterance.
13260dd360640a400d9b4a602160733281d284aaee5Charles Chen         */
13360dd360640a400d9b4a602160733281d284aaee5Charles Chen        public void onUtteranceCompleted(String utteranceId);
13478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen    }
13578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen
13678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen
13778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen    /**
138a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * Internal constants for the TextToSpeech functionality
139d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi     *
140d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi     */
141d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi    public class Engine {
142d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi        // default values for a TTS engine when settings are not found in the provider
14362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
14462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
14562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
146ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final int DEFAULT_RATE = 100; // 1x
14762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
14862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
14962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
150ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final int DEFAULT_PITCH = 100;// 1x
15162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
15262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
15362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
154ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final int USE_DEFAULTS = 0; // false
15562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
15662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
15762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
158ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String DEFAULT_SYNTH = "com.svox.pico";
159d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi
160a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi        // default values for rendering
161a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi        /**
162a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * Default audio stream used when playing synthesized speech.
163a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         */
164ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final int DEFAULT_STREAM = AudioManager.STREAM_MUSIC;
165a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi
166d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi        // return codes for a TTS engine's check data activity
16762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
16862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * Indicates success when checking the installation status of the resources used by the
169a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * TextToSpeech engine with the {@link #ACTION_CHECK_TTS_DATA} intent.
17062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
171d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi        public static final int CHECK_VOICE_DATA_PASS = 1;
17262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
17362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * Indicates failure when checking the installation status of the resources used by the
174a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * TextToSpeech engine with the {@link #ACTION_CHECK_TTS_DATA} intent.
17562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
176d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi        public static final int CHECK_VOICE_DATA_FAIL = 0;
17762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
17862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * Indicates erroneous data when checking the installation status of the resources used by
179a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * the TextToSpeech engine with the {@link #ACTION_CHECK_TTS_DATA} intent.
18062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
181d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi        public static final int CHECK_VOICE_DATA_BAD_DATA = -1;
18262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
18362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * Indicates missing resources when checking the installation status of the resources used
184a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * by the TextToSpeech engine with the {@link #ACTION_CHECK_TTS_DATA} intent.
18562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
186d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi        public static final int CHECK_VOICE_DATA_MISSING_DATA = -2;
18762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
18862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * Indicates missing storage volume when checking the installation status of the resources
189a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * used by the TextToSpeech engine with the {@link #ACTION_CHECK_TTS_DATA} intent.
19062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
19162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        public static final int CHECK_VOICE_DATA_MISSING_VOLUME = -3;
19299a0feecd0f0aad314d7a4637d329b8a9e8c1150Charles Chen
193ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        // intents to ask engine to install data or check its data
194ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        /**
195a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * Activity Action: Triggers the platform TextToSpeech engine to
196ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * start the activity that installs the resource files on the device
197ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * that are required for TTS to be operational. Since the installation
198ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * of the data can be interrupted or declined by the user, the application
199ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * shouldn't expect successful installation upon return from that intent,
200ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * and if need be, should check installation status with
201ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * {@link #ACTION_CHECK_TTS_DATA}.
202ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         */
2039f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi        @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
204ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String ACTION_INSTALL_TTS_DATA =
205ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                "android.speech.tts.engine.INSTALL_TTS_DATA";
206ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi
207ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        /**
2089f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi         * Broadcast Action: broadcast to signal the completion of the installation of
2099f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi         * the data files used by the synthesis engine. Success or failure is indicated in the
2109f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi         * {@link #EXTRA_TTS_DATA_INSTALLED} extra.
21177a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi         */
21277a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi        @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
21377a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi        public static final String ACTION_TTS_DATA_INSTALLED =
21477a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi                "android.speech.tts.engine.TTS_DATA_INSTALLED";
21577a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi        /**
216a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * Activity Action: Starts the activity from the platform TextToSpeech
217ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * engine to verify the proper installation and availability of the
218ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * resource files on the system. Upon completion, the activity will
219ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * return one of the following codes:
220ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * {@link #CHECK_VOICE_DATA_PASS},
221ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * {@link #CHECK_VOICE_DATA_FAIL},
222ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * {@link #CHECK_VOICE_DATA_BAD_DATA},
223ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * {@link #CHECK_VOICE_DATA_MISSING_DATA}, or
224ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * {@link #CHECK_VOICE_DATA_MISSING_VOLUME}.
225ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * <p> Moreover, the data received in the activity result will contain the following
226ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * fields:
227ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * <ul>
228ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         *   <li>{@link #EXTRA_VOICE_DATA_ROOT_DIRECTORY} which
229a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         *       indicates the path to the location of the resource files,</li>
230ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         *   <li>{@link #EXTRA_VOICE_DATA_FILES} which contains
231a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         *       the list of all the resource files,</li>
232ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         *   <li>and {@link #EXTRA_VOICE_DATA_FILES_INFO} which
233ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         *       contains, for each resource file, the description of the language covered by
234ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         *       the file in the xxx-YYY format, where xxx is the 3-letter ISO language code,
235ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         *       and YYY is the 3-letter ISO country code.</li>
236ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * </ul>
237ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         */
2389f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi        @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
239ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String ACTION_CHECK_TTS_DATA =
240ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                "android.speech.tts.engine.CHECK_TTS_DATA";
241ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi
242ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        // extras for a TTS engine's check data activity
24362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
244ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where
245a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * the TextToSpeech engine specifies the path to its resources.
24662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
247ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String EXTRA_VOICE_DATA_ROOT_DIRECTORY = "dataRoot";
24862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
249ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where
250a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * the TextToSpeech engine specifies the file names of its resources under the
25162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * resource path.
25262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
253ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String EXTRA_VOICE_DATA_FILES = "dataFiles";
25462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
255ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where
256a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * the TextToSpeech engine specifies the locale associated with each resource file.
25762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
258ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String EXTRA_VOICE_DATA_FILES_INFO = "dataFilesInfo";
25976d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen        /**
26076d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where
26176d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         * the TextToSpeech engine returns an ArrayList<String> of all the available voices.
26276d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         * The format of each voice is: lang-COUNTRY-variant where COUNTRY and variant are
26376d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         * optional (ie, "eng" or "eng-USA" or "eng-USA-FEMALE").
26476d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         */
26576d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen        public static final String EXTRA_AVAILABLE_VOICES = "availableVoices";
26676d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen        /**
26776d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where
26876d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         * the TextToSpeech engine returns an ArrayList<String> of all the unavailable voices.
26976d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         * The format of each voice is: lang-COUNTRY-variant where COUNTRY and variant are
27076d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         * optional (ie, "eng" or "eng-USA" or "eng-USA-FEMALE").
27176d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         */
27276d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen        public static final String EXTRA_UNAVAILABLE_VOICES = "unavailableVoices";
27376d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen        /**
27476d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         * Extra information sent with the {@link #ACTION_CHECK_TTS_DATA} intent where the
27576d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         * caller indicates to the TextToSpeech engine which specific sets of voice data to
27676d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         * check for by sending an ArrayList<String> of the voices that are of interest.
27776d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         * The format of each voice is: lang-COUNTRY-variant where COUNTRY and variant are
27876d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         * optional (ie, "eng" or "eng-USA" or "eng-USA-FEMALE").
27976d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen         */
28076d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen        public static final String EXTRA_CHECK_VOICE_DATA_FOR = "checkVoiceDataFor";
28199a0feecd0f0aad314d7a4637d329b8a9e8c1150Charles Chen
28277a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi        // extras for a TTS engine's data installation
28377a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi        /**
2849f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi         * Extra information received with the {@link #ACTION_TTS_DATA_INSTALLED} intent.
2859f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi         * It indicates whether the data files for the synthesis engine were successfully
2869f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi         * installed. The installation was initiated with the  {@link #ACTION_INSTALL_TTS_DATA}
2879f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi         * intent. The possible values for this extra are
2889f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi         * {@link TextToSpeech#SUCCESS} and {@link TextToSpeech#ERROR}.
28977a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi         */
29077a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi        public static final String EXTRA_TTS_DATA_INSTALLED = "dataInstalled";
29177a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi
29262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        // keys for the parameters passed with speak commands. Hidden keys are used internally
29362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        // to maintain engine state for each TextToSpeech instance.
29462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
29562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
29662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
297ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String KEY_PARAM_RATE = "rate";
29862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
29962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
30062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
301ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String KEY_PARAM_LANGUAGE = "language";
30262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
30362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
30462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
305ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String KEY_PARAM_COUNTRY = "country";
30662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
30762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
30862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
309ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String KEY_PARAM_VARIANT = "variant";
31062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
31160dd360640a400d9b4a602160733281d284aaee5Charles Chen         * {@hide}
31260dd360640a400d9b4a602160733281d284aaee5Charles Chen         */
31360dd360640a400d9b4a602160733281d284aaee5Charles Chen        public static final String KEY_PARAM_ENGINE = "engine";
31460dd360640a400d9b4a602160733281d284aaee5Charles Chen        /**
3151a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen         * {@hide}
3161a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen         */
3171a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen        public static final String KEY_PARAM_PITCH = "pitch";
3181a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen        /**
31962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * Parameter key to specify the audio stream type to be used when speaking text
32062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * or playing back a file.
321a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * @see TextToSpeech#speak(String, int, HashMap)
322a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * @see TextToSpeech#playEarcon(String, int, HashMap)
32362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
324ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String KEY_PARAM_STREAM = "streamType";
32562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
326a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * Parameter key to identify an utterance in the
327a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * {@link TextToSpeech.OnUtteranceCompletedListener} after text has been
32862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * spoken, a file has been played back or a silence duration has elapsed.
329a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * @see TextToSpeech#speak(String, int, HashMap)
330a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * @see TextToSpeech#playEarcon(String, int, HashMap)
331a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi         * @see TextToSpeech#synthesizeToFile(String, HashMap, String)
33262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
333ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String KEY_PARAM_UTTERANCE_ID = "utteranceId";
33462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi
33562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        // key positions in the array of cached parameters
33662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
33762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
33862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
339ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        protected static final int PARAM_POSITION_RATE = 0;
34062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
34162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
34262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
343ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        protected static final int PARAM_POSITION_LANGUAGE = 2;
34462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
34562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
34662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
347ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        protected static final int PARAM_POSITION_COUNTRY = 4;
34862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
34962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
35062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
351ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        protected static final int PARAM_POSITION_VARIANT = 6;
35262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
35362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
35462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
355ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        protected static final int PARAM_POSITION_STREAM = 8;
35662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
35762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
35862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
359ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        protected static final int PARAM_POSITION_UTTERANCE_ID = 10;
36060dd360640a400d9b4a602160733281d284aaee5Charles Chen
36160dd360640a400d9b4a602160733281d284aaee5Charles Chen        /**
36260dd360640a400d9b4a602160733281d284aaee5Charles Chen         * {@hide}
36360dd360640a400d9b4a602160733281d284aaee5Charles Chen         */
36460dd360640a400d9b4a602160733281d284aaee5Charles Chen        protected static final int PARAM_POSITION_ENGINE = 12;
36560dd360640a400d9b4a602160733281d284aaee5Charles Chen
36662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
36762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
36862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
3691a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen        protected static final int PARAM_POSITION_PITCH = 14;
3701a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen
3711a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen        /**
3721a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen         * {@hide}
3731a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen         */
3741a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen        protected static final int NB_CACHED_PARAMS = 8;
375d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi    }
376d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi
377d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi    /**
378679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     * Connection needed for the TTS.
379e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
380679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi    private ServiceConnection mServiceConnection;
381e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
38291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    private ITts mITts = null;
38378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen    private ITtsCallback mITtscallback = null;
38491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    private Context mContext = null;
385a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen    private String mPackageName = "";
38691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    private OnInitListener mInitListener = null;
38791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    private boolean mStarted = false;
38891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    private final Object mStartLock = new Object();
389da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi    /**
390da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi     * Used to store the cached parameters sent along with each synthesis request to the
391da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi     * TTS service.
392da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi     */
39387c9684fd0fa31fd6ad7f7e9f4cfedddc4fdc4b0Jean-Michel Trivi    private String[] mCachedParams;
394e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
395e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
396a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * The constructor for the TextToSpeech class.
397a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * This will also initialize the associated TextToSpeech engine if it isn't already running.
398e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
399e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param context
400a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            The context this instance is running in.
40191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi     * @param listener
402a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            The {@link TextToSpeech.OnInitListener} that will be called when the
403a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            TextToSpeech engine has initialized.
404e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
40591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    public TextToSpeech(Context context, OnInitListener listener) {
40691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        mContext = context;
407a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen        mPackageName = mContext.getPackageName();
40891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        mInitListener = listener;
40987c9684fd0fa31fd6ad7f7e9f4cfedddc4fdc4b0Jean-Michel Trivi
410ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams = new String[2*Engine.NB_CACHED_PARAMS]; // store key and value
411ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_RATE] = Engine.KEY_PARAM_RATE;
412ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_LANGUAGE] = Engine.KEY_PARAM_LANGUAGE;
413ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_COUNTRY] = Engine.KEY_PARAM_COUNTRY;
414ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_VARIANT] = Engine.KEY_PARAM_VARIANT;
415ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_STREAM] = Engine.KEY_PARAM_STREAM;
416ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID] = Engine.KEY_PARAM_UTTERANCE_ID;
41760dd360640a400d9b4a602160733281d284aaee5Charles Chen        mCachedParams[Engine.PARAM_POSITION_ENGINE] = Engine.KEY_PARAM_ENGINE;
4181a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen        mCachedParams[Engine.PARAM_POSITION_PITCH] = Engine.KEY_PARAM_PITCH;
41987c9684fd0fa31fd6ad7f7e9f4cfedddc4fdc4b0Jean-Michel Trivi
4201a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen        // Leave all defaults that are shown in Settings uninitialized/at the default
4211a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen        // so that the values set in Settings will take effect if the application does
4226a8b73be572f37b471322e7d49b44c3783633d96Charles Chen        // not try to change these settings itself.
4236a8b73be572f37b471322e7d49b44c3783633d96Charles Chen        mCachedParams[Engine.PARAM_POSITION_RATE + 1] = "";
4246a8b73be572f37b471322e7d49b44c3783633d96Charles Chen        mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1] = "";
4256a8b73be572f37b471322e7d49b44c3783633d96Charles Chen        mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = "";
4266a8b73be572f37b471322e7d49b44c3783633d96Charles Chen        mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = "";
427ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_STREAM + 1] =
428ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                String.valueOf(Engine.DEFAULT_STREAM);
429ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = "";
4306a8b73be572f37b471322e7d49b44c3783633d96Charles Chen        mCachedParams[Engine.PARAM_POSITION_ENGINE + 1] = "";
4311a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen        mCachedParams[Engine.PARAM_POSITION_PITCH + 1] = "100";
432a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi
433da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi        initTts();
434e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
435e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
436e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
437e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    private void initTts() {
43891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        mStarted = false;
439e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
440e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        // Initialize the TTS, run the callback after the binding is successful
441679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi        mServiceConnection = new ServiceConnection() {
442e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            public void onServiceConnected(ComponentName name, IBinder service) {
44391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                synchronized(mStartLock) {
44491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                    mITts = ITts.Stub.asInterface(service);
44591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                    mStarted = true;
4461a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    // Cache the default engine and current language
4471a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    setEngineByPackageName(getDefaultEngine());
4481a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    setLanguage(getLanguage());
44991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                    if (mInitListener != null) {
45091bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                        // TODO manage failures and missing resources
451ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mInitListener.onInit(SUCCESS);
452e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                    }
453e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                }
454e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
455e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
456e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            public void onServiceDisconnected(ComponentName name) {
45791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                synchronized(mStartLock) {
45891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                    mITts = null;
45991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                    mInitListener = null;
46091bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                    mStarted = false;
461e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                }
462e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
463e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        };
464e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
46552ae06521a8d4c48757b126cff233f037d0a16baCharles Chen        Intent intent = new Intent("android.intent.action.START_TTS_SERVICE");
466e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        intent.addCategory("android.intent.category.TTS");
4671e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi        boolean bound = mContext.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
4681e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi        if (!bound) {
4691e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi            Log.e("TextToSpeech.java", "initTts() failed to bind to service");
4701e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi            if (mInitListener != null) {
4711e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi                mInitListener.onInit(ERROR);
4721e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi            }
4731e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi        } else {
4741e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi            // initialization listener will be called inside ServiceConnection
4751e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi            Log.i("TextToSpeech.java", "initTts() successfully bound to service");
4761e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi        }
4771e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi        // TODO handle plugin failures
478e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
479e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
480e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
481e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
482a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * Releases the resources used by the TextToSpeech engine.
483a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * It is good practice for instance to call this method in the onDestroy() method of an Activity
484a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * so the TextToSpeech engine can be cleanly stopped.
485e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
486e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    public void shutdown() {
487e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        try {
488679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi            mContext.unbindService(mServiceConnection);
489e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        } catch (IllegalArgumentException e) {
490e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            // Do nothing and fail silently since an error here indicates that
491e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            // binding never succeeded in the first place.
492e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
493e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
494e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
495e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
496e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
497e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * Adds a mapping between a string of text and a sound resource in a
498a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * package. After a call to this method, subsequent calls to
499a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * {@link #speak(String, int, HashMap)} will play the specified sound resource
500a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * if it is available, or synthesize the text it is missing.
501e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
502e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param text
503a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            The string of text. Example: <code>"south_south_east"</code>
504e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
505e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param packagename
506e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            Pass the packagename of the application that contains the
507e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            resource. If the resource is in your own application (this is
508e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            the most common case), then put the packagename of your
509e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            application here.<br/>
510e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            Example: <b>"com.google.marvin.compass"</b><br/>
511e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            The packagename can be found in the AndroidManifest.xml of
512e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            your application.
513e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            <p>
514e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            <code>&lt;manifest xmlns:android=&quot;...&quot;
515e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *      package=&quot;<b>com.google.marvin.compass</b>&quot;&gt;</code>
516e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            </p>
517e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
518e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param resourceId
519a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            Example: <code>R.raw.south_south_east</code>
5205c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
521ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
522e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
5235c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int addSpeech(String text, String packagename, int resourceId) {
52491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized(mStartLock) {
52591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
526ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return ERROR;
527e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
528e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
529a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen                mITts.addSpeech(mPackageName, text, packagename, resourceId);
530ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return SUCCESS;
531e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (RemoteException e) {
532e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
533630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - addSpeech", "RemoteException");
534630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
53591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
536e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
537e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (NullPointerException e) {
538e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
539630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - addSpeech", "NullPointerException");
540630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
54191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
542e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
543e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (IllegalStateException e) {
544e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
545630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - addSpeech", "IllegalStateException");
546630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
54791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
548e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
549e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
550ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            return ERROR;
551e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
552e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
553e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
554e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
555e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
556e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * Adds a mapping between a string of text and a sound file. Using this, it
557a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * is possible to add custom pronounciations for a string of text.
558a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * After a call to this method, subsequent calls to {@link #speak(String, int, HashMap)}
559a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * will play the specified sound resource if it is available, or synthesize the text it is
560a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * missing.
561e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
562e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param text
563a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            The string of text. Example: <code>"south_south_east"</code>
564e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param filename
565e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            The full path to the sound file (for example:
566e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            "/sdcard/mysounds/hello.wav")
5675c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
568ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
569e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
5705c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int addSpeech(String text, String filename) {
57191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
57291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
573ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return ERROR;
574e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
575e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
576a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen                mITts.addSpeechFile(mPackageName, text, filename);
577ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return SUCCESS;
578e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (RemoteException e) {
579e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
580630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - addSpeech", "RemoteException");
581630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
58291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
583e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
584e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (NullPointerException e) {
585e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
586630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - addSpeech", "NullPointerException");
587630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
58891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
589e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
590e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (IllegalStateException e) {
591e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
592630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - addSpeech", "IllegalStateException");
593630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
59491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
595e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
596e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
597ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            return ERROR;
598e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
599e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
600e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
601e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
602e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
603904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     * Adds a mapping between a string of text and a sound resource in a
604a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * package. Use this to add custom earcons.
605904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *
606ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @see #playEarcon(String, int, HashMap)
607904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *
608a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * @param earcon The name of the earcon.
609a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            Example: <code>"[tick]"</code><br/>
610904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *
611904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     * @param packagename
612a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            the package name of the application that contains the
613a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            resource. This can for instance be the package name of your own application.
614904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            Example: <b>"com.google.marvin.compass"</b><br/>
615a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            The package name can be found in the AndroidManifest.xml of
616a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            the application containing the resource.
617904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            <p>
618904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            <code>&lt;manifest xmlns:android=&quot;...&quot;
619904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *      package=&quot;<b>com.google.marvin.compass</b>&quot;&gt;</code>
620904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            </p>
621904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *
622904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     * @param resourceId
623a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            Example: <code>R.raw.tick_snd</code>
624904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *
625ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
626904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     */
627904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen    public int addEarcon(String earcon, String packagename, int resourceId) {
628904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen        synchronized(mStartLock) {
629904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            if (!mStarted) {
630ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return ERROR;
631904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            }
632904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            try {
633904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mITts.addEarcon(mPackageName, earcon, packagename, resourceId);
634ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return SUCCESS;
635904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            } catch (RemoteException e) {
636904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                // TTS died; restart it.
637904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                Log.e("TextToSpeech.java - addEarcon", "RemoteException");
638904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                e.printStackTrace();
639904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mStarted = false;
640904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                initTts();
641904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            } catch (NullPointerException e) {
642904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                // TTS died; restart it.
643904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                Log.e("TextToSpeech.java - addEarcon", "NullPointerException");
644904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                e.printStackTrace();
645904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mStarted = false;
646904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                initTts();
647904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            } catch (IllegalStateException e) {
648904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                // TTS died; restart it.
649904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                Log.e("TextToSpeech.java - addEarcon", "IllegalStateException");
650904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                e.printStackTrace();
651904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mStarted = false;
652904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                initTts();
653904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            }
654ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            return ERROR;
655904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen        }
656904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen    }
657904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen
658904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen
659904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen    /**
660a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * Adds a mapping between a string of text and a sound file.
661a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * Use this to add custom earcons.
662a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *
663a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * @see #playEarcon(String, int, HashMap)
664904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *
665904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     * @param earcon
666a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            The name of the earcon.
667a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            Example: <code>"[tick]"</code>
668904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     * @param filename
669904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            The full path to the sound file (for example:
670904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            "/sdcard/mysounds/tick.wav")
671904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *
672ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
673904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     */
674904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen    public int addEarcon(String earcon, String filename) {
675904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen        synchronized (mStartLock) {
676904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            if (!mStarted) {
677ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return ERROR;
678904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            }
679904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            try {
680904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mITts.addEarconFile(mPackageName, earcon, filename);
681ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return SUCCESS;
682904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            } catch (RemoteException e) {
683904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                // TTS died; restart it.
684904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                Log.e("TextToSpeech.java - addEarcon", "RemoteException");
685904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                e.printStackTrace();
686904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mStarted = false;
687904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                initTts();
688904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            } catch (NullPointerException e) {
689904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                // TTS died; restart it.
690904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                Log.e("TextToSpeech.java - addEarcon", "NullPointerException");
691904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                e.printStackTrace();
692904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mStarted = false;
693904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                initTts();
694904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            } catch (IllegalStateException e) {
695904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                // TTS died; restart it.
696904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                Log.e("TextToSpeech.java - addEarcon", "IllegalStateException");
697904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                e.printStackTrace();
698904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mStarted = false;
699904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                initTts();
700904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            }
701ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            return ERROR;
702904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen        }
703904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen    }
704904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen
705904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen
706904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen    /**
707e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * Speaks the string using the specified queuing strategy and speech
708a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * parameters.
709e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
710e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param text
711e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            The string of text to be spoken.
712e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param queueMode
713679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     *            The queuing strategy to use.
714a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            {@link #QUEUE_ADD} or {@link #QUEUE_FLUSH}.
715e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param params
716a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            The list of parameters to be used. Can be null if no parameters are given.
717a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            They are specified using a (key, value) pair, where the key can be
718a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            {@link Engine#KEY_PARAM_STREAM} or
719a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            {@link Engine#KEY_PARAM_UTTERANCE_ID}.
7205c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
721ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
722e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
7235c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int speak(String text, int queueMode, HashMap<String,String> params)
724a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi    {
72591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
726ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
7271e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi            Log.i("TextToSpeech.java - speak", "speak text of length " + text.length());
72891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
7291e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi                Log.e("TextToSpeech.java - speak", "service isn't started");
730c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
731e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
732e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
733630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                if ((params != null) && (!params.isEmpty())) {
734ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                    String extra = params.get(Engine.KEY_PARAM_STREAM);
735630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                    if (extra != null) {
736ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = extra;
737630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                    }
738ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                    extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID);
739630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                    if (extra != null) {
740ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra;
741630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                    }
74260dd360640a400d9b4a602160733281d284aaee5Charles Chen                    extra = params.get(Engine.KEY_PARAM_ENGINE);
74360dd360640a400d9b4a602160733281d284aaee5Charles Chen                    if (extra != null) {
74460dd360640a400d9b4a602160733281d284aaee5Charles Chen                        mCachedParams[Engine.PARAM_POSITION_ENGINE + 1] = extra;
74560dd360640a400d9b4a602160733281d284aaee5Charles Chen                    }
746a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                }
747a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen                result = mITts.speak(mPackageName, text, queueMode, mCachedParams);
748e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (RemoteException e) {
749e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
750630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - speak", "RemoteException");
751630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
75291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
753e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
754e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (NullPointerException e) {
755e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
756630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - speak", "NullPointerException");
757630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
75891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
759e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
760e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (IllegalStateException e) {
761e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
762630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - speak", "IllegalStateException");
763630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
76491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
765e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
766c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
767a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                resetCachedParams();
768a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                return result;
769e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
770e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
771e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
772e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
773e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
774e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
775e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * Plays the earcon using the specified queueing mode and parameters.
776e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
777e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param earcon
778e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            The earcon that should be played
779e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param queueMode
780a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            {@link #QUEUE_ADD} or {@link #QUEUE_FLUSH}.
781e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param params
782a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            The list of parameters to be used. Can be null if no parameters are given.
783a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            They are specified using a (key, value) pair, where the key can be
784a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            {@link Engine#KEY_PARAM_STREAM} or
785a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            {@link Engine#KEY_PARAM_UTTERANCE_ID}.
7865c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
787ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
788e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
7895c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int playEarcon(String earcon, int queueMode,
790a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi            HashMap<String,String> params) {
79191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
792ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
79391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
794c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
795e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
796e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
797a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                if ((params != null) && (!params.isEmpty())) {
798ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                    String extra = params.get(Engine.KEY_PARAM_STREAM);
799a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                    if (extra != null) {
800ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = extra;
801a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                    }
802ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                    extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID);
803a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                    if (extra != null) {
804ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra;
805a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                    }
806a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                }
807a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen                result = mITts.playEarcon(mPackageName, earcon, queueMode, null);
808e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (RemoteException e) {
809e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
810630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - playEarcon", "RemoteException");
811630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
81291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
813e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
814e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (NullPointerException e) {
815e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
816630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - playEarcon", "NullPointerException");
817630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
81891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
819e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
820e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (IllegalStateException e) {
821e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
822630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - playEarcon", "IllegalStateException");
823630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
82491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
825e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
826c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
827a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                resetCachedParams();
828a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                return result;
829e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
830e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
831e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
832679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi
8335c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    /**
8345c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     * Plays silence for the specified amount of time using the specified
8355c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     * queue mode.
8365c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
8375c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     * @param durationInMs
8385c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *            A long that indicates how long the silence should last.
8395c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     * @param queueMode
840a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            {@link #QUEUE_ADD} or {@link #QUEUE_FLUSH}.
841a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * @param params
842a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            The list of parameters to be used. Can be null if no parameters are given.
843a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            They are specified using a (key, value) pair, where the key can be
844a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            {@link Engine#KEY_PARAM_UTTERANCE_ID}.
8455c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
846ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
8475c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     */
84878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen    public int playSilence(long durationInMs, int queueMode, HashMap<String,String> params) {
849f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen        synchronized (mStartLock) {
850ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
851f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen            if (!mStarted) {
852c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
853f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen            }
854f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen            try {
85578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                if ((params != null) && (!params.isEmpty())) {
856ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                    String extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID);
85778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                    if (extra != null) {
858ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra;
85978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                    }
86078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                }
861a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen                result = mITts.playSilence(mPackageName, durationInMs, queueMode, mCachedParams);
862f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen            } catch (RemoteException e) {
863f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                // TTS died; restart it.
864630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - playSilence", "RemoteException");
865630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
866f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                mStarted = false;
867f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                initTts();
868f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen            } catch (NullPointerException e) {
869f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                // TTS died; restart it.
870630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - playSilence", "NullPointerException");
871630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
872f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                mStarted = false;
873f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                initTts();
874f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen            } catch (IllegalStateException e) {
875f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                // TTS died; restart it.
876630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - playSilence", "IllegalStateException");
877630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
878f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                mStarted = false;
879f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                initTts();
880c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
88160dd360640a400d9b4a602160733281d284aaee5Charles Chen                return result;
882f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen            }
883f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen        }
884a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi    }
885e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
886e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
887e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
888a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * Returns whether or not the TextToSpeech engine is busy speaking.
889e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
890a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * @return Whether or not the TextToSpeech engine is busy speaking.
891e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
892e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    public boolean isSpeaking() {
89391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
89491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
895e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                return false;
896e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
897e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
89891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                return mITts.isSpeaking();
899e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (RemoteException e) {
900e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
901630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - isSpeaking", "RemoteException");
902630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
90391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
904e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
905e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (NullPointerException e) {
906e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
907630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - isSpeaking", "NullPointerException");
908630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
90991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
910e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
911e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (IllegalStateException e) {
912e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
913630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - isSpeaking", "IllegalStateException");
914630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
91591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
916e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
917e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
918e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            return false;
919e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
920e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
921e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
922e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
923e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
924a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * Interrupts the current utterance (whether played or rendered to file) and discards other
925a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * utterances in the queue.
9265c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
927ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
928e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
9295c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int stop() {
93091bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
931ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
93291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
933c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
934e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
935e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
936a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen                result = mITts.stop(mPackageName);
937e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (RemoteException e) {
938e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
939630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - stop", "RemoteException");
940630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
94191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
942e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
943e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (NullPointerException e) {
944e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
945630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - stop", "NullPointerException");
946630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
94791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
948e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
949e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (IllegalStateException e) {
950e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
951630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - stop", "IllegalStateException");
952630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
95391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
954e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
955c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
95660dd360640a400d9b4a602160733281d284aaee5Charles Chen                return result;
957e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
958e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
959e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
960e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
961e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
962e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
963a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * Sets the speech rate for the TextToSpeech engine.
964e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
965679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     * This has no effect on any pre-recorded speech.
966e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
967e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param speechRate
968a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            The speech rate for the TextToSpeech engine. 1 is the normal speed,
969679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     *            lower values slow down the speech (0.5 is half the normal speech rate),
970679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     *            greater values accelerate it (2 is twice the normal speech rate).
9715c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
972ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
973e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
9745c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int setSpeechRate(float speechRate) {
97591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
976ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
97791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
978c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
979e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
980e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
981679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi                if (speechRate > 0) {
982da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi                    int rate = (int)(speechRate*100);
983ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                    mCachedParams[Engine.PARAM_POSITION_RATE + 1] = String.valueOf(rate);
9845e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi                    // the rate is not set here, instead it is cached so it will be associated
9855e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi                    // with all upcoming utterances.
9865e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi                    if (speechRate > 0.0f) {
987ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        result = SUCCESS;
9885e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi                    } else {
989ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        result = ERROR;
9905e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi                    }
991679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi                }
992630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (NullPointerException e) {
993630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
994630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - setSpeechRate", "NullPointerException");
995630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
996630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
997630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
998630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (IllegalStateException e) {
999630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
1000630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - setSpeechRate", "IllegalStateException");
1001630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
100291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
1003e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
1004c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
100560dd360640a400d9b4a602160733281d284aaee5Charles Chen                return result;
1006e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
1007e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
1008e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
1009e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
1010e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
1011e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
1012a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * Sets the speech pitch for the TextToSpeech engine.
10132ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     *
10142ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     * This has no effect on any pre-recorded speech.
10152ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     *
10162ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     * @param pitch
1017a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            The pitch for the TextToSpeech engine. 1 is the normal pitch,
10182ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     *            lower values lower the tone of the synthesized voice,
10192ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     *            greater values increase it.
10205c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
1021ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
10222ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     */
10235c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int setPitch(float pitch) {
10242ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi        synchronized (mStartLock) {
1025ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
10262ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi            if (!mStarted) {
1027c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
10282ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi            }
10292ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi            try {
10301a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                // the pitch is not set here, instead it is cached so it will be associated
10311a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                // with all upcoming utterances.
10322ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi                if (pitch > 0) {
10331a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    int p = (int)(pitch*100);
10341a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    mCachedParams[Engine.PARAM_POSITION_PITCH + 1] = String.valueOf(p);
10351a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    result = SUCCESS;
10362ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi                }
1037630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (NullPointerException e) {
1038630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
1039630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - setPitch", "NullPointerException");
1040630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1041630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
1042630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
1043630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (IllegalStateException e) {
1044630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
1045630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - setPitch", "IllegalStateException");
1046630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
10472ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi                mStarted = false;
10482ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi                initTts();
1049c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
105060dd360640a400d9b4a602160733281d284aaee5Charles Chen                return result;
10512ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi            }
10522ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi        }
10532ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi    }
10542ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi
10552ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi
10562ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi    /**
1057a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * Sets the language for the TextToSpeech engine.
1058a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * The TextToSpeech engine will try to use the closest match to the specified
1059a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * language as represented by the Locale, but there is no guarantee that the exact same Locale
1060a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * will be used. Use {@link #isLanguageAvailable(Locale)} to check the level of support
1061a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * before choosing the language to use for the next utterances.
1062e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
1063679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     * @param loc
1064679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     *            The locale describing the language to be used.
10655c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
1066ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return code indicating the support status for the locale. See {@link #LANG_AVAILABLE},
1067ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     *         {@link #LANG_COUNTRY_AVAILABLE}, {@link #LANG_COUNTRY_VAR_AVAILABLE},
1068ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     *         {@link #LANG_MISSING_DATA} and {@link #LANG_NOT_SUPPORTED}.
1069e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
10705c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int setLanguage(Locale loc) {
107191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
1072ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = LANG_NOT_SUPPORTED;
107391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
10744a60d61887a20d349e5eb38900dfbcaab06630fcJean-Michel Trivi                return result;
10754a60d61887a20d349e5eb38900dfbcaab06630fcJean-Michel Trivi            }
10764a60d61887a20d349e5eb38900dfbcaab06630fcJean-Michel Trivi            if (loc == null) {
1077c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
1078e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
1079e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
10801a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                String language = loc.getISO3Language();
10811a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                String country = loc.getISO3Country();
10821a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                String variant = loc.getVariant();
10831a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                // Check if the language, country, variant are available, and cache
10841a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                // the available parts.
10851a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                // Note that the language is not actually set here, instead it is cached so it
10861a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                // will be associated with all upcoming utterances.
10871a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                result = mITts.isLanguageAvailable(language, country, variant, mCachedParams);
10881a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                if (result >= LANG_AVAILABLE){
10891a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1] = language;
10901a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    if (result >= LANG_COUNTRY_AVAILABLE){
10911a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                        mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = country;
10921a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    } else {
10931a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                        mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = "";
10941a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    }
10951a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    if (result >= LANG_COUNTRY_VAR_AVAILABLE){
10961a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                        mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = variant;
10971a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    } else {
10981a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                        mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = "";
10991a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    }
11001a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                }
1101748efcc3fb1b369690ab4617a04f452b1832edf4Charles Chen            } catch (RemoteException e) {
1102e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
1103630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - setLanguage", "RemoteException");
1104630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1105630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
1106630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
1107630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (NullPointerException e) {
1108630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
1109630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - setLanguage", "NullPointerException");
1110630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1111630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
1112630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
1113630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (IllegalStateException e) {
1114630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
1115630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - setLanguage", "IllegalStateException");
1116630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
111791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
1118e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
1119c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
112060dd360640a400d9b4a602160733281d284aaee5Charles Chen                return result;
1121e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
1122e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
1123e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
1124e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
11255c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen
1126aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    /**
1127a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * Returns a Locale instance describing the language currently being used by the TextToSpeech
1128a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * engine.
1129ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi     * @return language, country (if any) and variant (if any) used by the engine stored in a Locale
1130a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *     instance, or null is the TextToSpeech engine has failed.
1131ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi     */
1132ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi    public Locale getLanguage() {
1133ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi        synchronized (mStartLock) {
1134ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            if (!mStarted) {
1135ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                return null;
1136ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            }
1137ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            try {
11381a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                // Only do a call to the native synth if there is nothing in the cached params
11391a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                if (mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1].length() < 1){
11401a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    String[] locStrings = mITts.getLanguage();
11411a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    if ((locStrings != null) && (locStrings.length == 3)) {
11421a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                        return new Locale(locStrings[0], locStrings[1], locStrings[2]);
11431a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    } else {
11441a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                        return null;
11451a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    }
1146ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                } else {
11471a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                    return new Locale(mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1],
11481a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                            mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1],
11491a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                            mCachedParams[Engine.PARAM_POSITION_VARIANT + 1]);
1150ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                }
1151ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            } catch (RemoteException e) {
1152ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                // TTS died; restart it.
1153630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - getLanguage", "RemoteException");
1154630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1155630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
1156630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
1157630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (NullPointerException e) {
1158630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
1159630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - getLanguage", "NullPointerException");
1160630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1161630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
1162630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
1163630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (IllegalStateException e) {
1164630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
1165630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - getLanguage", "IllegalStateException");
1166630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1167ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                mStarted = false;
1168ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                initTts();
1169ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            }
1170ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            return null;
1171ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi        }
1172ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi    }
1173ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi
1174ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi    /**
1175a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     * Checks if the specified language as represented by the Locale is available and supported.
1176aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     *
1177aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     * @param loc
1178ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi     *            The Locale describing the language to be used.
11795c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
1180ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return code indicating the support status for the locale. See {@link #LANG_AVAILABLE},
1181ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     *         {@link #LANG_COUNTRY_AVAILABLE}, {@link #LANG_COUNTRY_VAR_AVAILABLE},
1182ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     *         {@link #LANG_MISSING_DATA} and {@link #LANG_NOT_SUPPORTED}.
1183aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     */
1184aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    public int isLanguageAvailable(Locale loc) {
1185ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi        synchronized (mStartLock) {
1186ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = LANG_NOT_SUPPORTED;
1187ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            if (!mStarted) {
1188c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
1189ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            }
1190ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            try {
1191c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                result = mITts.isLanguageAvailable(loc.getISO3Language(),
11921a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen                        loc.getISO3Country(), loc.getVariant(), mCachedParams);
1193ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            } catch (RemoteException e) {
1194ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                // TTS died; restart it.
1195630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - isLanguageAvailable", "RemoteException");
1196630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1197630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
1198630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
1199630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (NullPointerException e) {
1200630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
1201630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - isLanguageAvailable", "NullPointerException");
1202630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1203630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
1204630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
1205630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (IllegalStateException e) {
1206630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
1207630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - isLanguageAvailable", "IllegalStateException");
1208630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1209ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                mStarted = false;
1210ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                initTts();
1211c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
121260dd360640a400d9b4a602160733281d284aaee5Charles Chen                return result;
1213ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            }
1214ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi        }
1215aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    }
1216aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
1217aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
1218e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
1219d4989093ed708ddf9c799655ea0af7afda726426Charles Chen     * Synthesizes the given text to a file using the specified parameters.
1220e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
1221e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param text
1222e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            The String of text that should be synthesized
1223e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param params
1224a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            The list of parameters to be used. Can be null if no parameters are given.
1225a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            They are specified using a (key, value) pair, where the key can be
1226a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi     *            {@link Engine#KEY_PARAM_UTTERANCE_ID}.
1227e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param filename
1228e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            The string that gives the full output filename; it should be
1229e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            something like "/sdcard/myappsounds/mysound.wav".
12305c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
1231ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
1232e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
12335c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int synthesizeToFile(String text, HashMap<String,String> params,
1234e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            String filename) {
123591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
1236ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
12371e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi            Log.i("TextToSpeech.java - synthesizeToFile", "synthesizeToFile text of length "
12381e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi                    + text.length());
123991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
12401e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi                Log.e("TextToSpeech.java - synthesizeToFile", "service isn't started");
1241c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
1242e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
1243e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
1244630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                if ((params != null) && (!params.isEmpty())) {
1245630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                    // no need to read the stream type here
1246ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                    String extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID);
1247630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                    if (extra != null) {
1248ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra;
1249630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                    }
125060dd360640a400d9b4a602160733281d284aaee5Charles Chen                    extra = params.get(Engine.KEY_PARAM_ENGINE);
125160dd360640a400d9b4a602160733281d284aaee5Charles Chen                    if (extra != null) {
125260dd360640a400d9b4a602160733281d284aaee5Charles Chen                        mCachedParams[Engine.PARAM_POSITION_ENGINE + 1] = extra;
125360dd360640a400d9b4a602160733281d284aaee5Charles Chen                    }
1254a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                }
1255b21651c10ca833e073337ae6a0ee55fcc39c32f1Jean-Michel Trivi                result = mITts.synthesizeToFile(mPackageName, text, mCachedParams, filename) ?
1256b21651c10ca833e073337ae6a0ee55fcc39c32f1Jean-Michel Trivi                        SUCCESS : ERROR;
1257e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (RemoteException e) {
1258e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
1259630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - synthesizeToFile", "RemoteException");
1260630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
126191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
1262e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
1263e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (NullPointerException e) {
1264e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
1265630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - synthesizeToFile", "NullPointerException");
1266630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
126791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
1268e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
1269e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (IllegalStateException e) {
1270e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
1271630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - synthesizeToFile", "IllegalStateException");
1272630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
127391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
1274e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
1275c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
1276a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                resetCachedParams();
1277a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                return result;
1278e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
1279e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
1280e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
1281e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
1282a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi
1283a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi    /**
1284a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi     * Convenience method to reset the cached parameters to the current default values
1285a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi     * if they are not persistent between calls to the service.
1286a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi     */
1287a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi    private void resetCachedParams() {
1288ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_STREAM + 1] =
1289ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                String.valueOf(Engine.DEFAULT_STREAM);
1290ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID+ 1] = "";
1291a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi    }
1292a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi
129378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen    /**
129478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     * Sets the OnUtteranceCompletedListener that will fire when an utterance completes.
129578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     *
129678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     * @param listener
129778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     *            The OnUtteranceCompletedListener
129878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     *
1299ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
130078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     */
130160dd360640a400d9b4a602160733281d284aaee5Charles Chen    public int setOnUtteranceCompletedListener(
130260dd360640a400d9b4a602160733281d284aaee5Charles Chen            final OnUtteranceCompletedListener listener) {
130378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen        synchronized (mStartLock) {
1304ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
130578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            if (!mStarted) {
130678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                return result;
130778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            }
130878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            mITtscallback = new ITtsCallback.Stub() {
130960dd360640a400d9b4a602160733281d284aaee5Charles Chen                public void utteranceCompleted(String utteranceId) throws RemoteException {
131060dd360640a400d9b4a602160733281d284aaee5Charles Chen                    if (listener != null) {
131160dd360640a400d9b4a602160733281d284aaee5Charles Chen                        listener.onUtteranceCompleted(utteranceId);
131260dd360640a400d9b4a602160733281d284aaee5Charles Chen                    }
131360dd360640a400d9b4a602160733281d284aaee5Charles Chen                }
131478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            };
131578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            try {
131678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                result = mITts.registerCallback(mPackageName, mITtscallback);
131778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            } catch (RemoteException e) {
131878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                // TTS died; restart it.
131978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                Log.e("TextToSpeech.java - registerCallback", "RemoteException");
132078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                e.printStackTrace();
132178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                mStarted = false;
132278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                initTts();
132378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            } catch (NullPointerException e) {
132478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                // TTS died; restart it.
132578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                Log.e("TextToSpeech.java - registerCallback", "NullPointerException");
132678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                e.printStackTrace();
132778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                mStarted = false;
132878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                initTts();
132978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            } catch (IllegalStateException e) {
133078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                // TTS died; restart it.
133178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                Log.e("TextToSpeech.java - registerCallback", "IllegalStateException");
133278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                e.printStackTrace();
133378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                mStarted = false;
133478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                initTts();
133578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            } finally {
133678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                return result;
133778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            }
133860dd360640a400d9b4a602160733281d284aaee5Charles Chen        }
133978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen    }
134078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen
1341b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen    /**
1342b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen     * Sets the speech synthesis engine to be used by its packagename.
1343b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen     *
1344b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen     * @param enginePackageName
1345b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen     *            The packagename for the synthesis engine (ie, "com.svox.pico")
1346b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen     *
1347b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
1348b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen     */
134960dd360640a400d9b4a602160733281d284aaee5Charles Chen    public int setEngineByPackageName(String enginePackageName) {
135060dd360640a400d9b4a602160733281d284aaee5Charles Chen        synchronized (mStartLock) {
135160dd360640a400d9b4a602160733281d284aaee5Charles Chen            int result = TextToSpeech.ERROR;
135260dd360640a400d9b4a602160733281d284aaee5Charles Chen            if (!mStarted) {
135360dd360640a400d9b4a602160733281d284aaee5Charles Chen                return result;
135460dd360640a400d9b4a602160733281d284aaee5Charles Chen            }
135560dd360640a400d9b4a602160733281d284aaee5Charles Chen            try {
135660dd360640a400d9b4a602160733281d284aaee5Charles Chen                result = mITts.setEngineByPackageName(enginePackageName);
135760dd360640a400d9b4a602160733281d284aaee5Charles Chen                if (result == TextToSpeech.SUCCESS){
135860dd360640a400d9b4a602160733281d284aaee5Charles Chen                    mCachedParams[Engine.PARAM_POSITION_ENGINE + 1] = enginePackageName;
135960dd360640a400d9b4a602160733281d284aaee5Charles Chen                }
136060dd360640a400d9b4a602160733281d284aaee5Charles Chen            } catch (RemoteException e) {
136160dd360640a400d9b4a602160733281d284aaee5Charles Chen                // TTS died; restart it.
136260dd360640a400d9b4a602160733281d284aaee5Charles Chen                Log.e("TextToSpeech.java - setEngineByPackageName", "RemoteException");
136360dd360640a400d9b4a602160733281d284aaee5Charles Chen                e.printStackTrace();
136460dd360640a400d9b4a602160733281d284aaee5Charles Chen                mStarted = false;
136560dd360640a400d9b4a602160733281d284aaee5Charles Chen                initTts();
136660dd360640a400d9b4a602160733281d284aaee5Charles Chen            } catch (NullPointerException e) {
136760dd360640a400d9b4a602160733281d284aaee5Charles Chen                // TTS died; restart it.
136860dd360640a400d9b4a602160733281d284aaee5Charles Chen                Log.e("TextToSpeech.java - setEngineByPackageName", "NullPointerException");
136960dd360640a400d9b4a602160733281d284aaee5Charles Chen                e.printStackTrace();
137060dd360640a400d9b4a602160733281d284aaee5Charles Chen                mStarted = false;
137160dd360640a400d9b4a602160733281d284aaee5Charles Chen                initTts();
137260dd360640a400d9b4a602160733281d284aaee5Charles Chen            } catch (IllegalStateException e) {
137360dd360640a400d9b4a602160733281d284aaee5Charles Chen                // TTS died; restart it.
137460dd360640a400d9b4a602160733281d284aaee5Charles Chen                Log.e("TextToSpeech.java - setEngineByPackageName", "IllegalStateException");
137560dd360640a400d9b4a602160733281d284aaee5Charles Chen                e.printStackTrace();
137660dd360640a400d9b4a602160733281d284aaee5Charles Chen                mStarted = false;
137760dd360640a400d9b4a602160733281d284aaee5Charles Chen                initTts();
137860dd360640a400d9b4a602160733281d284aaee5Charles Chen            } finally {
137960dd360640a400d9b4a602160733281d284aaee5Charles Chen                return result;
138060dd360640a400d9b4a602160733281d284aaee5Charles Chen            }
138160dd360640a400d9b4a602160733281d284aaee5Charles Chen        }
1382b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen    }
1383b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen
1384def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen
1385def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen    /**
1386def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen     * Gets the packagename of the default speech synthesis engine.
1387def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen     *
1388def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen     * @return Packagename of the TTS engine that the user has chosen as their default.
1389def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen     */
1390def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen    public String getDefaultEngine() {
1391def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen        synchronized (mStartLock) {
1392def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen            String engineName = "";
1393def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen            if (!mStarted) {
1394def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                return engineName;
1395def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen            }
1396def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen            try {
1397def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                engineName = mITts.getDefaultEngine();
1398def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen            } catch (RemoteException e) {
1399def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                // TTS died; restart it.
1400def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                Log.e("TextToSpeech.java - setEngineByPackageName", "RemoteException");
1401def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                e.printStackTrace();
1402def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                mStarted = false;
1403def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                initTts();
1404def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen            } catch (NullPointerException e) {
1405def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                // TTS died; restart it.
1406def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                Log.e("TextToSpeech.java - setEngineByPackageName", "NullPointerException");
1407def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                e.printStackTrace();
1408def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                mStarted = false;
1409def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                initTts();
1410def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen            } catch (IllegalStateException e) {
1411def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                // TTS died; restart it.
1412def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                Log.e("TextToSpeech.java - setEngineByPackageName", "IllegalStateException");
1413def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                e.printStackTrace();
1414def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                mStarted = false;
1415def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                initTts();
1416def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen            } finally {
1417def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen                return engineName;
1418def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen            }
1419def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen        }
1420def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen    }
142142229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen
142242229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen
142342229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen    /**
142442229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen     * Returns whether or not the user is forcing their defaults to override the
142542229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen     * Text-To-Speech settings set by applications.
142642229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen     *
142742229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen     * @return Whether or not defaults are enforced.
142842229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen     */
142942229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen    public boolean areDefaultsEnforced() {
143042229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen        synchronized (mStartLock) {
143142229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen            boolean defaultsEnforced = false;
143242229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen            if (!mStarted) {
143342229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                return defaultsEnforced;
143442229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen            }
143542229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen            try {
143642229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                defaultsEnforced = mITts.areDefaultsEnforced();
143742229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen            } catch (RemoteException e) {
143842229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                // TTS died; restart it.
143942229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                Log.e("TextToSpeech.java - areDefaultsEnforced", "RemoteException");
144042229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                e.printStackTrace();
144142229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                mStarted = false;
144242229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                initTts();
144342229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen            } catch (NullPointerException e) {
144442229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                // TTS died; restart it.
144542229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                Log.e("TextToSpeech.java - areDefaultsEnforced", "NullPointerException");
144642229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                e.printStackTrace();
144742229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                mStarted = false;
144842229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                initTts();
144942229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen            } catch (IllegalStateException e) {
145042229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                // TTS died; restart it.
145142229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                Log.e("TextToSpeech.java - areDefaultsEnforced", "IllegalStateException");
145242229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                e.printStackTrace();
145342229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                mStarted = false;
145442229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                initTts();
145542229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen            } finally {
145642229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen                return defaultsEnforced;
145742229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen            }
145842229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen        }
145942229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen    }
1460e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi}
1461