void _voiceSpinner_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e) { EngInt ei = _eli[e.Position]; _selectedEngine = ei.El; _selectedVoice = ei.Pos; #pragma warning disable 4014 TestVoice(_selectedEngine.Name(), _selectedEngine.Voices[_selectedVoice]); #pragma warning restore 4014 }
public void onInit(int status) { if (myEngineIndex < allEngines.size()) { if (status == TextToSpeech.SUCCESS) { // Ask a TTS engine which voices it currently has installed EngLang el = allEngines.get(myEngineIndex); Intent in = new Intent(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); in = in.setPackage(el.ei.name); // set engine package name try { startActivityForResult(in, LANG_REQUEST); // goes to onActivityResult() // DISRUPTION 2: we can’t continue here, must wait for onActivityResult()… } catch (Exception e) { // ActivityNotFoundException, also got SecurityException from com.turboled if (myTts != null) try { myTts.shutdown(); } catch (Exception ee) {} if (++myEngineIndex < allEngines.size()) { // If our loop was not finished and exception happened with one engine, // we need this call here to continue looping… myTts = new TextToSpeech(AndyUtil.getAppContext(), ttsInit, allEngines.get(myEngineIndex).name()); } else { completeSetup(); } } } } else
public EngInt(EngLang el, int pos) { El = el; Pos = pos; }
private void langSpinner_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e) { // fill voices String lang = _langCodes[e.Position].Code; var voices = new List <String>(); _eli = new List <EngInt>(); String initVoice = Intent.GetStringExtra(INIT_LANG); String initLangIso3 = null; if (initVoice != null) { initVoice = initVoice.ToLower(); initLangIso3 = new Locale(initVoice).ISO3Language.ToLower(); } String initEngine = Intent.GetStringExtra(INIT_ENGINE); int selPos = -1, selQual = -1, maxQual = -100, n = 0; foreach (EngLang el in _allEngines) { String ttsEngName = el.Label().Replace(" TTS", ""); bool useThis = initVoice != null && initEngine != null && initEngine == el.Name(); for (int i = 0; i < el.Voices.Count; i++) { if (lang == el.Iso3ln[i]) { Locale loc = LangSupport.LocaleFromString(el.Voices[i]); String locStr = loc.ToString().ToLower().Replace('_', '-'); if (useThis && locStr == initVoice) { selPos = n; useThis = false; initVoice = null; // to stop looking for more } if (maxQual < el.Quality) { maxQual = el.Quality; selQual = n; } String country = loc.GetDisplayCountry(loc); String variant = loc.Variant; String s = ttsEngName; if ("" != country) { s += ", " + country; } if ("" != variant) { s += ", " + variant; } voices.Add(s); _eli.Add(new EngInt(el, i)); n++; } } } var adapter = new ArrayAdapter <String>(this, Android.Resource.Layout.SimpleSpinnerItem, voices); adapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem); _voiceSpinner.Adapter = adapter; if (selPos < 0) { selPos = selQual; } if (selPos > -1) { _selectedEngine = _eli[selPos].El; _selectedVoice = _eli[selPos].Pos; bool autoSel = (Intent != null && Intent.GetBooleanExtra(INIT_AUTOSEL, false)) ? true : false; if (autoSel && _selectedEngine != null && _selectedVoice > -1) { if (initLangIso3 == _selectedEngine.Iso3ln[_selectedVoice]) { UseSelected(); return; } else { Intent.PutExtra(SELECTED_VOICE, initLangIso3 + "_n/a"); SetResult(Result.Ok, Intent); Finish(); return; } } _voiceSpinner.SetSelection(selPos); // fix this, use previous selection or best quality... } }
private async void GetEnginesAndLangsAsync() { _tts = new TextToSpeech(this, null); IList <TextToSpeech.EngineInfo> engines = _tts.Engines; try { _tts.Shutdown(); } catch { /* don't care */ } foreach (TextToSpeech.EngineInfo ei in engines) { Log.Debug(TAG, "Trying to create TTS Engine: " + ei.Name); Log.Debug(TAG, "in GetEnginesAndLangsAsync() before await for CreateTtsAsync(), Thread: " + System.Threading.Thread.CurrentThread.ManagedThreadId); _tts = await CreateTtsAsync(this, ei.Name); // DISRUPTION 1 from Java code eliminated, we simply await TTS engine initialization here. if (_tts != null) { var el = new EngLang(ei); _allEngines.Add(el); Log.Debug(TAG, "Engine: " + ei.Name + " initialized correctly."); var intent = new Intent(TextToSpeech.Engine.ActionCheckTtsData); intent = intent.SetPackage(el.Ei.Name); Intent data = await StartActivityForResultAsync(intent, LANG_REQUEST); // DISTRUPTION 2 from Java code eliminated, we simply await until the result returns. try { // don't care if lastData or voices comes out null, just catch exception and continue IList <String> voices = data.GetStringArrayListExtra(TextToSpeech.Engine.ExtraAvailableVoices); Log.Debug(TAG, "Listing voices for " + el.Name() + " (" + el.Label() + "):"); foreach (String s in voices) { el.AddVoice(s); Log.Debug(TAG, "- " + s); } } catch (Exception e) { Log.Debug(TAG, "Engine " + el.Name() + " listing voices exception: " + e); } try { _tts.Shutdown(); } catch { /* don't care */ } _tts = null; } } FindViewById(Resource.Id.wait).Visibility = ViewStates.Gone; FindViewById(Resource.Id.main).Visibility = ViewStates.Visible; _voiceSpinner = (Spinner)FindViewById(Resource.Id.voices); _voiceSpinner.ItemSelected += _voiceSpinner_ItemSelected; // Complete setup var languages = new List <String>(); String initLang = Intent.GetStringExtra(INIT_LANG); initLang = initLang != null ? new Locale(initLang).ISO3Language : Locale.Default.ISO3Language; foreach (EngLang el in _allEngines) { foreach (String v in el.Voices) { String lang = v; int i = lang.IndexOf('-'); if (i > 0) { lang = lang.Substring(0, i); } var loc = new Locale(lang); lang = loc.ISO3Language.ToLower(); if (lang.Length != 3) { continue; } bool doAdd = true; foreach (LangCodeName lcn in _langCodes) { if (lcn.Code != lang) { continue; } doAdd = false; break; } if (doAdd) { _langCodes.Add(new LangCodeName(lang)); } } } _langCodes.Sort(); int selPos = -1; for (int i = 0; i < _langCodes.Count; i++) { languages.Add(_langCodes[i].Name); if (_langCodes[i].Code.Equals(initLang)) { selPos = i; } } var adapter = new ArrayAdapter <String>(this, Android.Resource.Layout.SimpleSpinnerItem, languages); adapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem); var langSpinner = (Spinner)FindViewById(Resource.Id.languages); langSpinner.Adapter = adapter; if (selPos > -1) { langSpinner.SetSelection(selPos); } langSpinner.ItemSelected += langSpinner_ItemSelected; _voiceSpinner.ItemSelected += _voiceSpinner_ItemSelected; var addBtn = (Button)FindViewById(Resource.Id.add_lang_btn); addBtn.Click += addBtn_Click; var useBtn = (Button)FindViewById(Resource.Id.use_voice_btn); useBtn.Click += useBtn_Click; }