17

我已经阅读了 Android API 并尝试在互联网上搜索有关声明自定义的信息audioSessionId,然后使用它audioSessionId来初始化 AudioFx 类并为我的 MediaPlayer 或 AudioTrack 分配硬编码的audioSessionId.

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

我目前能够在 Android 2.3.6 上使用此方法,但在 Android 4.x 上,我遇到了初始化失败的错误问题,或者在其他 ICS/JellyBean 设备上,此错误是无声的,但调用函数会导致异常。

三星 Galaxy S II [Android 4.0.3]: [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

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

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]
使用 audioSessionId=0 一切正常,但使用任何其他数字时,每次我尝试将预设、频段级别、低音增强更改为 ON 或 Virtualizer 更改为 ON 时,设备都会报告以下静音错误。报告的效果 ID 因我尝试修改的 FX 而异。

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

2012 年8 月 11 日更新:
我可以audioSessionId用作 0。我知道它已被弃用,但它可以使用权限。<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />我应该使用音频会话 id 为 0 的 AudioFx 吗?

4

4 回答 4

5

你应该看看:这个

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

于 2012-08-18T13:08:05.420 回答
3

我应该使用音频会话 id 为 0 的 AudioFx 吗?

在某些情况下它可能会起作用,但不要指望它在未来的 Android 版本上继续这样做。您已经在损害您的应用程序与 Jellybean 上的其他应用程序之间的互操作性。看看启用效果时 AudioFlinger 的作用

// 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);
}
于 2013-01-21T18:07:46.933 回答
1

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

做这个

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

试一次

于 2013-01-26T10:13:40.187 回答
0

Other than session 0 which is the "deprecated global session", my understanding of the AudioFlinger code shows that sessions are only created for classes which actually do audio IO, that is, AudioRecord, AudioTrack, MediaPlayer etc. You should create these classes, and then get their session ID, and then attach the effect.

Any other value you supply for session ID will correspond to an audio session that does not exist, and so will fail.

于 2014-12-01T23:39:36.397 回答