17

私は Android API を読み、カスタムの宣言についてインターネット上で検索し、audioSessionIdそれを使用してaudioSessionIdAudioFx クラスを初期化し、MediaPlayer または AudioTrack をハードコードされaudioSessionIdた .

このメソッドを使用すると、最初に AudioFx を作成し、後で新しい MediaPlayer または AudioTrack を this にアタッチできます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 を使用するとすべて正常に動作しますが、他の番号を使用すると、プリセット、バンド レベル、バス ブーストをオンまたはバーチャライザーをオンに変更しようとするたびに、デバイスは次のサイレント エラーを報告します。報告されるエフェクト ID は、変更しようとしている FX によって異なります。

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

2012 年 8 月 11 日更新:
0 として 使用できますaudioSessionId。非推奨であることはわかっていますが、パーミッションを使用して動作します。<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

「非推奨のグローバル セッション」であるセッション 0 以外に、AudioFlinger コードに関する私の理解では、セッションは実際にオーディオ IO を実行するクラス、つまり AudioRecord、AudioTrack、MediaPlayer などに対してのみ作成されることがわかります。これらのクラスを作成する必要があります。次に、セッション ID を取得し、エフェクトをアタッチします。

セッション ID に指定したその他の値は、存在しないオーディオ セッションに対応するため、失敗します。

于 2014-12-01T23:39:36.397 に答える