2012-06-27 14 views
19

En mi aplicación emitir la siguiente declaración:¿Qué es AudioFlinger y por qué falla TONE_PROP_ACK?

toneGenerator.startTone(ToneGenerator.TONE_PROP_ACK, 600); 

que funciona muy bien en un LS670 barato LG con Android 2.3.3, pero no suena en absoluto en todos los otros teléfonos que tengo, que van desde Android 2.2 .1 a Android 2.3.4.

Así que sé que la versión del sistema operativo no juega un papel aquí (también verifiqué en la documentación que ha sido compatible desde la API 1).

Además, tanto el volumen del timbre y el volumen de los medios de comunicación se configuran al máximo y toneGenerator se inicializa con:

toneGenerator = new ToneGenerator(ToneGenerator.TONE_DTMF_1, 100); 

Y comprobaron que Settings.System.DTMF_TONE_WHEN_DIALING toma el valor 1

Desconcertado por este comportamiento inconsistente (a través diferentes teléfonos), examiné los registros del sistema cuando esto sucede y la única diferencia sospechosa que he podido encontrar es que los teléfonos que fallan para que suenen TONE_PROP_ACK tienen esta línea en su registro:

AudioFlinger setParameters(): io 25, keyvalue routing=0, tid 155, calling tid 121 

¿Cuál es el propósito de AudioFlinger y cuál podría ser su conexión al silenciamiento TONE_PROP_ACK?

Cualquier idea cómo arreglar mi código para que ese TONE_PROP_ACK suene siempre, independientemente del modelo de teléfono?

+3

Audio flinger es el componente del sistema que gestiona el audio de la aplicación de usuario android antes de entregarlo al controlador del kernel. ¿Puedes obtener sonido de cualquiera de las funciones de tono? ¿Viste la parte en los documentos de la API sobre el enrutamiento de audio siendo variable? De todos modos, ¿qué intentas lograr realmente? Sabes que estos tonos no pasan por el enlace ascendente de la llamada, ¿verdad? –

+0

@ChrisStratton Sí, sé que estos tonos no pasan por el enlace de llamada. En realidad, este es mi comportamiento preferido ya que solo estoy tratando de dar una señal audible (no tiene que ser DTMF). Puedo obtener sonido de las funciones de tono cuando uso la actividad de marcado del teléfono. ¿Puede explicar más detalladamente que "el enrutamiento de audio es variable"? ¿Dónde encuentro esa parte en los documentos API? La URL directa sería genial. Gracias +1. –

+0

'routing = 0' for' io 25' significa que AudioFlinger le está diciendo a un flujo de audio en particular (supongo que un AudioStreamOut en este caso) que debe enrutar a "en ninguna parte". Cómo manejará el audio HAL que es específico de la implementación, por lo que podría, p. deje el enrutamiento para ese flujo sin cambios. – Michael

Respuesta

1

Una alternativa es generar el tono en algo como Audacity y reproducirlo a través de SoundPool o la aplicación que elija.

De acuerdo con los documentos Android ToneGenerator.TONE_PROP_ACK es:

1200 Hz, 100 ms 100 ms ON, OFF 2 ráfagas

Si elige soundpool, me sugieren ahorrar en formato de archivo ogg y el tono de bucle hasta que se complete. Esto a la vez proporciona audio sin interrupciones con un clip muy pequeño y sin utilizar muchos recursos.

1

El análisis/decodificación es manejado por Stage fright, que es utilizado por el servicio de reproductor de medios . Los datos decodificados se escriben en una pista de audio a través de un conector de audio, y las pistas se mezclan mediante las cuerdas del mezclador Audio Flinger y se graban en un flujo de salida (Hardware de audio). El objeto de flujo de salida llena sus propios búferes y luego escribe los datos en el archivo de dispositivo de salida PCM (que puede o puede no ser un controlador ALSA).

Cuestiones relacionadas