android text-to-speech android-mediaplayer onutterancecompleted

android - ¿Qué en TtsService podría explicar la falta de onUtteranceCompleted() para playEarcon()?



text-to-speech android-mediaplayer (1)

Compruebe android.speech.tts.TextToSpeech#playEarcon() en la línea 807 . El argumento params pasado al cuaderno de mensajes de texto a voz es nulo, lo que significa que el servicio nunca recibe su ID de emisión.

public int playEarcon(String earcon, int queueMode, HashMap<String,String> params) { synchronized (mStartLock) { ... result = mITts.playEarcon(mPackageName, earcon, queueMode, null); } ... }

Hace un tiempo, descubrí que playEarcon() nunca produce onUtteranceCompleted() .

En ese momento, simplemente interpreté la documentación que decía "Llamado cuando se ha sintetizado un enunciado", ya que onUtteranceCompleted() no es aplicable para earcons porque, un earcon no es realmente el resultado de la sintetización TTS.

Pero mirando nuevamente el código fuente de Android, simplemente no puedo encontrar una explicación que justifique mi interpretación.

Algunos datos sobre mi plantilla de prueba :

  1. onUtteranceCompleted() siempre llega para la ID de emisión que precede al earcon. Esa emisión es una expresión TTS ordinaria, no un earcon.
  2. El earcon después de eso se reproduce (es decir, exactamente como se esperaba).
  3. onUtteranceCompleted() para ese earcon nunca aparece. Este es un comportamiento muy consistente y reproducible.

Profundizando en el código fuente de TtsService, parece haber solo 2 métodos que podrían afectar la llegada (o ausencia) de onUtteranceCompleted() :

  1. TtsService.processSpeechQueue()
  2. TtsService.onCompletion()

Si examina ese código, verá que se descarta un tercer candidato, TtsService.getSoundResource() (como responsable de la falta de onUtteranceComplete para mi earcon) debido al hecho # 2 anterior: el earcon siempre se reproduce, por lo tanto getSoundResource() no puede devolver nulo.

Usando la misma lógica, el primer candidato, TtsService.processSpeechQueue() , también se puede descartar, por el mismo hecho # 2: el earcon siempre se reproduce, por lo tanto, las siguientes 2 declaraciones críticas siempre se ejecutan:

1108 mPlayer.setOnCompletionListener(this); ... 1111 mPlayer.start();

Entonces, nos queda solo el segundo candidato, TtsService.onCompletion() , como una posible explicación de por qué un playEarcon() nunca produce onUtteranceCompleted() :

public void onCompletion(MediaPlayer arg0) { // mCurrentSpeechItem may become null if it is stopped at the same // time it completes. SpeechItem currentSpeechItemCopy = mCurrentSpeechItem; if (currentSpeechItemCopy != null) { String callingApp = currentSpeechItemCopy.mCallingApp; ArrayList<String> params = currentSpeechItemCopy.mParams; String utteranceId = ""; if (params != null) { for (int i = 0; i < params.size() - 1; i = i + 2) { String param = params.get(i); if (param.equals(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID)) { utteranceId = params.get(i + 1); } } } if (utteranceId.length() > 0) { dispatchUtteranceCompletedCallback(utteranceId, callingApp); } } processSpeechQueue(); }

Allí, solo hay dos condiciones que no producirían dispatchUtteranceCompletedCallback() :

  1. currentSpeechItemCopy == null
  2. utteranceId.length () == 0

Pero sé con certeza que la condición n. ° 2 puede ser descartada porque yo registre todos los idiotas y los earcon están definitivamente ahí.

Además, examina el registro completo del sistema:

Log.v(SERVICE_TAG, "TTS callback: dispatch started");

La falta onUtteranceCompleted() podría ser el resultado de que no se onUtteranceCompleted() dispatchUtteranceCompletedCallback() , pero también podría ser el resultado de que mCallbacksMap.get(packageName) devuelva nulo.

Entonces, de nuevo nos quedan 2 posibilidades, las cuales no me dan mucho sentido:

  1. En el momento en que se llama a earcon''s onCompletion() , el mCurrentSpeechItem de earcon es nulo. Pero por qué?
  2. mCallbacksMap está vacío. ¿Qué es y cuándo se llena?

¿Alguna sugerencia u otra explicación para resolver este misterio?