TextToSpeech.java revision 77a5d39343760d9950ca15a87db0ae778afb4f2b
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.
38e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi *
39e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */
4062788e9b48f884a35b89c88911b581daa6a14e08Jean-Michel Trivi//TODO complete javadoc + add links to constants
41a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivipublic class TextToSpeech {
42e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
4391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    /**
4491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi     * Denotes a successful operation.
4591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi     */
46ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int SUCCESS                = 0;
4791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    /**
4891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi     * Denotes a generic operation failure.
4991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi     */
50ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int ERROR                  = -1;
5191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi
52679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi    /**
53679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     * Queue mode where all entries in the playback queue (media to be played
54679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     * and text to be synthesized) are dropped and replaced by the new entry.
55679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     */
56ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int QUEUE_FLUSH = 0;
57679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi    /**
58679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     * Queue mode where the new entry is added at the end of the playback queue.
59679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     */
60ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int QUEUE_ADD = 1;
61e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
62aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
63aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    /**
64aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     * Denotes the language is available exactly as specified by the locale
65aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     */
66ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int LANG_COUNTRY_VAR_AVAILABLE = 2;
67aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
68aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
69aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    /**
70aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     * Denotes the language is available for the language and country specified
71aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     * by the locale, but not the variant.
72aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     */
73ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int LANG_COUNTRY_AVAILABLE = 1;
74aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
75aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
76aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    /**
77aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     * Denotes the language is available for the language by the locale,
78aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     * but not the country and variant.
79aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     */
80ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int LANG_AVAILABLE = 0;
81aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
82aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    /**
83aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     * Denotes the language data is missing.
84aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     */
85ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int LANG_MISSING_DATA = -1;
86aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
87aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    /**
88aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     * Denotes the language is not supported by the current TTS engine.
89aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     */
90ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final int LANG_NOT_SUPPORTED = -2;
91ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi
92ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi
93ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    /**
94ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * Broadcast Action: The TextToSpeech synthesizer has completed processing
95ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * of all the text in the speech queue.
96ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     */
97ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
98ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi    public static final String ACTION_TTS_QUEUE_PROCESSING_COMPLETED =
99ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            "android.speech.tts.TTS_QUEUE_PROCESSING_COMPLETED";
100aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
101aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
102e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
103679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     * Called when the TTS has initialized.
104e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
10591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi     * The InitListener must implement the onInit function. onInit is passed a
10691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi     * status code indicating the result of the TTS initialization.
107e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
108e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    public interface OnInitListener {
10991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        public void onInit(int status);
110e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
111e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
112e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
11378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     * Called when the TTS has completed saying something that has an utterance ID set.
11478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     *
11578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     * The OnUtteranceCompletedListener must implement the onUtteranceCompleted function.
11678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     * onUtteranceCompleted is passed a String that is the utteranceId given in
11778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     * the original speak call.
11878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     */
11978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen    public interface OnUtteranceCompletedListener {
12078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen        public void onUtteranceCompleted(String utteranceId);
12178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen    }
12278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen
12378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen
12478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen    /**
125d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi     * Internal constants for the TTS functionality
126d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi     *
127d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi     */
128d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi    public class Engine {
129d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi        // default values for a TTS engine when settings are not found in the provider
13062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
13162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
13262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
133ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final int DEFAULT_RATE = 100; // 1x
13462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
13562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
13662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
137ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final int DEFAULT_PITCH = 100;// 1x
13862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
13962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
14062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
141ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final int USE_DEFAULTS = 0; // false
14262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
14362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
14462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
145ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String DEFAULT_SYNTH = "com.svox.pico";
146d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi
147a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi        // default values for rendering
148ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final int DEFAULT_STREAM = AudioManager.STREAM_MUSIC;
149a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi
150d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi        // return codes for a TTS engine's check data activity
15162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
15262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * Indicates success when checking the installation status of the resources used by the
153ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * text-to-speech engine with the {@link #ACTION_CHECK_TTS_DATA} intent.
15462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
155d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi        public static final int CHECK_VOICE_DATA_PASS = 1;
15662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
15762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * Indicates failure when checking the installation status of the resources used by the
158ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * text-to-speech engine with the {@link #ACTION_CHECK_TTS_DATA} intent.
15962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
160d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi        public static final int CHECK_VOICE_DATA_FAIL = 0;
16162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
16262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * Indicates erroneous data when checking the installation status of the resources used by
163ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * the text-to-speech engine with the {@link #ACTION_CHECK_TTS_DATA} intent.
16462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
165d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi        public static final int CHECK_VOICE_DATA_BAD_DATA = -1;
16662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
16762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * Indicates missing resources when checking the installation status of the resources used
168ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * by the text-to-speech engine with the {@link #ACTION_CHECK_TTS_DATA} intent.
16962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
170d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi        public static final int CHECK_VOICE_DATA_MISSING_DATA = -2;
17162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
17262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * Indicates missing storage volume when checking the installation status of the resources
173ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * used by the text-to-speech engine with the {@link #ACTION_CHECK_TTS_DATA} intent.
17462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
17562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        public static final int CHECK_VOICE_DATA_MISSING_VOLUME = -3;
17699a0feecd0f0aad314d7a4637d329b8a9e8c1150Charles Chen
177ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        // intents to ask engine to install data or check its data
178ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        /**
179ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * Broadcast Action: Triggers the platform Text-To-Speech engine to
180ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * start the activity that installs the resource files on the device
181ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * that are required for TTS to be operational. Since the installation
182ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * of the data can be interrupted or declined by the user, the application
183ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * shouldn't expect successful installation upon return from that intent,
184ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * and if need be, should check installation status with
185ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * {@link #ACTION_CHECK_TTS_DATA}.
186ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         */
187ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
188ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String ACTION_INSTALL_TTS_DATA =
189ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                "android.speech.tts.engine.INSTALL_TTS_DATA";
190ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi
191ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        /**
19277a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi         * {@hide}
19377a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi         */
19477a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi        @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
19577a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi        public static final String ACTION_TTS_DATA_INSTALLED =
19677a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi                "android.speech.tts.engine.TTS_DATA_INSTALLED";
19777a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi        /**
198ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * Broadcast Action: Starts the activity from the platform Text-To-Speech
199ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * engine to verify the proper installation and availability of the
200ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * resource files on the system. Upon completion, the activity will
201ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * return one of the following codes:
202ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * {@link #CHECK_VOICE_DATA_PASS},
203ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * {@link #CHECK_VOICE_DATA_FAIL},
204ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * {@link #CHECK_VOICE_DATA_BAD_DATA},
205ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * {@link #CHECK_VOICE_DATA_MISSING_DATA}, or
206ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * {@link #CHECK_VOICE_DATA_MISSING_VOLUME}.
207ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * <p> Moreover, the data received in the activity result will contain the following
208ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * fields:
209ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * <ul>
210ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         *   <li>{@link #EXTRA_VOICE_DATA_ROOT_DIRECTORY} which
211ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         *       indicates the path to the location of the resource files</li>,
212ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         *   <li>{@link #EXTRA_VOICE_DATA_FILES} which contains
213ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         *       the list of all the resource files</li>,
214ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         *   <li>and {@link #EXTRA_VOICE_DATA_FILES_INFO} which
215ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         *       contains, for each resource file, the description of the language covered by
216ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         *       the file in the xxx-YYY format, where xxx is the 3-letter ISO language code,
217ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         *       and YYY is the 3-letter ISO country code.</li>
218ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * </ul>
219ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         */
220ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
221ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String ACTION_CHECK_TTS_DATA =
222ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                "android.speech.tts.engine.CHECK_TTS_DATA";
223ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi
224ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        // extras for a TTS engine's check data activity
22562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
226ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where
22762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * the text-to-speech engine specifies the path to its resources.
22862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
229ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String EXTRA_VOICE_DATA_ROOT_DIRECTORY = "dataRoot";
23062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
231ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where
23262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * the text-to-speech engine specifies the file names of its resources under the
23362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * resource path.
23462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
235ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String EXTRA_VOICE_DATA_FILES = "dataFiles";
23662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
237ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi         * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where
23862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * the text-to-speech engine specifies the locale associated with each resource file.
23962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
240ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String EXTRA_VOICE_DATA_FILES_INFO = "dataFilesInfo";
24199a0feecd0f0aad314d7a4637d329b8a9e8c1150Charles Chen
24277a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi        // extras for a TTS engine's data installation
24377a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi        /**
24477a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi         * Extra information received with the {@link #ACTION_TTS_DATA_INSTALLED} intent
24577a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi         * which indicates whether the TTS data installation requested with
24677a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi         * {@link #ACTION_INSTALL_TTS_DATA} completed successfully or not. The value is
24777a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi         * {@link TextToSpeech#SUCCESS} or {@link TextToSpeech#ERROR}.
24877a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi         * {@hide}
24977a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi         */
25077a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi        public static final String EXTRA_TTS_DATA_INSTALLED = "dataInstalled";
25177a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi
25262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        // keys for the parameters passed with speak commands. Hidden keys are used internally
25362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        // to maintain engine state for each TextToSpeech instance.
25462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
25562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
25662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
257ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String KEY_PARAM_RATE = "rate";
25862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
25962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
26062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
261ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String KEY_PARAM_LANGUAGE = "language";
26262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
26362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
26462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
265ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String KEY_PARAM_COUNTRY = "country";
26662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
26762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
26862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
269ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String KEY_PARAM_VARIANT = "variant";
27062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
27162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * Parameter key to specify the audio stream type to be used when speaking text
27262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * or playing back a file.
27362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
274ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String KEY_PARAM_STREAM = "streamType";
27562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
27662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * Parameter key to identify an utterance in the completion listener after text has been
27762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * spoken, a file has been played back or a silence duration has elapsed.
27862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
279ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        public static final String KEY_PARAM_UTTERANCE_ID = "utteranceId";
28062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi
28162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        // key positions in the array of cached parameters
28262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
28362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
28462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
285ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        protected static final int PARAM_POSITION_RATE = 0;
28662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
28762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
28862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
289ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        protected static final int PARAM_POSITION_LANGUAGE = 2;
29062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
29162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
29262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
293ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        protected static final int PARAM_POSITION_COUNTRY = 4;
29462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
29562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
29662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
297ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        protected static final int PARAM_POSITION_VARIANT = 6;
29862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
29962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
30062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
301ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        protected static final int PARAM_POSITION_STREAM = 8;
30262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
30362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
30462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
305ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        protected static final int PARAM_POSITION_UTTERANCE_ID = 10;
30662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi        /**
30762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         * {@hide}
30862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi         */
309ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        protected static final int NB_CACHED_PARAMS = 6;
310d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi    }
311d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi
312d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi    /**
313679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     * Connection needed for the TTS.
314e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
315679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi    private ServiceConnection mServiceConnection;
316e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
31791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    private ITts mITts = null;
31878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen    private ITtsCallback mITtscallback = null;
31991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    private Context mContext = null;
320a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen    private String mPackageName = "";
32191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    private OnInitListener mInitListener = null;
32291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    private boolean mStarted = false;
32391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    private final Object mStartLock = new Object();
324da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi    /**
325da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi     * Used to store the cached parameters sent along with each synthesis request to the
326da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi     * TTS service.
327da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi     */
32887c9684fd0fa31fd6ad7f7e9f4cfedddc4fdc4b0Jean-Michel Trivi    private String[] mCachedParams;
329e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
330e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
331e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * The constructor for the TTS.
332e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
333e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param context
334e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            The context
33591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi     * @param listener
33691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi     *            The InitListener that will be called when the TTS has
337e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            initialized successfully.
338e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
33991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi    public TextToSpeech(Context context, OnInitListener listener) {
34091bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        mContext = context;
341a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen        mPackageName = mContext.getPackageName();
34291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        mInitListener = listener;
34387c9684fd0fa31fd6ad7f7e9f4cfedddc4fdc4b0Jean-Michel Trivi
344ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams = new String[2*Engine.NB_CACHED_PARAMS]; // store key and value
345ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_RATE] = Engine.KEY_PARAM_RATE;
346ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_LANGUAGE] = Engine.KEY_PARAM_LANGUAGE;
347ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_COUNTRY] = Engine.KEY_PARAM_COUNTRY;
348ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_VARIANT] = Engine.KEY_PARAM_VARIANT;
349ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_STREAM] = Engine.KEY_PARAM_STREAM;
350ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID] = Engine.KEY_PARAM_UTTERANCE_ID;
35187c9684fd0fa31fd6ad7f7e9f4cfedddc4fdc4b0Jean-Michel Trivi
352ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_RATE + 1] =
353ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                String.valueOf(Engine.DEFAULT_RATE);
354da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi        // initialize the language cached parameters with the current Locale
355da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi        Locale defaultLoc = Locale.getDefault();
356ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1] = defaultLoc.getISO3Language();
357ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = defaultLoc.getISO3Country();
358ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = defaultLoc.getVariant();
359e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
360ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_STREAM + 1] =
361ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                String.valueOf(Engine.DEFAULT_STREAM);
362ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = "";
363a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi
364da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi        initTts();
365e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
366e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
367e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
368e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    private void initTts() {
36991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        mStarted = false;
370e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
371e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        // Initialize the TTS, run the callback after the binding is successful
372679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi        mServiceConnection = new ServiceConnection() {
373e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            public void onServiceConnected(ComponentName name, IBinder service) {
37491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                synchronized(mStartLock) {
37591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                    mITts = ITts.Stub.asInterface(service);
37691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                    mStarted = true;
37791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                    if (mInitListener != null) {
37891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                        // TODO manage failures and missing resources
379ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mInitListener.onInit(SUCCESS);
380e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                    }
381e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                }
382e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
383e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
384e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            public void onServiceDisconnected(ComponentName name) {
38591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                synchronized(mStartLock) {
38691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                    mITts = null;
38791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                    mInitListener = null;
38891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                    mStarted = false;
389e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                }
390e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
391e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        };
392e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
39352ae06521a8d4c48757b126cff233f037d0a16baCharles Chen        Intent intent = new Intent("android.intent.action.START_TTS_SERVICE");
394e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        intent.addCategory("android.intent.category.TTS");
395679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi        mContext.bindService(intent, mServiceConnection,
39691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                Context.BIND_AUTO_CREATE);
397a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi        // TODO handle case where the binding works (should always work) but
398a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi        //      the plugin fails
399e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
400e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
401e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
402e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
403e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * Shuts down the TTS. It is good practice to call this in the onDestroy
404e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * method of the Activity that is using the TTS so that the TTS is stopped
405e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * cleanly.
406e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
407e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    public void shutdown() {
408e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        try {
409679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi            mContext.unbindService(mServiceConnection);
410e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        } catch (IllegalArgumentException e) {
411e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            // Do nothing and fail silently since an error here indicates that
412e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            // binding never succeeded in the first place.
413e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
414e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
415e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
416e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
417e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
418e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * Adds a mapping between a string of text and a sound resource in a
419e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * package.
420ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @see #speak(String, int, HashMap)
421e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
422e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param text
423e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            Example: <b><code>"south_south_east"</code></b><br/>
424e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
425e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param packagename
426e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            Pass the packagename of the application that contains the
427e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            resource. If the resource is in your own application (this is
428e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            the most common case), then put the packagename of your
429e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            application here.<br/>
430e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            Example: <b>"com.google.marvin.compass"</b><br/>
431e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            The packagename can be found in the AndroidManifest.xml of
432e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            your application.
433e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            <p>
434e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            <code>&lt;manifest xmlns:android=&quot;...&quot;
435e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *      package=&quot;<b>com.google.marvin.compass</b>&quot;&gt;</code>
436e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            </p>
437e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
438e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param resourceId
439e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            Example: <b><code>R.raw.south_south_east</code></b>
4405c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
441ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
442e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
4435c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int addSpeech(String text, String packagename, int resourceId) {
44491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized(mStartLock) {
44591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
446ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return ERROR;
447e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
448e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
449a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen                mITts.addSpeech(mPackageName, text, packagename, resourceId);
450ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return SUCCESS;
451e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (RemoteException e) {
452e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
453630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - addSpeech", "RemoteException");
454630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
45591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
456e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
457e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (NullPointerException e) {
458e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
459630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - addSpeech", "NullPointerException");
460630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
46191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
462e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
463e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (IllegalStateException e) {
464e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
465630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - addSpeech", "IllegalStateException");
466630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
46791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
468e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
469e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
470ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            return ERROR;
471e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
472e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
473e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
474e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
475e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
476e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * Adds a mapping between a string of text and a sound file. Using this, it
477e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * is possible to add custom pronounciations for text.
478e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
479e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param text
480e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            The string of text
481e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param filename
482e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            The full path to the sound file (for example:
483e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            "/sdcard/mysounds/hello.wav")
4845c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
485ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
486e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
4875c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int addSpeech(String text, String filename) {
48891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
48991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
490ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return ERROR;
491e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
492e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
493a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen                mITts.addSpeechFile(mPackageName, text, filename);
494ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return SUCCESS;
495e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (RemoteException e) {
496e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
497630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - addSpeech", "RemoteException");
498630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
49991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
500e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
501e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (NullPointerException e) {
502e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
503630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - addSpeech", "NullPointerException");
504630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
50591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
506e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
507e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (IllegalStateException e) {
508e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
509630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - addSpeech", "IllegalStateException");
510630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
51191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
512e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
513e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
514ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            return ERROR;
515e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
516e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
517e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
518e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
519e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
520904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     * Adds a mapping between a string of text and a sound resource in a
521904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     * package.
522904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *
523ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @see #playEarcon(String, int, HashMap)
524904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *
525904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     * @param earcon The name of the earcon
526904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            Example: <b><code>"[tick]"</code></b><br/>
527904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *
528904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     * @param packagename
529904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            Pass the packagename of the application that contains the
530904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            resource. If the resource is in your own application (this is
531904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            the most common case), then put the packagename of your
532904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            application here.<br/>
533904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            Example: <b>"com.google.marvin.compass"</b><br/>
534904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            The packagename can be found in the AndroidManifest.xml of
535904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            your application.
536904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            <p>
537904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            <code>&lt;manifest xmlns:android=&quot;...&quot;
538904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *      package=&quot;<b>com.google.marvin.compass</b>&quot;&gt;</code>
539904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            </p>
540904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *
541904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     * @param resourceId
542904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            Example: <b><code>R.raw.tick_snd</code></b>
543904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *
544ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
545904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     */
546904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen    public int addEarcon(String earcon, String packagename, int resourceId) {
547904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen        synchronized(mStartLock) {
548904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            if (!mStarted) {
549ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return ERROR;
550904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            }
551904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            try {
552904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mITts.addEarcon(mPackageName, earcon, packagename, resourceId);
553ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return SUCCESS;
554904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            } catch (RemoteException e) {
555904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                // TTS died; restart it.
556904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                Log.e("TextToSpeech.java - addEarcon", "RemoteException");
557904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                e.printStackTrace();
558904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mStarted = false;
559904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                initTts();
560904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            } catch (NullPointerException e) {
561904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                // TTS died; restart it.
562904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                Log.e("TextToSpeech.java - addEarcon", "NullPointerException");
563904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                e.printStackTrace();
564904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mStarted = false;
565904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                initTts();
566904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            } catch (IllegalStateException e) {
567904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                // TTS died; restart it.
568904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                Log.e("TextToSpeech.java - addEarcon", "IllegalStateException");
569904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                e.printStackTrace();
570904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mStarted = false;
571904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                initTts();
572904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            }
573ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            return ERROR;
574904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen        }
575904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen    }
576904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen
577904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen
578904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen    /**
579904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     * Adds a mapping between a string of text and a sound file. Using this, it
580904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     * is possible to add custom earcons.
581904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *
582904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     * @param earcon
583904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            The name of the earcon
584904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     * @param filename
585904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            The full path to the sound file (for example:
586904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *            "/sdcard/mysounds/tick.wav")
587904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     *
588ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
589904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen     */
590904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen    public int addEarcon(String earcon, String filename) {
591904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen        synchronized (mStartLock) {
592904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            if (!mStarted) {
593ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return ERROR;
594904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            }
595904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            try {
596904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mITts.addEarconFile(mPackageName, earcon, filename);
597ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                return SUCCESS;
598904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            } catch (RemoteException e) {
599904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                // TTS died; restart it.
600904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                Log.e("TextToSpeech.java - addEarcon", "RemoteException");
601904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                e.printStackTrace();
602904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mStarted = false;
603904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                initTts();
604904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            } catch (NullPointerException e) {
605904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                // TTS died; restart it.
606904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                Log.e("TextToSpeech.java - addEarcon", "NullPointerException");
607904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                e.printStackTrace();
608904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mStarted = false;
609904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                initTts();
610904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            } catch (IllegalStateException e) {
611904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                // TTS died; restart it.
612904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                Log.e("TextToSpeech.java - addEarcon", "IllegalStateException");
613904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                e.printStackTrace();
614904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                mStarted = false;
615904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen                initTts();
616904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen            }
617ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            return ERROR;
618904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen        }
619904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen    }
620904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen
621904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen
622904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen    /**
623e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * Speaks the string using the specified queuing strategy and speech
624e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * parameters. Note that the speech parameters are not universally supported
625e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * by all engines and will be treated as a hint. The TTS library will try to
626e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * fulfill these parameters as much as possible, but there is no guarantee
627e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * that the voice used will have the properties specified.
628e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
629e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param text
630e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            The string of text to be spoken.
631e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param queueMode
632679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     *            The queuing strategy to use.
633ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     *            See QUEUE_ADD and QUEUE_FLUSH.
634e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param params
635a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi     *            The hashmap of speech parameters to be used.
6365c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
637ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
638e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
6395c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int speak(String text, int queueMode, HashMap<String,String> params)
640a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi    {
64191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
642ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
643e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            Log.i("TTS received: ", text);
64491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
645c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
646e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
647e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
648630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                if ((params != null) && (!params.isEmpty())) {
649ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                    String extra = params.get(Engine.KEY_PARAM_STREAM);
650630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                    if (extra != null) {
651ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = extra;
652630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                    }
653ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                    extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID);
654630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                    if (extra != null) {
655ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra;
656630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                    }
657a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                }
658a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen                result = mITts.speak(mPackageName, text, queueMode, mCachedParams);
659e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (RemoteException e) {
660e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
661630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - speak", "RemoteException");
662630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
66391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
664e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
665e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (NullPointerException e) {
666e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
667630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - speak", "NullPointerException");
668630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
66991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
670e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
671e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (IllegalStateException e) {
672e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
673630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - speak", "IllegalStateException");
674630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
67591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
676e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
677c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
678a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                resetCachedParams();
679a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                return result;
680e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
681e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
682e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
683e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
684e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
685e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
686e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * Plays the earcon using the specified queueing mode and parameters.
687e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
688e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param earcon
689e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            The earcon that should be played
690e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param queueMode
691ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     *            See QUEUE_ADD and QUEUE_FLUSH.
692e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param params
693a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi     *            The hashmap of parameters to be used.
6945c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
695ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
696e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
6975c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int playEarcon(String earcon, int queueMode,
698a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi            HashMap<String,String> params) {
69991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
700ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
70191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
702c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
703e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
704e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
705a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                if ((params != null) && (!params.isEmpty())) {
706ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                    String extra = params.get(Engine.KEY_PARAM_STREAM);
707a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                    if (extra != null) {
708ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = extra;
709a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                    }
710ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                    extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID);
711a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                    if (extra != null) {
712ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra;
713a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                    }
714a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                }
715a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen                result = mITts.playEarcon(mPackageName, earcon, queueMode, null);
716e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (RemoteException e) {
717e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
718630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - playEarcon", "RemoteException");
719630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
72091bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
721e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
722e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (NullPointerException e) {
723e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
724630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - playEarcon", "NullPointerException");
725630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
72691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
727e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
728e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (IllegalStateException e) {
729e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
730630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - playEarcon", "IllegalStateException");
731630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
73291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
733e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
734c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
735a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                resetCachedParams();
736a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                return result;
737e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
738e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
739e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
740679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi
7415c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    /**
7425c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     * Plays silence for the specified amount of time using the specified
7435c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     * queue mode.
7445c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
7455c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     * @param durationInMs
7465c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *            A long that indicates how long the silence should last.
7475c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     * @param queueMode
748ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     *            See QUEUE_ADD and QUEUE_FLUSH.
7495c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
750ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
7515c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     */
75278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen    public int playSilence(long durationInMs, int queueMode, HashMap<String,String> params) {
753f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen        synchronized (mStartLock) {
754ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
755f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen            if (!mStarted) {
756c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
757f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen            }
758f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen            try {
75978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                if ((params != null) && (!params.isEmpty())) {
760ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                    String extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID);
76178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                    if (extra != null) {
762ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra;
76378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                    }
76478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                }
765a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen                result = mITts.playSilence(mPackageName, durationInMs, queueMode, mCachedParams);
766f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen            } catch (RemoteException e) {
767f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                // TTS died; restart it.
768630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - playSilence", "RemoteException");
769630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
770f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                mStarted = false;
771f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                initTts();
772f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen            } catch (NullPointerException e) {
773f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                // TTS died; restart it.
774630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - playSilence", "NullPointerException");
775630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
776f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                mStarted = false;
777f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                initTts();
778f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen            } catch (IllegalStateException e) {
779f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                // TTS died; restart it.
780630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - playSilence", "IllegalStateException");
781630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
782f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                mStarted = false;
783f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen                initTts();
784c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
785c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen              return result;
786f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen            }
787f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen        }
788a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi    }
789e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
790e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
791e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
792e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * Returns whether or not the TTS is busy speaking.
793e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
794e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @return Whether or not the TTS is busy speaking.
795e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
796e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    public boolean isSpeaking() {
79791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
79891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
799e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                return false;
800e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
801e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
80291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                return mITts.isSpeaking();
803e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (RemoteException e) {
804e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
805630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - isSpeaking", "RemoteException");
806630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
80791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
808e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
809e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (NullPointerException e) {
810e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
811630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - isSpeaking", "NullPointerException");
812630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
81391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
814e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
815e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (IllegalStateException e) {
816e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
817630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - isSpeaking", "IllegalStateException");
818630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
81991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
820e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
821e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
822e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            return false;
823e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
824e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
825e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
826e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
827e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
828e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * Stops speech from the TTS.
8295c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
830ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
831e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
8325c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int stop() {
83391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
834ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
83591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
836c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
837e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
838e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
839a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen                result = mITts.stop(mPackageName);
840e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (RemoteException e) {
841e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
842630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - stop", "RemoteException");
843630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
84491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
845e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
846e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (NullPointerException e) {
847e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
848630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - stop", "NullPointerException");
849630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
85091bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
851e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
852e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (IllegalStateException e) {
853e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
854630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - stop", "IllegalStateException");
855630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
85691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
857e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
858c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
859c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen              return result;
860e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
861e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
862e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
863e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
864e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
865e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
866e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * Sets the speech rate for the TTS engine.
867e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
868e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * Note that the speech rate is not universally supported by all engines and
869e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * will be treated as a hint. The TTS library will try to use the specified
870e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * speech rate, but there is no guarantee.
871679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     * This has no effect on any pre-recorded speech.
872e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
873e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param speechRate
874679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     *            The speech rate for the TTS engine. 1 is the normal speed,
875679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     *            lower values slow down the speech (0.5 is half the normal speech rate),
876679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     *            greater values accelerate it (2 is twice the normal speech rate).
8775c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
878ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
879e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
8805c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int setSpeechRate(float speechRate) {
88191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
882ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
88391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
884c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
885e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
886e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
887679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi                if (speechRate > 0) {
888da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi                    int rate = (int)(speechRate*100);
889ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                    mCachedParams[Engine.PARAM_POSITION_RATE + 1] = String.valueOf(rate);
8905e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi                    // the rate is not set here, instead it is cached so it will be associated
8915e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi                    // with all upcoming utterances.
8925e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi                    if (speechRate > 0.0f) {
893ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        result = SUCCESS;
8945e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi                    } else {
895ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        result = ERROR;
8965e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi                    }
897679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi                }
898630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (NullPointerException e) {
899630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
900630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - setSpeechRate", "NullPointerException");
901630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
902630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
903630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
904630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (IllegalStateException e) {
905630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
906630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - setSpeechRate", "IllegalStateException");
907630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
90891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
909e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
910c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
911c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen              return result;
912e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
913e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
914e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
915e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
916e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
917e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
9182ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     * Sets the speech pitch for the TTS engine.
9192ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     *
9202ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     * Note that the pitch is not universally supported by all engines and
9212ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     * will be treated as a hint. The TTS library will try to use the specified
9222ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     * pitch, but there is no guarantee.
9232ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     * This has no effect on any pre-recorded speech.
9242ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     *
9252ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     * @param pitch
9262ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     *            The pitch for the TTS engine. 1 is the normal pitch,
9272ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     *            lower values lower the tone of the synthesized voice,
9282ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     *            greater values increase it.
9295c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
930ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
9312ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi     */
9325c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int setPitch(float pitch) {
9332ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi        synchronized (mStartLock) {
934ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
9352ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi            if (!mStarted) {
936c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
9372ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi            }
9382ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi            try {
9392ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi                if (pitch > 0) {
940a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen                    result = mITts.setPitch(mPackageName, (int)(pitch*100));
9412ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi                }
9422ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi            } catch (RemoteException e) {
9432ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi                // TTS died; restart it.
944630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - setPitch", "RemoteException");
945630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
946630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
947630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
948630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (NullPointerException e) {
949630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
950630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - setPitch", "NullPointerException");
951630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
952630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
953630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
954630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (IllegalStateException e) {
955630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
956630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - setPitch", "IllegalStateException");
957630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
9582ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi                mStarted = false;
9592ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi                initTts();
960c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
961c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen              return result;
9622ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi            }
9632ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi        }
9642ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi    }
9652ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi
9662ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi
9672ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi    /**
968e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * Sets the language for the TTS engine.
969e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
970e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * Note that the language is not universally supported by all engines and
971e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * will be treated as a hint. The TTS library will try to use the specified
972679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     * language as represented by the Locale, but there is no guarantee.
973e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
974679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     * @param loc
975679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi     *            The locale describing the language to be used.
9765c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
977ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return code indicating the support status for the locale. See {@link #LANG_AVAILABLE},
978ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     *         {@link #LANG_COUNTRY_AVAILABLE}, {@link #LANG_COUNTRY_VAR_AVAILABLE},
979ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     *         {@link #LANG_MISSING_DATA} and {@link #LANG_NOT_SUPPORTED}.
980e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
9815c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int setLanguage(Locale loc) {
98291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
983ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = LANG_NOT_SUPPORTED;
98491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
985c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
986e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
987e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
988ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1] = loc.getISO3Language();
989ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = loc.getISO3Country();
990ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = loc.getVariant();
9919c53a5c01f7d9e2ffe93cc7ca03cac9c71968484Jean-Michel Trivi                // the language is not set here, instead it is cached so it will be associated
9929c53a5c01f7d9e2ffe93cc7ca03cac9c71968484Jean-Michel Trivi                // with all upcoming utterances. But we still need to report the language support,
9939c53a5c01f7d9e2ffe93cc7ca03cac9c71968484Jean-Michel Trivi                // which is achieved by calling isLanguageAvailable()
9949c53a5c01f7d9e2ffe93cc7ca03cac9c71968484Jean-Michel Trivi                result = mITts.isLanguageAvailable(
995ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1],
996ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1],
997ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] );
998748efcc3fb1b369690ab4617a04f452b1832edf4Charles Chen            } catch (RemoteException e) {
999e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
1000630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - setLanguage", "RemoteException");
1001630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1002630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
1003630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
1004630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (NullPointerException e) {
1005630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
1006630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - setLanguage", "NullPointerException");
1007630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1008630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
1009630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
1010630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (IllegalStateException e) {
1011630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
1012630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - setLanguage", "IllegalStateException");
1013630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
101491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
1015e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
1016c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
1017c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen              return result;
1018e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
1019e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
1020e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
1021e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
10225c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen
1023aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    /**
1024ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi     * Returns a Locale instance describing the language currently being used by the TTS engine.
1025ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi     * @return language, country (if any) and variant (if any) used by the engine stored in a Locale
1026ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi     *     instance, or null is the TTS engine has failed.
1027ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi     */
1028ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi    public Locale getLanguage() {
1029ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi        synchronized (mStartLock) {
1030ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            if (!mStarted) {
1031ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                return null;
1032ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            }
1033ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            try {
1034ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                String[] locStrings =  mITts.getLanguage();
1035ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                if (locStrings.length == 3) {
1036ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                    return new Locale(locStrings[0], locStrings[1], locStrings[2]);
1037ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                } else {
1038ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                    return null;
1039ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                }
1040ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            } catch (RemoteException e) {
1041ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                // TTS died; restart it.
1042630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - getLanguage", "RemoteException");
1043630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1044630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
1045630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
1046630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (NullPointerException e) {
1047630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
1048630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - getLanguage", "NullPointerException");
1049630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1050630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
1051630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
1052630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (IllegalStateException e) {
1053630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
1054630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - getLanguage", "IllegalStateException");
1055630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1056ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                mStarted = false;
1057ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                initTts();
1058ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            }
1059ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            return null;
1060ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi        }
1061ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi    }
1062ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi
1063ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi    /**
1064ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi     * Checks if the specified language as represented by the Locale is available.
1065aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     *
1066aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     * @param loc
1067ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi     *            The Locale describing the language to be used.
10685c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
1069ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return code indicating the support status for the locale. See {@link #LANG_AVAILABLE},
1070ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     *         {@link #LANG_COUNTRY_AVAILABLE}, {@link #LANG_COUNTRY_VAR_AVAILABLE},
1071ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     *         {@link #LANG_MISSING_DATA} and {@link #LANG_NOT_SUPPORTED}.
1072aaf842edbfe76990413d4c002acb394f855321b5Charles Chen     */
1073aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    public int isLanguageAvailable(Locale loc) {
1074ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi        synchronized (mStartLock) {
1075ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = LANG_NOT_SUPPORTED;
1076ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            if (!mStarted) {
1077c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
1078ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            }
1079ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            try {
1080c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                result = mITts.isLanguageAvailable(loc.getISO3Language(),
1081c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                        loc.getISO3Country(), loc.getVariant());
1082ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            } catch (RemoteException e) {
1083ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                // TTS died; restart it.
1084630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - isLanguageAvailable", "RemoteException");
1085630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1086630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
1087630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
1088630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (NullPointerException e) {
1089630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
1090630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - isLanguageAvailable", "NullPointerException");
1091630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1092630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                mStarted = false;
1093630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                initTts();
1094630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen            } catch (IllegalStateException e) {
1095630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                // TTS died; restart it.
1096630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - isLanguageAvailable", "IllegalStateException");
1097630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
1098ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                mStarted = false;
1099ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi                initTts();
1100c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
1101c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen              return result;
1102ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi            }
1103ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi        }
1104aaf842edbfe76990413d4c002acb394f855321b5Charles Chen    }
1105aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
1106aaf842edbfe76990413d4c002acb394f855321b5Charles Chen
1107e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    /**
1108d4989093ed708ddf9c799655ea0af7afda726426Charles Chen     * Synthesizes the given text to a file using the specified parameters.
1109e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *
1110e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param text
1111e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            The String of text that should be synthesized
1112e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param params
1113a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi     *            A hashmap of parameters.
1114e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     * @param filename
1115e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            The string that gives the full output filename; it should be
1116e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     *            something like "/sdcard/myappsounds/mysound.wav".
11175c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen     *
1118ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
1119e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi     */
11205c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen    public int synthesizeToFile(String text, HashMap<String,String> params,
1121e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            String filename) {
112291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi        synchronized (mStartLock) {
1123ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
112491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi            if (!mStarted) {
1125c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen                return result;
1126e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
1127e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            try {
1128630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                if ((params != null) && (!params.isEmpty())) {
1129630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                    // no need to read the stream type here
1130ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                    String extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID);
1131630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                    if (extra != null) {
1132ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                        mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra;
1133630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                    }
1134a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                }
1135a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                if (mITts.synthesizeToFile(mPackageName, text, mCachedParams, filename)){
1136ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                    result = SUCCESS;
11375c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen                }
1138e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (RemoteException e) {
1139e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
1140630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - synthesizeToFile", "RemoteException");
1141630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
114291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
1143e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
1144e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (NullPointerException e) {
1145e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
1146630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - synthesizeToFile", "NullPointerException");
1147630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
114891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
1149e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
1150e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            } catch (IllegalStateException e) {
1151e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                // TTS died; restart it.
1152630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                Log.e("TextToSpeech.java - synthesizeToFile", "IllegalStateException");
1153630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen                e.printStackTrace();
115491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi                mStarted = false;
1155e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi                initTts();
1156c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen            } finally {
1157a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                resetCachedParams();
1158a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi                return result;
1159e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi            }
1160e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi        }
1161e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi    }
1162e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi
1163a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi
1164a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi    /**
1165a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi     * Convenience method to reset the cached parameters to the current default values
1166a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi     * if they are not persistent between calls to the service.
1167a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi     */
1168a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi    private void resetCachedParams() {
1169ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_STREAM + 1] =
1170ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi                String.valueOf(Engine.DEFAULT_STREAM);
1171ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi        mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID+ 1] = "";
1172a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi    }
1173a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi
117478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen    /**
117578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     * Sets the OnUtteranceCompletedListener that will fire when an utterance completes.
117678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     *
117778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     * @param listener
117878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     *            The OnUtteranceCompletedListener
117978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     *
1180ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi     * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}.
118178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen     */
118278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen    public int setOnUtteranceCompletedListener(
118378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            final OnUtteranceCompletedListener listener) {
118478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen        synchronized (mStartLock) {
1185ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi            int result = ERROR;
118678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            if (!mStarted) {
118778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                return result;
118878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            }
118978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            mITtscallback = new ITtsCallback.Stub() {
119078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                public void utteranceCompleted(String utteranceId) throws RemoteException {
119178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                    if (listener != null) {
119278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                        listener.onUtteranceCompleted(utteranceId);
119378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                    }
119478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                }
119578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            };
119678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            try {
119778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                result = mITts.registerCallback(mPackageName, mITtscallback);
119878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            } catch (RemoteException e) {
119978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                // TTS died; restart it.
120078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                Log.e("TextToSpeech.java - registerCallback", "RemoteException");
120178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                e.printStackTrace();
120278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                mStarted = false;
120378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                initTts();
120478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            } catch (NullPointerException e) {
120578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                // TTS died; restart it.
120678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                Log.e("TextToSpeech.java - registerCallback", "NullPointerException");
120778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                e.printStackTrace();
120878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                mStarted = false;
120978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                initTts();
121078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            } catch (IllegalStateException e) {
121178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                // TTS died; restart it.
121278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                Log.e("TextToSpeech.java - registerCallback", "IllegalStateException");
121378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                e.printStackTrace();
121478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                mStarted = false;
121578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                initTts();
121678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            } finally {
121778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen                return result;
121878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen            }
121978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen        }
122078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen    }
122178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen
1222e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi}
1223