使用audioSessionId值来实例化AudioFx类?

时间:2012-06-25 16:24:35

标签: android audio

我已阅读Android API并尝试在互联网上搜索声明自定义audioSessionId,然后使用audioSessionId初始化AudioFx类并为我的MediaPlayer或AudioTrack分配硬编码{{1} }。

此方法允许我先创建一个AudioFx,然后将新的MediaPlayer或AudioTrack附加到此audioSessionId

我目前能够在Android 2.3.6上使用此方法,但在Android 4.x上我遇到了初始化失败的错误或其他ICS / JellyBean设备的问题,这个错误是沉默的,但调用函数引导例外。

三星Galaxy S II [Android 4.0.3]: [Android 4.0.4不再发生问题]

audioSessionId

摩托罗拉Xoom [Android 4.1.2]
在构造函数之后静默似乎失败了。然后调用getProperties()它崩溃了。

 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

Nexus 4 [Android 4.2.1]
使用audioSessionId = 0一切正常但是使用任何其他数字时,每当我尝试将预设,波段电平,低音增强设置为ON或Virtualizer更改为ON时,设备将报告以下静音错误。报告的效果ID因我尝试修改的FX而异。

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)

更新08/11/12:
我可以使用W/AudioPolicyManagerBase(165): unregisterEffect() unknown effect ID 1381 作为0.我知道它已被弃用,但它可以使用权限。 audioSessionId我应该使用AudioFx和音频会话ID 0吗?

4 个答案:

答案 0 :(得分:5)

你应该看看:this

显然,这是ICS中出现的一个未解决的问题,可能在JB中也没有解决。

答案 1 :(得分:3)

  

我是否应该将AudioFx与音频会话ID 0一起使用?

它可能在某些情况下有效,但不要指望它继续在未来的Android版本上这样做。您已经在利用Jellybean上的应用程序和其他应用程序之间的互操作性。只需看看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);
}

答案 2 :(得分:0)

我知道这个问题 如果有人想尝试

这样做

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

尝试一次

答案 3 :(得分:0)

除了会话0,这是"已弃用的全局会话",我对AudioFlinger代码的理解表明,会话仅为实际执行音频IO的类创建,即AudioRecord,AudioTrack,MediaPlayer等你应该创建这些类,然后获取它们的会话ID,然后附加效果。

您为会话ID提供的任何其他值都将对应于不存在的音频会话,因此将失败。