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