2012-06-25 10 views
17

He leído las API de Android y he intentado buscar en Internet sobre la declaración de un audioSessionId personalizado y luego usar ese audioSessionId para inicializar una clase AudioFx y asignar mi MediaPlayer o AudioTrack al codificado audioSessionId.¿Utilizar el valor audioSessionId para crear una instancia de la clase AudioFx?

Este método me permitiría crear un AudioFx primero y luego adjuntar un nuevo MediaPlayer o AudioTrack a este audioSessionId.

Actualmente puedo usar este método en Android 2.3.6 pero en Android 4.x me encuentro con problemas con los errores que la inicialización falla o en otros dispositivos ICS/JellyBean este error es silencioso pero llama a una función conduce a excepciones.

Samsung Galaxy S II [Android 4.0.3]:[problema ya no ocurre con Android 4.0.4]

E/AudioEffect(13250): set(): AudioFlinger could not create effect, status: -38 
E/AudioEffects-JNI(13250): AudioEffect initCheck failed -5 
E/AudioEffect-JAVA(13250): Error code -5 when initializing AudioEffect. 
W/WrapEqualizer(13250): createEqualizer() -> Effect library not loaded 

Motorola Xoom [Android 4.1.2]
falla parece en silencio después del constructor. Luego invocando getProperties() falla.

java.lang.RuntimeException: AudioEffect: set/get parameter error 
    at android.media.audiofx.AudioEffect.checkStatus(AudioEffect.java:1247) 
    at android.media.audiofx.Equalizer.getProperties(Equalizer.java:532) 

Nexus 4 [Android 4.2.1]
Usando audioSessionId = 0 todo funciona bien, pero el uso de cualquier otro número que el dispositivo va a informar del error siguiente en silencio cada vez que tratan de cambiar el valor predefinido, nivel de banda , refuerzo de graves a ON o virtualizador a ON. La ID de efecto informada es diferente según el FX que estoy tratando de modificar.

W/AudioPolicyManagerBase(165): unregisterEffect() unknown effect ID 1381 

Actualización 11/08/12:
soy capaz de utilizar audioSessionId como 0. Sé que es obsoleta pero funciona con el permiso. <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> ¿Debo utilizar AudioFx con la ID de la sesión de audio 0?

+1

¡Si votas al menos tienes tiempo para comentar por qué votaste! – Jona

+0

Alguien simplemente se dio por vencido votando cada pregunta enriquecida y sus respuestas ... Realmente espero que sean prohibidos. – Eric

+0

Hola Jona, ¿Tienes alguna solución para esto? También quiero implementar el efecto de audio en la aplicación, pero obtuve el error que se muestra arriba. –

Respuesta

5

usted debe buscar en: this

Aparentemente es un problema sin resolver se acercó en el ICS, y probablemente no fue resuelto, ya sea en JB.

+0

Gracias por el enlace, pero en realidad publiqué ese error: P – Jona

+0

@ Android Joker: He visto el enlace. Sé que el problema todavía no se resuelve, pero ¿qué pasa si me gustaría implementar AudioEffect como Bass, trouble y Equalizer? Proporcione cualquier demostración que funcione en todas partes. –

3

¿Debo utilizar AudioFx con la identificación de la sesión de audio 0?

Probablemente funcione en algunos casos, pero no cuente con que continúe haciéndolo en futuras versiones de Android. Ya estarás comprometiendo la interoperabilidad entre tu aplicación y otras aplicaciones en Jellybean.Basta con echar un vistazo a lo que el AudioFlinger does when an effect is enabled:

// suspend all effects in AUDIO_SESSION_OUTPUT_MIX when enabling any effect on 
// another session. This gives the priority to well behaved effect control panels 
// and applications not using global effects. 
// Enabling post processing in AUDIO_SESSION_OUTPUT_STAGE session does not affect 
// global effects 
if ((sessionId != AUDIO_SESSION_OUTPUT_MIX) && (sessionId != AUDIO_SESSION_OUTPUT_STAGE)) { 
    setEffectSuspended_l(NULL, enabled, AUDIO_SESSION_OUTPUT_MIX); 
} 
+0

He visto tu respuesta por segunda vez en SO. ¿Puedes ayudarnos con algo más de descripción y código Java para resolver este asunto? –

+0

No he trabajado con ninguno de los dispositivos con los que estaba teniendo problemas el OP, así que no puedo ayudar con ninguna solución. Agregué mi respuesta solo para abordar el riesgo de usar la sesión de audio 0, ya que esa era una parte de la pregunta. – Michael

0

Sé que este tema si alguien quiere probar

hacer esto

Equalizer eq=null; 
. 
. 
. 
. 
. 
//in any function before initialization do this 
if(eq!=null) 
     eq.release(); 
eq=new Equalizer(0, audiosessionid); 

intentarlo una vez

0

Aparte de la sesión 0 que es la "sesión global obsoleta", mi comprensión del código AudioFlinger muestra que las sesiones solo se crean para las clases que realmente hacen audio IO, es decir, AudioRecord, AudioTrack, MediaPlayer, etc. Debe crear estas clases, obtener su ID de sesión y luego adjuntar el efecto.

Cualquier otro valor que proporcione para la ID de sesión corresponderá a una sesión de audio que no existe, y por lo tanto fallará.

Cuestiones relacionadas