FileDocCategorySizeDatePackage
AbstractEventLogger.javaAPI DocAndroid 5.1 API4422Thu Mar 12 22:22:10 GMT 2015android.speech.tts

AbstractEventLogger

public abstract class AbstractEventLogger extends Object
Base class for storing data about a given speech synthesis request to the event logs. The data that is logged depends on actual implementation. Note that {@link AbstractEventLogger#onAudioDataWritten()} and {@link AbstractEventLogger#onEngineComplete()} must be called from a single thread (usually the audio playback thread}.

Fields Summary
protected final String
mServiceApp
protected final int
mCallerUid
protected final int
mCallerPid
protected final long
mReceivedTime
protected long
mPlaybackStartTime
private volatile long
mRequestProcessingStartTime
private volatile long
mEngineStartTime
private volatile long
mEngineCompleteTime
private boolean
mLogWritten
Constructors Summary
AbstractEventLogger(int callerUid, int callerPid, String serviceApp)


          
        mCallerUid = callerUid;
        mCallerPid = callerPid;
        mServiceApp = serviceApp;
        mReceivedTime = SystemClock.elapsedRealtime();
    
Methods Summary
protected abstract voidlogFailure(int statusCode)

protected abstract voidlogSuccess(long audioLatency, long engineLatency, long engineTotal)

public voidonAudioDataWritten()
Notifies the logger that audio playback has started for some section of the synthesis. This is normally some amount of time after the engine has synthesized data and varies depending on utterances and other audio currently in the queue.

        // For now, keep track of only the first chunk of audio
        // that was played.
        if (mPlaybackStartTime == -1) {
            mPlaybackStartTime = SystemClock.elapsedRealtime();
        }
    
public voidonCompleted(int statusCode)
Notifies the logger that the current synthesis has completed. All available data is not logged.

        if (mLogWritten) {
            return;
        } else {
            mLogWritten = true;
        }

        long completionTime = SystemClock.elapsedRealtime();

        // We don't report latency for stopped syntheses because their overall
        // total time spent will be inaccurate (will not correlate with
        // the length of the utterance).

        // onAudioDataWritten() should normally always be called, and hence mPlaybackStartTime
        // should be set, if an error does not occur.
        if (statusCode != TextToSpeech.SUCCESS
                || mPlaybackStartTime == -1 || mEngineCompleteTime == -1) {
            logFailure(statusCode);
            return;
        }

        final long audioLatency = mPlaybackStartTime - mReceivedTime;
        final long engineLatency = mEngineStartTime - mRequestProcessingStartTime;
        final long engineTotal = mEngineCompleteTime - mRequestProcessingStartTime;
        logSuccess(audioLatency, engineLatency, engineTotal);
    
public voidonEngineComplete()
Notifies the logger that the engine has finished processing data. Will be called exactly once.

        mEngineCompleteTime = SystemClock.elapsedRealtime();
    
public voidonEngineDataReceived()
Notifies the logger that a chunk of data has been received from the engine. Might be called multiple times.

        if (mEngineStartTime == -1) {
            mEngineStartTime = SystemClock.elapsedRealtime();
        }
    
public voidonRequestProcessingStart()
Notifies the logger that this request has been selected from the processing queue for processing. Engine latency / total time is measured from this baseline.

        mRequestProcessingStartTime = SystemClock.elapsedRealtime();