Ответ 1
Вы должны посмотреть: this
По-видимому, это нерешенная проблема возникла в ICS и, вероятно, не была решена ни в JB.
Я прочитал API Android и попытался выполнить поиск в Интернете по объявлению пользовательского audioSessionId
, а затем с помощью этого audioSessionId
инициализировать класс AudioFx и назначить свой MediaPlayer или AudioTrack жестко закодированный audioSessionId
.
Этот метод позволит мне сначала создать AudioFx, а затем прикрепить новый MediaPlayer или AudioTrack к этому audioSessionId
.
В настоящее время я могу использовать этот метод на Android 2.3.6, но на Android 4.x. Я сталкиваюсь с проблемами с ошибками, которые инициализация терпит неудачу, или на других устройствах ICS/JellyBean эта ошибка не работает, но вызывает функцию к исключениям.
Samsung 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
Motorola 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. Идентификатор эффекта различается в зависимости от FX, который я пытаюсь изменить.
W/AudioPolicyManagerBase(165): unregisterEffect() unknown effect ID 1381
Обновление 08/11/12:
Я могу использовать audioSessionId
как 0. Я знаю, что он устарел, но он работает с использованием разрешения. <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
Должен ли я использовать AudioFx со звуковым идентификатором сеанса 0?
Вы должны посмотреть: this
По-видимому, это нерешенная проблема возникла в ICS и, вероятно, не была решена ни в JB.
Должен ли я использовать AudioFx со звуковым идентификатором сеанса 0?
Вероятно, он будет работать в некоторых случаях, но не стоит рассчитывать на продолжение этого в будущих версиях 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);
}
Я знаю эту проблему если кто-то хочет попробовать
сделайте это
Equalizer eq=null;
.
.
.
.
.
//in any function before initialization do this
if(eq!=null)
eq.release();
eq=new Equalizer(0, audiosessionid);
попробуйте один раз
Помимо сеанса 0, который является "устаревшим глобальным сеансом", мое понимание кода AudioFlinger показывает, что сеансы создаются только для классов, которые фактически выполняют аудио IO, то есть AudioRecord, AudioTrack, MediaPlayer и т.д. Вы должны создать эти классы, а затем получить идентификатор сеанса, а затем прикрепить эффект.
Любое другое значение, которое вы предоставили для идентификатора сеанса, будет соответствовать аудиосоединению, который не существует, и так будет терпеть неудачу.