1700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi/* 2700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * Copyright (C) 2009 Google Inc. 3700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * 4700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * use this file except in compliance with the License. You may obtain a copy of 6700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * the License at 7700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * 8700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * 10700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * License for the specific language governing permissions and limitations under 14700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * the License. 15700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi */ 16700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivipackage android.tts; 17700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 189440bce8553a82e420e06ded3fcccc6971d1ff79Jean-Michel Triviimport android.media.AudioManager; 199440bce8553a82e420e06ded3fcccc6971d1ff79Jean-Michel Triviimport android.media.AudioSystem; 20700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Triviimport android.util.Log; 21700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Triviimport java.lang.ref.WeakReference; 22700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 23700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi/** 24700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * @hide 25700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * 26700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * The SpeechSynthesis class provides a high-level api to create and play 27700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * synthesized speech. This class is used internally to talk to a native 28700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * TTS library that implements the interface defined in 29700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * frameworks/base/include/tts/TtsEngine.h 30700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * 31700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi */ 32700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi@SuppressWarnings("unused") 33700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivipublic class SynthProxy { 34700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 350320f8bdfbaa733ff9d702f30417315830a162daJean-Michel Trivi // Default parameters of a filter to be applied when using the Pico engine. 360320f8bdfbaa733ff9d702f30417315830a162daJean-Michel Trivi // Such a huge filter gain is justified by how much energy in the low frequencies is "wasted" at 370320f8bdfbaa733ff9d702f30417315830a162daJean-Michel Trivi // the output of the synthesis. The low shelving filter removes it, leaving room for 380320f8bdfbaa733ff9d702f30417315830a162daJean-Michel Trivi // amplification. 391105f0f2739953b707b63a72179da09b324741a2Jean-Michel Trivi private final static float PICO_FILTER_GAIN = 5.0f; // linear gain 401105f0f2739953b707b63a72179da09b324741a2Jean-Michel Trivi private final static float PICO_FILTER_LOWSHELF_ATTENUATION = -18.0f; // in dB 411105f0f2739953b707b63a72179da09b324741a2Jean-Michel Trivi private final static float PICO_FILTER_TRANSITION_FREQ = 1100.0f; // in Hz 420320f8bdfbaa733ff9d702f30417315830a162daJean-Michel Trivi private final static float PICO_FILTER_SHELF_SLOPE = 1.0f; // Q 430320f8bdfbaa733ff9d702f30417315830a162daJean-Michel Trivi 44700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi // 45700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi // External API 46700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi // 47700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 48700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi /** 49700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * Constructor; pass the location of the native TTS .so to use. 50700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi */ 5176dd788a6eed08d537d9deb16e656b74e49b1e5aJean-Michel Trivi public SynthProxy(String nativeSoLib, String engineConfig) { 520320f8bdfbaa733ff9d702f30417315830a162daJean-Michel Trivi boolean applyFilter = nativeSoLib.toLowerCase().contains("pico"); 53c6120193efebf426186b24520d70ec3e4a4aeadfJean-Michel Trivi Log.v(TtsService.SERVICE_TAG, "About to load "+ nativeSoLib + ", applyFilter="+applyFilter); 54900e0d095442d7111e77a2f2e9467a39b164bb73Jean-Michel Trivi native_setup(new WeakReference<SynthProxy>(this), nativeSoLib, engineConfig); 550320f8bdfbaa733ff9d702f30417315830a162daJean-Michel Trivi native_setLowShelf(applyFilter, PICO_FILTER_GAIN, PICO_FILTER_LOWSHELF_ATTENUATION, 560320f8bdfbaa733ff9d702f30417315830a162daJean-Michel Trivi PICO_FILTER_TRANSITION_FREQ, PICO_FILTER_SHELF_SLOPE); 57700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi } 58700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 59700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi /** 60700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * Stops and clears the AudioTrack. 61700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi */ 62a3f89295ad4c7bd65a25144d2be1d45ea0acf87fCharles Chen public int stop() { 63a3f89295ad4c7bd65a25144d2be1d45ea0acf87fCharles Chen return native_stop(mJniData); 64700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi } 65700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 66700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi /** 6709f8db7ad3963f5fa15f2b99880b2f70e89c30aeJean-Michel Trivi * Synchronous stop of the synthesizer. This method returns when the synth 6809f8db7ad3963f5fa15f2b99880b2f70e89c30aeJean-Michel Trivi * has completed the stop procedure and doesn't use any of the resources it 6909f8db7ad3963f5fa15f2b99880b2f70e89c30aeJean-Michel Trivi * was using while synthesizing. 7009f8db7ad3963f5fa15f2b99880b2f70e89c30aeJean-Michel Trivi * 7109f8db7ad3963f5fa15f2b99880b2f70e89c30aeJean-Michel Trivi * @return {@link android.speech.tts.TextToSpeech.SUCCESS} or 7209f8db7ad3963f5fa15f2b99880b2f70e89c30aeJean-Michel Trivi * {@link android.speech.tts.TextToSpeech.ERROR} 7309f8db7ad3963f5fa15f2b99880b2f70e89c30aeJean-Michel Trivi */ 7409f8db7ad3963f5fa15f2b99880b2f70e89c30aeJean-Michel Trivi public int stopSync() { 7509f8db7ad3963f5fa15f2b99880b2f70e89c30aeJean-Michel Trivi return native_stopSync(mJniData); 7609f8db7ad3963f5fa15f2b99880b2f70e89c30aeJean-Michel Trivi } 7709f8db7ad3963f5fa15f2b99880b2f70e89c30aeJean-Michel Trivi 7809f8db7ad3963f5fa15f2b99880b2f70e89c30aeJean-Michel Trivi /** 79700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * Synthesize speech and speak it directly using AudioTrack. 80700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi */ 819440bce8553a82e420e06ded3fcccc6971d1ff79Jean-Michel Trivi public int speak(String text, int streamType) { 829440bce8553a82e420e06ded3fcccc6971d1ff79Jean-Michel Trivi if ((streamType > -1) && (streamType < AudioSystem.getNumStreamTypes())) { 839440bce8553a82e420e06ded3fcccc6971d1ff79Jean-Michel Trivi return native_speak(mJniData, text, streamType); 849440bce8553a82e420e06ded3fcccc6971d1ff79Jean-Michel Trivi } else { 859440bce8553a82e420e06ded3fcccc6971d1ff79Jean-Michel Trivi Log.e("SynthProxy", "Trying to speak with invalid stream type " + streamType); 869440bce8553a82e420e06ded3fcccc6971d1ff79Jean-Michel Trivi return native_speak(mJniData, text, AudioManager.STREAM_MUSIC); 879440bce8553a82e420e06ded3fcccc6971d1ff79Jean-Michel Trivi } 88700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi } 89700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 90700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi /** 91700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * Synthesize speech to a file. The current implementation writes a valid 92700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * WAV file to the given path, assuming it is writable. Something like 93700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * "/sdcard/???.wav" is recommended. 94700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi */ 95a3f89295ad4c7bd65a25144d2be1d45ea0acf87fCharles Chen public int synthesizeToFile(String text, String filename) { 96a3f89295ad4c7bd65a25144d2be1d45ea0acf87fCharles Chen return native_synthesizeToFile(mJniData, text, filename); 97700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi } 98700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 99700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi /** 100bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi * Queries for language support. 101bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi * Return codes are defined in android.speech.tts.TextToSpeech 102bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi */ 103bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi public int isLanguageAvailable(String language, String country, String variant) { 104bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi return native_isLanguageAvailable(mJniData, language, country, variant); 105bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi } 106bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi 107bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi /** 108900e0d095442d7111e77a2f2e9467a39b164bb73Jean-Michel Trivi * Updates the engine configuration. 10976dd788a6eed08d537d9deb16e656b74e49b1e5aJean-Michel Trivi */ 11076dd788a6eed08d537d9deb16e656b74e49b1e5aJean-Michel Trivi public int setConfig(String engineConfig) { 11154a3dcdbef2361670def6db94b7f89166fe2c41eJean-Michel Trivi return native_setConfig(mJniData, engineConfig); 11276dd788a6eed08d537d9deb16e656b74e49b1e5aJean-Michel Trivi } 11376dd788a6eed08d537d9deb16e656b74e49b1e5aJean-Michel Trivi 11476dd788a6eed08d537d9deb16e656b74e49b1e5aJean-Michel Trivi /** 115bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi * Sets the language. 116700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi */ 117a3f89295ad4c7bd65a25144d2be1d45ea0acf87fCharles Chen public int setLanguage(String language, String country, String variant) { 118a3f89295ad4c7bd65a25144d2be1d45ea0acf87fCharles Chen return native_setLanguage(mJniData, language, country, variant); 119700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi } 120bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi 121d6d03e05bed76a49b8badda98e471bf36304b6efJean-Michel Trivi /** 122d6d03e05bed76a49b8badda98e471bf36304b6efJean-Michel Trivi * Loads the language: it's not set, but prepared for use later. 123d6d03e05bed76a49b8badda98e471bf36304b6efJean-Michel Trivi */ 124a3f89295ad4c7bd65a25144d2be1d45ea0acf87fCharles Chen public int loadLanguage(String language, String country, String variant) { 125a3f89295ad4c7bd65a25144d2be1d45ea0acf87fCharles Chen return native_loadLanguage(mJniData, language, country, variant); 126d6d03e05bed76a49b8badda98e471bf36304b6efJean-Michel Trivi } 127700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 128700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi /** 129bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi * Sets the speech rate. 130700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi */ 131a3f89295ad4c7bd65a25144d2be1d45ea0acf87fCharles Chen public final int setSpeechRate(int speechRate) { 132a3f89295ad4c7bd65a25144d2be1d45ea0acf87fCharles Chen return native_setSpeechRate(mJniData, speechRate); 133700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi } 134700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 1352ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi /** 136bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi * Sets the pitch of the synthesized voice. 1372ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi */ 138a3f89295ad4c7bd65a25144d2be1d45ea0acf87fCharles Chen public final int setPitch(int pitch) { 139a3f89295ad4c7bd65a25144d2be1d45ea0acf87fCharles Chen return native_setPitch(mJniData, pitch); 1402ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi } 141700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 142700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi /** 143bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi * Returns the currently set language, country and variant information. 144700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi */ 145bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi public String[] getLanguage() { 146700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi return native_getLanguage(mJniData); 147700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi } 148700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 149700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi /** 150bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi * Gets the currently set rate. 151700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi */ 152700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi public int getRate() { 153700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi return native_getRate(mJniData); 154700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi } 155700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 156700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi /** 157bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi * Shuts down the native synthesizer. 158700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi */ 159700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi public void shutdown() { 160700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi native_shutdown(mJniData); 161700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi } 162700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 163700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi // 164700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi // Internal 165700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi // 166700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 167700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi protected void finalize() { 168700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi native_finalize(mJniData); 169700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi mJniData = 0; 170700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi } 171700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 172700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi static { 1731f4b92a2d6bd62c07554f627c3a2926e1e088b7aJean-Michel Trivi System.loadLibrary("ttssynthproxy"); 174700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi } 175700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 176700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi private final static String TAG = "SynthProxy"; 177700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 178700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi /** 179700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * Accessed by native methods 180700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi */ 181700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi private int mJniData = 0; 182700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 183900e0d095442d7111e77a2f2e9467a39b164bb73Jean-Michel Trivi private native final int native_setup(Object weak_this, String nativeSoLib, 184900e0d095442d7111e77a2f2e9467a39b164bb73Jean-Michel Trivi String engineConfig); 1850320f8bdfbaa733ff9d702f30417315830a162daJean-Michel Trivi 1860320f8bdfbaa733ff9d702f30417315830a162daJean-Michel Trivi private native final int native_setLowShelf(boolean applyFilter, float filterGain, 1870320f8bdfbaa733ff9d702f30417315830a162daJean-Michel Trivi float attenuationInDb, float freqInHz, float slope); 188700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 189700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi private native final void native_finalize(int jniData); 190700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 19135b86c273ac69bde967d0828c1683c71f0de530aCharles Chen private native final int native_stop(int jniData); 192700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 19309f8db7ad3963f5fa15f2b99880b2f70e89c30aeJean-Michel Trivi private native final int native_stopSync(int jniData); 19409f8db7ad3963f5fa15f2b99880b2f70e89c30aeJean-Michel Trivi 1959440bce8553a82e420e06ded3fcccc6971d1ff79Jean-Michel Trivi private native final int native_speak(int jniData, String text, int streamType); 196700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 19735b86c273ac69bde967d0828c1683c71f0de530aCharles Chen private native final int native_synthesizeToFile(int jniData, String text, String filename); 198700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 199bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi private native final int native_isLanguageAvailable(int jniData, String language, 200bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi String country, String variant); 201bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi 20235b86c273ac69bde967d0828c1683c71f0de530aCharles Chen private native final int native_setLanguage(int jniData, String language, String country, 203679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi String variant); 204bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi 20535b86c273ac69bde967d0828c1683c71f0de530aCharles Chen private native final int native_loadLanguage(int jniData, String language, String country, 206d6d03e05bed76a49b8badda98e471bf36304b6efJean-Michel Trivi String variant); 207700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 20854a3dcdbef2361670def6db94b7f89166fe2c41eJean-Michel Trivi private native final int native_setConfig(int jniData, String engineConfig); 209900e0d095442d7111e77a2f2e9467a39b164bb73Jean-Michel Trivi 21035b86c273ac69bde967d0828c1683c71f0de530aCharles Chen private native final int native_setSpeechRate(int jniData, int speechRate); 211bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi 21235b86c273ac69bde967d0828c1683c71f0de530aCharles Chen private native final int native_setPitch(int jniData, int speechRate); 213700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 214bee1c7e6a4ea5c7f00852f0758a4be968a980d20Jean-Michel Trivi private native final String[] native_getLanguage(int jniData); 215700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 216700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi private native final int native_getRate(int jniData); 217700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 218700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi private native final void native_shutdown(int jniData); 219700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 220700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 221700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi /** 222700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi * Callback from the C layer 223700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi */ 224700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi @SuppressWarnings("unused") 225700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi private static void postNativeSpeechSynthesizedInJava(Object tts_ref, 226700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi int bufferPointer, int bufferSize) { 227700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 228700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi Log.i("TTS plugin debug", "bufferPointer: " + bufferPointer 229700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi + " bufferSize: " + bufferSize); 230700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi 231700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi SynthProxy nativeTTS = (SynthProxy)((WeakReference)tts_ref).get(); 232700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi // TODO notify TTS service of synthesis/playback completion, 233700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi // method definition to be changed. 234700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi } 235700ec6568cdd788cac1bcccb77a817e822125f2fJean-Michel Trivi} 236