Подтвердить что ты не робот

Использование значения audioSessionId для создания класса AudioFx?

Я прочитал 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?

4b9b3361

Ответ 1

Вы должны посмотреть: this

По-видимому, это нерешенная проблема возникла в ICS и, вероятно, не была решена ни в JB.

Ответ 2

Должен ли я использовать 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);
}

Ответ 3

Я знаю эту проблему если кто-то хочет попробовать

сделайте это

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

попробуйте один раз

Ответ 4

Помимо сеанса 0, который является "устаревшим глобальным сеансом", мое понимание кода AudioFlinger показывает, что сеансы создаются только для классов, которые фактически выполняют аудио IO, то есть AudioRecord, AudioTrack, MediaPlayer и т.д. Вы должны создать эти классы, а затем получить идентификатор сеанса, а затем прикрепить эффект.

Любое другое значение, которое вы предоставили для идентификатора сеанса, будет соответствовать аудиосоединению, который не существует, и так будет терпеть неудачу.