Add caching of the speech rate and language in android.speech.tts.TextToSpeech
so the speech params can be passed along in calls for text synthesis.
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index bc016a7..1502d98 100755
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -88,8 +88,6 @@
public static final int TTS_LANG_NOT_SUPPORTED = -2;
-
-
/**
* Called when the TTS has initialized.
*
@@ -101,15 +99,6 @@
}
/**
- * Called when the TTS has finished speaking by itself (speaking
- * finished without being canceled).
- *
- */
- public interface OnSpeechCompletedListener {
- public void onSpeechCompleted();
- }
-
- /**
* Internal constants for the TTS functionality
*
* {@hide}
@@ -129,6 +118,16 @@
public static final int CHECK_VOICE_DATA_BAD_DATA = -1;
public static final int CHECK_VOICE_DATA_MISSING_DATA = -2;
public static final int CHECK_VOICE_DATA_MISSING_DATA_NO_SDCARD = -3;
+
+ // keys for the parameters passed with speak commands
+ public static final String TTS_KEY_PARAM_RATE = "rate";
+ public static final String TTS_KEY_PARAM_LANGUAGE = "language";
+ public static final String TTS_KEY_PARAM_COUNTRY = "country";
+ public static final String TTS_KEY_PARAM_VARIANT = "variant";
+ public static final int TTS_PARAM_POSITION_RATE = 0;
+ public static final int TTS_PARAM_POSITION_LANGUAGE = 2;
+ public static final int TTS_PARAM_POSITION_COUNTRY = 4;
+ public static final int TTS_PARAM_POSITION_VARIANT = 6;
}
/**
@@ -141,11 +140,11 @@
private OnInitListener mInitListener = null;
private boolean mStarted = false;
private final Object mStartLock = new Object();
- private ITtsCallback mITtsCallback;
- private OnSpeechCompletedListener mSpeechCompListener = null;
- private final Object mSpeechCompListenerLock = new Object();
-
-
+ private int mCachedRate = Engine.FALLBACK_TTS_DEFAULT_RATE;
+ private String mCachedLang = Engine.FALLBACK_TTS_DEFAULT_LANG;
+ private String mCachedCountry = Engine.FALLBACK_TTS_DEFAULT_COUNTRY;
+ private String mCachedVariant = Engine.FALLBACK_TTS_DEFAULT_VARIANT;
+ private String[] mCachedParams;
/**
* The constructor for the TTS.
@@ -159,14 +158,23 @@
public TextToSpeech(Context context, OnInitListener listener) {
mContext = context;
mInitListener = listener;
+
+ mCachedParams = new String[2*4]; //4 parameters, store key and value
+ mCachedParams[Engine.TTS_PARAM_POSITION_RATE] = Engine.TTS_KEY_PARAM_RATE;
+ mCachedParams[Engine.TTS_PARAM_POSITION_LANGUAGE] = Engine.TTS_KEY_PARAM_LANGUAGE;
+ mCachedParams[Engine.TTS_PARAM_POSITION_COUNTRY] = Engine.TTS_KEY_PARAM_COUNTRY;
+ mCachedParams[Engine.TTS_PARAM_POSITION_VARIANT] = Engine.TTS_KEY_PARAM_VARIANT;
+ updateCachedParamArray();
+
initTts();
}
- public void setOnSpeechCompletedListener(final OnSpeechCompletedListener listener) {
- synchronized(mSpeechCompListenerLock) {
- mSpeechCompListener = listener;
- }
+ private void updateCachedParamArray() {
+ mCachedParams[Engine.TTS_PARAM_POSITION_RATE+1] = String.valueOf(mCachedRate);
+ mCachedParams[Engine.TTS_PARAM_POSITION_LANGUAGE+1] = mCachedLang;
+ mCachedParams[Engine.TTS_PARAM_POSITION_COUNTRY+1] = mCachedCountry;
+ mCachedParams[Engine.TTS_PARAM_POSITION_VARIANT+1] = mCachedVariant;
}
@@ -178,34 +186,7 @@
public void onServiceConnected(ComponentName name, IBinder service) {
synchronized(mStartLock) {
mITts = ITts.Stub.asInterface(service);
- try {
- mITtsCallback = new ITtsCallback.Stub() {
- public void markReached(String mark)
- throws RemoteException {
- // call the listener of that event, but not
- // while locked.
- OnSpeechCompletedListener listener = null;
- synchronized(mSpeechCompListenerLock) {
- listener = mSpeechCompListener;
- }
- if (listener != null) {
- listener.onSpeechCompleted();
- }
- }
- };
- mITts.registerCallback(mITtsCallback);
-
- } catch (RemoteException e) {
- initTts();
- return;
- }
-
mStarted = true;
- // The callback can become null if the Android OS decides to
- // restart the TTS process as well as whatever is using it.
- // In such cases, do nothing - the error handling from the
- // speaking calls will kick in and force a proper restart of
- // the TTS.
if (mInitListener != null) {
// TODO manage failures and missing resources
mInitListener.onInit(TTS_SUCCESS);
@@ -352,8 +333,8 @@
return;
}
try {
- // TODO support extra parameters, passing null for the moment
- mITts.speak(text, queueMode, null);
+ // TODO support extra parameters, passing cache of current parameters for the moment
+ mITts.speak(text, queueMode, mCachedParams);
} catch (RemoteException e) {
// TTS died; restart it.
mStarted = false;
@@ -510,7 +491,9 @@
}
try {
if (speechRate > 0) {
- mITts.setSpeechRate((int)(speechRate*100));
+ mCachedRate = (int)(speechRate*100);
+ updateCachedParamArray();
+ mITts.setSpeechRate(mCachedRate);
}
} catch (RemoteException e) {
// TTS died; restart it.
@@ -568,7 +551,11 @@
return;
}
try {
- mITts.setLanguage(loc.getISO3Language(), loc.getISO3Country(), loc.getVariant());
+ mCachedLang = loc.getISO3Language();
+ mCachedCountry = loc.getISO3Country();
+ mCachedVariant = loc.getVariant();
+ updateCachedParamArray();
+ mITts.setLanguage(mCachedLang, mCachedCountry, mCachedVariant);
} catch (RemoteException e) {
// TTS died; restart it.
mStarted = false;
@@ -582,10 +569,12 @@
*
* @param loc
* The locale describing the language to be used.
+ * @return one of TTS_LANG_NOT_SUPPORTED, TTS_LANG_MISSING_DATA, TTS_LANG_AVAILABLE,
+ TTS_LANG_COUNTRY_AVAILABLE, TTS_LANG_COUNTRY_VAR_AVAILABLE.
*/
public int isLanguageAvailable(Locale loc) {
//TODO: Implement isLanguageAvailable
- return 0;
+ return TTS_LANG_NOT_SUPPORTED;
}