1754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath// Copyright 2011 Google Inc. All Rights Reserved.
2754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath
3754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamathpackage android.speech.tts;
4754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath
5754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath/**
6754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * Listener for events relating to the progress of an utterance through
7754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * the synthesis queue. Each utterance is associated with a call to
8754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * {@link TextToSpeech#speak} or {@link TextToSpeech#synthesizeToFile} with an
9754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * associated utterance identifier, as per {@link TextToSpeech.Engine#KEY_PARAM_UTTERANCE_ID}.
10754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath *
11754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * The callbacks specified in this method can be called from multiple threads.
12754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath */
13754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamathpublic abstract class UtteranceProgressListener {
14754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath    /**
15754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * Called when an utterance "starts" as perceived by the caller. This will
16754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * be soon before audio is played back in the case of a {@link TextToSpeech#speak}
17754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * or before the first bytes of a file are written to storage in the case
18754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * of {@link TextToSpeech#synthesizeToFile}.
19754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     *
20754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * @param utteranceId the utterance ID of the utterance.
21754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     */
22754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath    public abstract void onStart(String utteranceId);
23754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath
24754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath    /**
25754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * Called when an utterance has successfully completed processing.
26754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * All audio will have been played back by this point for audible output, and all
27754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * output will have been written to disk for file synthesis requests.
28754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     *
29754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * This request is guaranteed to be called after {@link #onStart(String)}.
30754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     *
31754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * @param utteranceId the utterance ID of the utterance.
32754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     */
33754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath    public abstract void onDone(String utteranceId);
34754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath
35754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath    /**
36754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * Called when an error has occurred during processing. This can be called
37754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * at any point in the synthesis process. Note that there might be calls
38754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * to {@link #onStart(String)} for specified utteranceId but there will never
39754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * be a call to both {@link #onDone(String)} and {@link #onError(String)} for
40754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * the same utterance.
41754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     *
42754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * @param utteranceId the utterance ID of the utterance.
43fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak     * @deprecated Use {@link #onError(String,int)} instead
44754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     */
45fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak    @Deprecated
46754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath    public abstract void onError(String utteranceId);
47754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath
48754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath    /**
49fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak     * Called when an error has occurred during processing. This can be called
50fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak     * at any point in the synthesis process. Note that there might be calls
51fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak     * to {@link #onStart(String)} for specified utteranceId but there will never
52fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak     * be a call to both {@link #onDone(String)} and {@link #onError(String,int)} for
53fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak     * the same utterance. The default implementation calls {@link #onError(String)}.
54fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak     *
55fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak     * @param utteranceId the utterance ID of the utterance.
56fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak     * @param errorCode one of the ERROR_* codes from {@link TextToSpeech}
57fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak     */
58fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak    public void onError(String utteranceId, int errorCode) {
59fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak        onError(utteranceId);
60fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak    }
61fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak
62fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak    /**
63754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * Wraps an old deprecated OnUtteranceCompletedListener with a shiny new
64754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * progress listener.
65754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     *
66754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     * @hide
67754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath     */
68754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath    static UtteranceProgressListener from(
69754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath            final TextToSpeech.OnUtteranceCompletedListener listener) {
70754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath        return new UtteranceProgressListener() {
71754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath            @Override
72754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath            public synchronized void onDone(String utteranceId) {
73754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath                listener.onUtteranceCompleted(utteranceId);
74754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath            }
75754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath
76754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath            @Override
7740f71f0be3cefabde9dc066d7707a1e5ebaec820Narayan Kamath            public void onError(String utteranceId) {
7840f71f0be3cefabde9dc066d7707a1e5ebaec820Narayan Kamath                listener.onUtteranceCompleted(utteranceId);
7940f71f0be3cefabde9dc066d7707a1e5ebaec820Narayan Kamath            }
80754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath
81754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath            @Override
8240f71f0be3cefabde9dc066d7707a1e5ebaec820Narayan Kamath            public void onStart(String utteranceId) {
8340f71f0be3cefabde9dc066d7707a1e5ebaec820Narayan Kamath                // Left unimplemented, has no equivalent in the old
8440f71f0be3cefabde9dc066d7707a1e5ebaec820Narayan Kamath                // API.
8540f71f0be3cefabde9dc066d7707a1e5ebaec820Narayan Kamath            }
86754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath        };
87754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath    }
88754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath}
89