2012-06-25 17 views
17

Ho letto le API di Android e ho provato a cercare su Internet la dichiarazione di una audioSessionId personalizzata e quindi di utilizzare tale audioSessionId per inizializzare una classe AudioFx e assegnare a MediaPlayer o AudioTrack il codice audioSessionId.Utilizzare il valore audioSessionId per istanziare la classe AudioFx?

Questo metodo mi consentirà di creare un AudioFx prima e successivamente di aggiungere un nuovo MediaPlayer o AudioTrack a questo audioSessionId.

Attualmente sono in grado di utilizzare questo metodo su Android 2.3.6 ma su Android 4.x Sto riscontrando problemi con errori che l'inizializzazione non riesce o su altri dispositivi ICS/JellyBean questo errore è silenzioso ma chiama una funzione porta ad eccezioni.

Samsung Galaxy S II [Android 4.0.3]:[problema non accade 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]
Fails sembra silenziosamente dopo il costruttore. Quindi chiamare getProperties() si blocca.

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]
Utilizzando audioSessionId = 0 tutto funziona bene, ma utilizzando un qualsiasi altro numero il dispositivo segnalerà il seguente errore in silenzio ogni volta che provo a cambiare il preset, livello della banda , bass boost su ON o Virtualizer su ON. L'ID dell'effetto riportato è diverso a seconda dell'effetto che sto cercando di modificare.

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

Aggiornamento 08/11/12:
sono in grado di utilizzare audioSessionId come 0. Lo so che è deprecato ma funziona con il permesso. <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> Dovrei utilizzare AudioFx con l'ID di sessione audio 0?

+1

Se non avete votato almeno avete il tempo di commentare perché avete votato! – Jona

+0

Qualcuno è andato in giro a svaligiare ogni domanda di premi e le sue risposte ... Spero davvero che vengano bannati. – Eric

+0

Ciao Jona, hai qualche soluzione a riguardo. Voglio anche implementare l'effetto audio nell'app ma ho ricevuto l'errore come sopra. –

risposta

5

si dovrebbe guardare: this

A quanto pare si tratta di un problema irrisolto è venuto in ICS, e probabilmente non è stato risolto né in JB.

+0

Grazie per il link, ma in realtà ho postato quel bug: P – Jona

+0

@Android Joker: ho visto il link. So che il problema non è ancora risolto, ma se volessi implementare AudioEffect come Bass, trouble ed Equalizer? Si prega di fornire qualsiasi demo che funzioni dappertutto. –

3

Devo utilizzare AudioFx con l'ID di sessione audio 0?

Probabilmente funzionerà in alcuni casi, ma non contare su di esso per continuare a farlo nelle future versioni di Android. Stai già compromettendo l'interoperabilità tra la tua app e altre app su Jellybean.Basta dare un'occhiata a ciò che il 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

ho visto la tua risposta la seconda volta su SO. Puoi aiutarmi con qualche altra descrizione e codice java per risolvere questo problema? –

+0

Non ho lavorato con nessuno dei dispositivi con cui l'OP stava avendo problemi, quindi non posso davvero aiutare con nessuna soluzione. Ho aggiunto la mia risposta solo per affrontare il rischio di utilizzare la sessione audio 0, poiché era una parte della domanda. – Michael

0

So che questo problema se qualcuno vuole provare

fare questo

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

provare una volta

0

Oltre sessione 0 che è la "sessione globale deprecata", la mia comprensione del codice AudioFlinger mostra che le sessioni sono create solo per le classi che effettivamente fanno IO audio, vale a dire AudioRecord, AudioTrack, MediaPlayer ecc. Dovresti creare queste classi, quindi ottenere il loro ID di sessione e quindi associare l'effetto.

Qualsiasi altro valore fornito per l'ID di sessione corrisponderà a una sessione audio che non esiste e quindi non funzionerà.

Problemi correlati