166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen/*
266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Copyright (C) 2010-2011 The Android Open Source Project
366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen *
466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License");
566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * you may not use this file except in compliance with the License.
666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * You may obtain a copy of the License at
766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen *
866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen *      http://www.apache.org/licenses/LICENSE-2.0
966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen *
1066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Unless required by applicable law or agreed to in writing, software
1166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS,
1266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * See the License for the specific language governing permissions and
1466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * limitations under the License.
1566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */
1666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
1766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenpackage com.android.musicfx;
1866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
1966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.Context;
2066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.SharedPreferences;
2166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.MediaPlayer;
2266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.audiofx.AudioEffect;
2366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.audiofx.BassBoost;
2466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.audiofx.Equalizer;
2566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.audiofx.PresetReverb;
2666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.audiofx.Virtualizer;
2766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.util.Log;
2866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
2966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport java.util.Arrays;
3066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport java.util.concurrent.ConcurrentHashMap;
3166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
3266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen/**
3366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * The Common class defines constants to be used by the control panels.
3466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */
3566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenpublic class ControlPanelEffect {
3666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
3766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static String TAG = "MusicFXControlPanelEffect";
3866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
3966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
4066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Audio session priority
4166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
4266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static final int PRIORITY = 0;
4366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
4466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
4566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * The control mode specifies if control panel updates effects and preferences or only
4666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * preferences.
4766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
4866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    static enum ControlMode {
4966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        /**
5066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen         * Control panel updates effects and preferences. Applicable when audio session is delivered
5166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen         * by user.
5266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen         */
5366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        CONTROL_EFFECTS,
5466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        /**
5566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen         * Control panel only updates preferences. Applicable when there was no audio or invalid
5666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen         * session provided by user.
5766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen         */
5866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        CONTROL_PREFERENCES
5966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
6066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
6166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    static enum Key {
62bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen        global_enabled, virt_enabled, virt_strength_supported, virt_strength, virt_type, bb_enabled,
63bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen        bb_strength, te_enabled, te_strength, avl_enabled, lm_enabled, lm_strength, eq_enabled,
64bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen        eq_num_bands, eq_level_range, eq_center_freq, eq_band_level, eq_num_presets, eq_preset_name,
65bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen        eq_preset_user_band_level, eq_preset_user_band_level_default,
66bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen        eq_preset_opensl_es_band_level, eq_preset_ci_extreme_band_level, eq_current_preset,
67bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen        pr_enabled, pr_current_preset
6866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
6966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
7066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Effect/audio session Mappings
7166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
7266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Hashmap initial capacity
7366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
7466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static final int HASHMAP_INITIAL_CAPACITY = 16;
7566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
7666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Hashmap load factor
7766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
7866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static final float HASHMAP_LOAD_FACTOR = 0.75f;
7966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
8066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * ConcurrentHashMap concurrency level
8166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
8266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static final int HASHMAP_CONCURRENCY_LEVEL = 2;
8366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
8466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
8566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Map containing the Virtualizer audio session, effect mappings.
8666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
8766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static final ConcurrentHashMap<Integer, Virtualizer> mVirtualizerInstances = new ConcurrentHashMap<Integer, Virtualizer>(
8866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            HASHMAP_INITIAL_CAPACITY, HASHMAP_LOAD_FACTOR, HASHMAP_CONCURRENCY_LEVEL);
8966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
9066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Map containing the BB audio session, effect mappings.
9166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
9266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static final ConcurrentHashMap<Integer, BassBoost> mBassBoostInstances = new ConcurrentHashMap<Integer, BassBoost>(
9366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            HASHMAP_INITIAL_CAPACITY, HASHMAP_LOAD_FACTOR, HASHMAP_CONCURRENCY_LEVEL);
9466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
9566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Map containing the EQ audio session, effect mappings.
9666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
9766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static final ConcurrentHashMap<Integer, Equalizer> mEQInstances = new ConcurrentHashMap<Integer, Equalizer>(
9866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            HASHMAP_INITIAL_CAPACITY, HASHMAP_LOAD_FACTOR, HASHMAP_CONCURRENCY_LEVEL);
9966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
10066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Map containing the PR audio session, effect mappings.
10166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
10266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static final ConcurrentHashMap<Integer, PresetReverb> mPresetReverbInstances = new ConcurrentHashMap<Integer, PresetReverb>(
10366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            HASHMAP_INITIAL_CAPACITY, HASHMAP_LOAD_FACTOR, HASHMAP_CONCURRENCY_LEVEL);
10466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
10566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
10666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Map containing the package name, audio session mappings.
10766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
10866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static final ConcurrentHashMap<String, Integer> mPackageSessions = new ConcurrentHashMap<String, Integer>(
10966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            HASHMAP_INITIAL_CAPACITY, HASHMAP_LOAD_FACTOR, HASHMAP_CONCURRENCY_LEVEL);
11066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
11166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Defaults
112024018a9804a4fcd3f8c660d32336e96e39bda8eMarco Nelissen    final static boolean GLOBAL_ENABLED_DEFAULT = false;
11366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static boolean VIRTUALIZER_ENABLED_DEFAULT = true;
11466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static int VIRTUALIZER_STRENGTH_DEFAULT = 1000;
11566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static boolean BASS_BOOST_ENABLED_DEFAULT = true;
11666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static int BASS_BOOST_STRENGTH_DEFAULT = 667;
11766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static boolean PRESET_REVERB_ENABLED_DEFAULT = false;
11866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static int PRESET_REVERB_CURRENT_PRESET_DEFAULT = 0; // None
11966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
12066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // EQ defaults
12166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static boolean EQUALIZER_ENABLED_DEFAULT = true;
12266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static String EQUALIZER_PRESET_NAME_DEFAULT = "Preset";
12366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static short EQUALIZER_NUMBER_BANDS_DEFAULT = 5;
12466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static short EQUALIZER_NUMBER_PRESETS_DEFAULT = 0;
12566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static short[] EQUALIZER_BAND_LEVEL_RANGE_DEFAULT = { -1500, 1500 };
12666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static int[] EQUALIZER_CENTER_FREQ_DEFAULT = { 60000, 230000, 910000, 3600000,
12766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            14000000 };
12866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static short[] EQUALIZER_PRESET_CIEXTREME_BAND_LEVEL = { 0, 800, 400, 100, 1000 };
12966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static short[] EQUALIZER_PRESET_USER_BAND_LEVEL_DEFAULT = { 0, 0, 0, 0, 0 };
13066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
13166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // EQ effect properties which are invariable over all EQ effects sessions
13266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static short[] mEQBandLevelRange = EQUALIZER_BAND_LEVEL_RANGE_DEFAULT;
13366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static short mEQNumBands = EQUALIZER_NUMBER_BANDS_DEFAULT;
13466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static int[] mEQCenterFreq = EQUALIZER_CENTER_FREQ_DEFAULT;
13566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static short mEQNumPresets = EQUALIZER_NUMBER_PRESETS_DEFAULT;
13602641ebc34f839567fd030455da34ef441e91614Marco Nelissen    private static short[][] mEQPresetOpenSLESBandLevel =
13702641ebc34f839567fd030455da34ef441e91614Marco Nelissen            new short[EQUALIZER_NUMBER_PRESETS_DEFAULT][EQUALIZER_NUMBER_BANDS_DEFAULT];
13866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static String[] mEQPresetNames;
13966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static boolean mIsEQInitialized = false;
14066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static Object mEQInitLock = new Object();
14166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
14266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
14366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Default int argument used in methods to see that the arg is a dummy. Used for method
14466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * overloading.
14566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
14666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private final static int DUMMY_ARGUMENT = -1;
14766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
14866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
14966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Inits effects preferences for the given context and package name in the control panel. If
15066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * preferences for the given package name don't exist, they are created and initialized.
15166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
15266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
15366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
15466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
15566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
15666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
15766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static void initEffectsPreferences(final Context context, final String packageName,
15866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession) {
15966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final SharedPreferences prefs = context.getSharedPreferences(packageName,
16066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Context.MODE_PRIVATE);
16166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final SharedPreferences.Editor editor = prefs.edit();
16266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final ControlMode controlMode = getControlMode(audioSession);
16366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
16466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // init preferences
16566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        try {
16666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // init global on/off switch
16766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final boolean isGlobalEnabled = prefs.getBoolean(Key.global_enabled.toString(),
16866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    GLOBAL_ENABLED_DEFAULT);
16966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putBoolean(Key.global_enabled.toString(), isGlobalEnabled);
17066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.v(TAG, "isGlobalEnabled = " + isGlobalEnabled);
17166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
17266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Virtualizer
17366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final boolean isVIEnabled = prefs.getBoolean(Key.virt_enabled.toString(),
17466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    VIRTUALIZER_ENABLED_DEFAULT);
17520e6c9bc3240202b3470852a8793a52a3551004aMarco Nelissen            final Virtualizer virt = new Virtualizer(0, audioSession);
17666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int vIStrength = prefs.getInt(Key.virt_strength.toString(),
17720e6c9bc3240202b3470852a8793a52a3551004aMarco Nelissen                    virt.getRoundedStrength());
17820e6c9bc3240202b3470852a8793a52a3551004aMarco Nelissen            virt.release();
17966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putBoolean(Key.virt_enabled.toString(), isVIEnabled);
18066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putInt(Key.virt_strength.toString(), vIStrength);
181bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            {
182bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                final MediaPlayer mediaPlayer = new MediaPlayer();
183bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                final int session = mediaPlayer.getAudioSessionId();
184bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                Virtualizer virtualizerEffect = null;
185bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                try {
186bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    virtualizerEffect = new Virtualizer(PRIORITY, session);
187bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    editor.putBoolean(Key.virt_strength_supported.toString(),
188bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                            virtualizerEffect.getStrengthSupported());
189bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                } finally {
190bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    if (virtualizerEffect != null) {
191bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                        Log.d(TAG, "Releasing dummy Virtualizer effect");
192bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                        virtualizerEffect.release();
193bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    }
194bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    mediaPlayer.release();
195bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                }
196bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            }
19719aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen
19866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // BassBoost
19966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final boolean isBBEnabled = prefs.getBoolean(Key.bb_enabled.toString(),
20066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    BASS_BOOST_ENABLED_DEFAULT);
20166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int bBStrength = prefs.getInt(Key.bb_strength.toString(),
20266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    BASS_BOOST_STRENGTH_DEFAULT);
20366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putBoolean(Key.bb_enabled.toString(), isBBEnabled);
20466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putInt(Key.bb_strength.toString(), bBStrength);
20519aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen
20666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Equalizer
20766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            synchronized (mEQInitLock) {
20866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // If EQ is not initialized already create "dummy" audio session created by
20966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // MediaPlayer and create effect on it to retrieve the invariable EQ properties
21066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (!mIsEQInitialized) {
21166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final MediaPlayer mediaPlayer = new MediaPlayer();
21266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final int session = mediaPlayer.getAudioSessionId();
21366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Equalizer equalizerEffect = null;
21466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    try {
21519aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                        Log.d(TAG, "Creating dummy EQ effect on session " + session);
21666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        equalizerEffect = new Equalizer(PRIORITY, session);
21766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
21866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQBandLevelRange = equalizerEffect.getBandLevelRange();
21966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQNumBands = equalizerEffect.getNumberOfBands();
22066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQCenterFreq = new int[mEQNumBands];
22166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        for (short band = 0; band < mEQNumBands; band++) {
22266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            mEQCenterFreq[band] = equalizerEffect.getCenterFreq(band);
22366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
22466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQNumPresets = equalizerEffect.getNumberOfPresets();
22566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQPresetNames = new String[mEQNumPresets];
22666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQPresetOpenSLESBandLevel = new short[mEQNumPresets][mEQNumBands];
22766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        for (short preset = 0; preset < mEQNumPresets; preset++) {
22866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            mEQPresetNames[preset] = equalizerEffect.getPresetName(preset);
22966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            equalizerEffect.usePreset(preset);
23066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            for (short band = 0; band < mEQNumBands; band++) {
23166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                mEQPresetOpenSLESBandLevel[preset][band] = equalizerEffect
23266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                        .getBandLevel(band);
23366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            }
23466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
23566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
23666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mIsEQInitialized = true;
23766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    } catch (final IllegalStateException e) {
23866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        Log.e(TAG, "Equalizer: " + e);
23966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    } catch (final IllegalArgumentException e) {
24066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        Log.e(TAG, "Equalizer: " + e);
24166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    } catch (final UnsupportedOperationException e) {
24266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        Log.e(TAG, "Equalizer: " + e);
24366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    } catch (final RuntimeException e) {
24466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        Log.e(TAG, "Equalizer: " + e);
24566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    } finally {
24666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (equalizerEffect != null) {
24719aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            Log.d(TAG, "Releasing dummy EQ effect");
24866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            equalizerEffect.release();
24966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
25066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mediaPlayer.release();
25166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
25266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // When there was a failure set some good defaults
25366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (!mIsEQInitialized) {
25402641ebc34f839567fd030455da34ef441e91614Marco Nelissen                            Log.e(TAG, "Error retrieving default EQ values, setting all presets"
25502641ebc34f839567fd030455da34ef441e91614Marco Nelissen                                    + " to flat response");
25666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            mEQPresetOpenSLESBandLevel = new short[mEQNumPresets][mEQNumBands];
25766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            for (short preset = 0; preset < mEQNumPresets; preset++) {
25866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                // Init preset names to a dummy name
25966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                mEQPresetNames[preset] = prefs.getString(
26066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                        Key.eq_preset_name.toString() + preset,
26166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                        EQUALIZER_PRESET_NAME_DEFAULT + preset);
26202641ebc34f839567fd030455da34ef441e91614Marco Nelissen                                mEQPresetOpenSLESBandLevel[preset] = Arrays.copyOf(
26302641ebc34f839567fd030455da34ef441e91614Marco Nelissen                                        EQUALIZER_PRESET_USER_BAND_LEVEL_DEFAULT, mEQNumBands);
26466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            }
26566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
26666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
26766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
26866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putInt(Key.eq_level_range.toString() + 0, mEQBandLevelRange[0]);
26966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putInt(Key.eq_level_range.toString() + 1, mEQBandLevelRange[1]);
27066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putInt(Key.eq_num_bands.toString(), mEQNumBands);
27166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putInt(Key.eq_num_presets.toString(), mEQNumPresets);
27266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Resetting the EQ arrays depending on the real # bands with defaults if
27366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // band < default size else 0 by copying default arrays over new ones
27466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short[] eQPresetCIExtremeBandLevel = Arrays.copyOf(
27566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        EQUALIZER_PRESET_CIEXTREME_BAND_LEVEL, mEQNumBands);
27666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short[] eQPresetUserBandLevelDefault = Arrays.copyOf(
27766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        EQUALIZER_PRESET_USER_BAND_LEVEL_DEFAULT, mEQNumBands);
27866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // If no preset prefs set use CI EXTREME (= numPresets)
27966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short eQPreset = (short) prefs.getInt(Key.eq_current_preset.toString(),
28066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQNumPresets);
28166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putInt(Key.eq_current_preset.toString(), eQPreset);
28266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short[] bandLevel = new short[mEQNumBands];
28366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                for (short band = 0; band < mEQNumBands; band++) {
28466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (controlMode == ControlMode.CONTROL_PREFERENCES) {
28566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (eQPreset < mEQNumPresets) {
28666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // OpenSL ES effect presets
28766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bandLevel[band] = mEQPresetOpenSLESBandLevel[eQPreset][band];
28866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        } else if (eQPreset == mEQNumPresets) {
28966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // CI EXTREME
29066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bandLevel[band] = eQPresetCIExtremeBandLevel[band];
29166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        } else {
29266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // User
29366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bandLevel[band] = (short) prefs.getInt(
29466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    Key.eq_preset_user_band_level.toString() + band,
29566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    eQPresetUserBandLevelDefault[band]);
29666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
29766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_band_level.toString() + band, bandLevel[band]);
29866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
29966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_center_freq.toString() + band, mEQCenterFreq[band]);
30066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_preset_ci_extreme_band_level.toString() + band,
30166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            eQPresetCIExtremeBandLevel[band]);
30266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_preset_user_band_level_default.toString() + band,
30366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            eQPresetUserBandLevelDefault[band]);
30466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
30566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                for (short preset = 0; preset < mEQNumPresets; preset++) {
30666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putString(Key.eq_preset_name.toString() + preset, mEQPresetNames[preset]);
30766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    for (short band = 0; band < mEQNumBands; band++) {
30866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_preset_opensl_es_band_level.toString() + preset + "_"
30966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                + band, mEQPresetOpenSLESBandLevel[preset][band]);
31066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
31166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
31266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
31366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final boolean isEQEnabled = prefs.getBoolean(Key.eq_enabled.toString(),
31466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    EQUALIZER_ENABLED_DEFAULT);
31566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putBoolean(Key.eq_enabled.toString(), isEQEnabled);
31666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
31766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Preset reverb
31866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final boolean isEnabledPR = prefs.getBoolean(Key.pr_enabled.toString(),
31966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    PRESET_REVERB_ENABLED_DEFAULT);
32066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final short presetPR = (short) prefs.getInt(Key.pr_current_preset.toString(),
32166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    PRESET_REVERB_CURRENT_PRESET_DEFAULT);
32266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putBoolean(Key.pr_enabled.toString(), isEnabledPR);
32366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putInt(Key.pr_current_preset.toString(), presetPR);
32466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
32566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.commit();
32666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final RuntimeException e) {
32766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "initEffectsPreferences: processingEnabled: " + e);
32866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
32966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
33066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
33166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
33266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets the effect control mode based on the given audio session in the control panel. Control
33366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * mode defines if the control panel is controlling effects and/or preferences
33466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
33566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
33666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
33766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return effect control mode
33866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
33966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static ControlMode getControlMode(final int audioSession) {
34066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (audioSession == AudioEffect.ERROR_BAD_VALUE) {
34166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            return ControlMode.CONTROL_PREFERENCES;
34266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
34366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return ControlMode.CONTROL_EFFECTS;
34466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
34566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
34666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
34766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Sets boolean parameter to value for given key
34866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
34966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
35066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
35166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
35266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
35366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
35466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param value
35566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
35666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static void setParameterBoolean(final Context context, final String packageName,
35766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key, final boolean value) {
35866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        try {
35966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final SharedPreferences prefs = context.getSharedPreferences(packageName,
36066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Context.MODE_PRIVATE);
36166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final ControlMode controlMode = getControlMode(audioSession);
36266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            boolean enabled = value;
36366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
36466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Global on/off
36566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (key == Key.global_enabled) {
36666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                boolean processingEnabled = false;
36766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (value == true) {
36866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // enable all with respect to preferences
36966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (controlMode == ControlMode.CONTROL_EFFECTS) {
37066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final Virtualizer virtualizerEffect = getVirtualizerEffect(audioSession);
37166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (virtualizerEffect != null) {
37266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            virtualizerEffect.setEnabled(prefs.getBoolean(
37366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    Key.virt_enabled.toString(), VIRTUALIZER_ENABLED_DEFAULT));
37420e6c9bc3240202b3470852a8793a52a3551004aMarco Nelissen                            int defaultstrength = virtualizerEffect.getRoundedStrength();
37519aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            final int vIStrength = prefs.getInt(Key.virt_strength.toString(),
37620e6c9bc3240202b3470852a8793a52a3551004aMarco Nelissen                                    defaultstrength);
37719aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            setParameterInt(context, packageName,
37819aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                                    audioSession, Key.virt_strength, vIStrength);
37966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
38066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final BassBoost bassBoostEffect = getBassBoostEffect(audioSession);
38166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (bassBoostEffect != null) {
38266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bassBoostEffect.setEnabled(prefs.getBoolean(Key.bb_enabled.toString(),
38366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    BASS_BOOST_ENABLED_DEFAULT));
38419aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            final int bBStrength = prefs.getInt(Key.bb_strength.toString(),
38519aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                                    BASS_BOOST_STRENGTH_DEFAULT);
38619aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            setParameterInt(context, packageName,
38719aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                                    audioSession, Key.bb_strength, bBStrength);
38866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
38966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final Equalizer equalizerEffect = getEqualizerEffect(audioSession);
39066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (equalizerEffect != null) {
39166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            equalizerEffect.setEnabled(prefs.getBoolean(Key.eq_enabled.toString(),
39266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    EQUALIZER_ENABLED_DEFAULT));
39319aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            final int[] bandLevels = getParameterIntArray(context,
39419aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                                    packageName, audioSession, Key.eq_band_level);
39519aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            final int len = bandLevels.length;
39619aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            for (short band = 0; band < len; band++) {
39719aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                                final int level = bandLevels[band];
39819aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                                setParameterInt(context, packageName,
39919aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                                        audioSession, Key.eq_band_level, level, band);
40019aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            }
40166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
40266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // XXX: Preset Reverb not used for the moment, so commented out the effect
40366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // creation to not use MIPS
40466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // final PresetReverb presetReverbEffect =
40566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // getPresetReverbEffect(audioSession);
40666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // if (presetReverbEffect != null) {
40766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // presetReverbEffect.setEnabled(prefs.getBoolean(
40866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // Key.pr_enabled.toString(), PRESET_REVERB_ENABLED_DEFAULT));
40966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // }
41066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
41166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
41266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    processingEnabled = true;
41366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Log.v(TAG, "processingEnabled=" + processingEnabled);
41466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
41566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                } else {
41666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // disable all
41766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (controlMode == ControlMode.CONTROL_EFFECTS) {
41819aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                        final Virtualizer virtualizerEffect = getVirtualizerEffectNoCreate(audioSession);
41966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (virtualizerEffect != null) {
42019aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            mVirtualizerInstances.remove(audioSession, virtualizerEffect);
42166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            virtualizerEffect.setEnabled(false);
42219aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            virtualizerEffect.release();
42366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
42419aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                        final BassBoost bassBoostEffect = getBassBoostEffectNoCreate(audioSession);
42566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (bassBoostEffect != null) {
42619aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            mBassBoostInstances.remove(audioSession, bassBoostEffect);
42766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bassBoostEffect.setEnabled(false);
42819aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            bassBoostEffect.release();
42966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
43019aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                        final Equalizer equalizerEffect = getEqualizerEffectNoCreate(audioSession);
43166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (equalizerEffect != null) {
43219aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            mEQInstances.remove(audioSession, equalizerEffect);
43366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            equalizerEffect.setEnabled(false);
43419aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            equalizerEffect.release();
43566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
43666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // XXX: Preset Reverb not used for the moment, so commented out the effect
43766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // creation to not use MIPS
43866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // final PresetReverb presetReverbEffect =
43966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // getPresetReverbEffect(audioSession);
44066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // if (presetReverbEffect != null) {
44166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // presetReverbEffect.setEnabled(false);
44266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // }
44366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
44466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
44566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    processingEnabled = false;
44666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Log.v(TAG, "processingEnabled=" + processingEnabled);
44766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
44866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                enabled = processingEnabled;
44966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (controlMode == ControlMode.CONTROL_EFFECTS) {
45066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final boolean isGlobalEnabled = prefs.getBoolean(Key.global_enabled.toString(),
45166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        GLOBAL_ENABLED_DEFAULT);
45266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (isGlobalEnabled == true) {
45366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Set effect parameters
45466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    switch (key) {
45566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
45666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    case global_enabled:
45766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // Global, already handled, to get out error free
45866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        break;
45966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
46066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Virtualizer
46166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    case virt_enabled:
46266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final Virtualizer virtualizerEffect = getVirtualizerEffect(audioSession);
46366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (virtualizerEffect != null) {
46466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            virtualizerEffect.setEnabled(value);
46566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            enabled = virtualizerEffect.getEnabled();
46666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
46766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        break;
46866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
46966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // BassBoost
47066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    case bb_enabled:
47166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final BassBoost bassBoostEffect = getBassBoostEffect(audioSession);
47266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (bassBoostEffect != null) {
47366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bassBoostEffect.setEnabled(value);
47466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            enabled = bassBoostEffect.getEnabled();
47566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
47666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        break;
47766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
47866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Equalizer
47966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    case eq_enabled:
48066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final Equalizer equalizerEffect = getEqualizerEffect(audioSession);
48166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (equalizerEffect != null) {
48266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            equalizerEffect.setEnabled(value);
48366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            enabled = equalizerEffect.getEnabled();
48466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
48566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        break;
48666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
48766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // PresetReverb
48866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    case pr_enabled:
48966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // XXX: Preset Reverb not used for the moment, so commented out the effect
49066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // creation to not use MIPS
49166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // final PresetReverb presetReverbEffect =
49266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // getPresetReverbEffect(audioSession);
49366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // if (presetReverbEffect != null) {
49466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // presetReverbEffect.setEnabled(value);
49566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // enabled = presetReverbEffect.getEnabled();
49666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // }
49766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        break;
49866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
49966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    default:
50066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        Log.e(TAG, "Unknown/unsupported key " + key);
50166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        return;
50266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
50366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
50466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
50566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
50666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
50766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set preferences
50866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final SharedPreferences.Editor editor = prefs.edit();
50966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putBoolean(key.toString(), enabled);
51066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.commit();
51166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
51266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final RuntimeException e) {
51366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "setParameterBoolean: " + key + "; " + value + "; " + e);
51466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
51566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
51666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
51766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
51866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets boolean parameter for given key
51966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
52066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
52166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
52266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
52366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
52466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
52566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
52666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
52766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static Boolean getParameterBoolean(final Context context, final String packageName,
52866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key) {
52966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final SharedPreferences prefs = context.getSharedPreferences(packageName,
53066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Context.MODE_PRIVATE);
53166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        boolean value = false;
53266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
53366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        try {
53466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            value = prefs.getBoolean(key.toString(), value);
53566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final RuntimeException e) {
53666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "getParameterBoolean: " + key + "; " + value + "; " + e);
53766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
53866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
53966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return value;
54066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
54166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
54266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
54366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
54466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Sets int parameter for given key and value arg0, arg1
54566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
54666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
54766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
54866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
54966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
55066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
55166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param arg0
55266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param arg1
55366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
55466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static void setParameterInt(final Context context, final String packageName,
55566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key, final int arg0, final int arg1) {
55666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        String strKey = key.toString();
55766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        int value = arg0;
55866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
55966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        try {
56066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final SharedPreferences prefs = context.getSharedPreferences(packageName,
56166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Context.MODE_PRIVATE);
56266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final SharedPreferences.Editor editor = prefs.edit();
56366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final ControlMode controlMode = getControlMode(audioSession);
56466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
56566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set effect parameters
56666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (controlMode == ControlMode.CONTROL_EFFECTS) {
56766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
56866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                switch (key) {
56966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
57066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Virtualizer
57166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case virt_strength: {
57266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final Virtualizer virtualizerEffect = getVirtualizerEffect(audioSession);
57366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (virtualizerEffect != null) {
57466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        virtualizerEffect.setStrength((short) value);
57566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        value = virtualizerEffect.getRoundedStrength();
57666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
57766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
57866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
57966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // BassBoost
58066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case bb_strength: {
58166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final BassBoost bassBoostEffect = getBassBoostEffect(audioSession);
58266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (bassBoostEffect != null) {
58366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        bassBoostEffect.setStrength((short) value);
58466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        value = bassBoostEffect.getRoundedStrength();
58566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
58666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
58766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
58866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Equalizer
58966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_band_level: {
59066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (arg1 == DUMMY_ARGUMENT) {
59166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        throw new IllegalArgumentException("Dummy arg passed.");
59266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
59366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short band = (short) arg1;
59466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    strKey = strKey + band;
59566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final Equalizer equalizerEffect = getEqualizerEffect(audioSession);
59666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (equalizerEffect != null) {
59766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        equalizerEffect.setBandLevel(band, (short) value);
59866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        value = equalizerEffect.getBandLevel(band);
59966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // save band level in User preset
60066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_preset_user_band_level.toString() + band, value);
60166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
60266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
60366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
60466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_current_preset: {
60566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final Equalizer equalizerEffect = getEqualizerEffect(audioSession);
60666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (equalizerEffect != null) {
60766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final short preset = (short) value;
60866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final int numBands = prefs.getInt(Key.eq_num_bands.toString(),
60966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                EQUALIZER_NUMBER_BANDS_DEFAULT);
61066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final int numPresets = prefs.getInt(Key.eq_num_presets.toString(),
61166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                EQUALIZER_NUMBER_PRESETS_DEFAULT);
61266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
61366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (preset < numPresets) {
61466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // OpenSL ES EQ Effect presets
61566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            equalizerEffect.usePreset(preset);
61666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            value = equalizerEffect.getCurrentPreset();
61766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        } else {
61866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            final short[] eQPresetCIExtremeBandLevelDefault = Arrays.copyOf(
61966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    EQUALIZER_PRESET_CIEXTREME_BAND_LEVEL, numBands);
62066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            final short[] eQPresetUserBandLevelDefault = Arrays.copyOf(
62166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    EQUALIZER_PRESET_USER_BAND_LEVEL_DEFAULT, numBands);
62266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // Set the band levels manually for custom presets
62366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            for (short band = 0; band < numBands; band++) {
62466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                short bandLevel = 0;
62566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                if (preset == numPresets) {
62666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    // CI EXTREME
62766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    bandLevel = (short) prefs.getInt(
62866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                            Key.eq_preset_ci_extreme_band_level.toString() + band,
62966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                            eQPresetCIExtremeBandLevelDefault[band]);
63066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                } else {
63166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    // User
63266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    bandLevel = (short) prefs.getInt(
63366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                            Key.eq_preset_user_band_level.toString() + band,
63466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                            eQPresetUserBandLevelDefault[band]);
63566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                }
63666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                equalizerEffect.setBandLevel(band, bandLevel);
63766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            }
63866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
63966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
64066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // update band levels
64166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        for (short band = 0; band < numBands; band++) {
64266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            final short level = equalizerEffect.getBandLevel(band);
64366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            editor.putInt(Key.eq_band_level.toString() + band, level);
64466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
64566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
64666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
64766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
64866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_preset_user_band_level:
64966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Fall through
65066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_preset_user_band_level_default:
65166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Fall through
65266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_preset_ci_extreme_band_level: {
65366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (arg1 == DUMMY_ARGUMENT) {
65466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        throw new IllegalArgumentException("Dummy arg passed.");
65566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
65666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short band = (short) arg1;
65766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    strKey = strKey + band;
65866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
65966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
66066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case pr_current_preset:
66166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // XXX: Preset Reverb not used for the moment, so commented out the effect
66266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // creation to not use MIPS
66366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // final PresetReverb presetReverbEffect = getPresetReverbEffect(audioSession);
66466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // if (presetReverbEffect != null) {
66566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // presetReverbEffect.setPreset((short) value);
66666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // value = presetReverbEffect.getPreset();
66766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // }
66866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
66966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                default:
67066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Log.e(TAG, "setParameterInt: Unknown/unsupported key " + key);
67166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    return;
67266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
67366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else {
67466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                switch (key) {
67566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Virtualizer
67666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case virt_strength:
67766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Do nothing
67866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
67966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case virt_type:
68066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Do nothing
68166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
68266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
68366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // BassBoost
68466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case bb_strength:
68566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Do nothing
68666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
68766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
68866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Equalizer
68966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_band_level: {
69066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (arg1 == DUMMY_ARGUMENT) {
69166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        throw new IllegalArgumentException("Dummy arg passed.");
69266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
69366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short band = (short) arg1;
69466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    strKey = strKey + band;
69566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
69666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_preset_user_band_level.toString() + band, value);
69766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
69866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
69966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_current_preset: {
70066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short preset = (short) value;
70166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final int numBands = prefs.getInt(Key.eq_num_bands.toString(),
70266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            EQUALIZER_NUMBER_BANDS_DEFAULT);
70366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final int numPresets = prefs.getInt(Key.eq_num_presets.toString(),
70466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            EQUALIZER_NUMBER_PRESETS_DEFAULT);
70566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
70666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short[][] eQPresetOpenSLESBandLevelDefault = Arrays.copyOf(
70702641ebc34f839567fd030455da34ef441e91614Marco Nelissen                            mEQPresetOpenSLESBandLevel, numPresets);
70866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short[] eQPresetCIExtremeBandLevelDefault = Arrays.copyOf(
70966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            EQUALIZER_PRESET_CIEXTREME_BAND_LEVEL, numBands);
71066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short[] eQPresetUserBandLevelDefault = Arrays.copyOf(
71166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            EQUALIZER_PRESET_USER_BAND_LEVEL_DEFAULT, numBands);
71266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    for (short band = 0; band < numBands; band++) {
71366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        short bandLevel = 0;
71466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (preset < numPresets) {
71566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // OpenSL ES EQ Effect presets
71666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bandLevel = (short) prefs.getInt(
71766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    Key.eq_preset_opensl_es_band_level.toString() + preset + "_"
71866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                            + band, eQPresetOpenSLESBandLevelDefault[preset][band]);
71966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        } else if (preset == numPresets) {
72066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // CI EXTREME
72166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bandLevel = (short) prefs.getInt(
72266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    Key.eq_preset_ci_extreme_band_level.toString() + band,
72366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    eQPresetCIExtremeBandLevelDefault[band]);
72466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        } else {
72566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // User
72666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bandLevel = (short) prefs.getInt(
72766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    Key.eq_preset_user_band_level.toString() + band,
72866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    eQPresetUserBandLevelDefault[band]);
72966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
73066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_band_level.toString() + band, bandLevel);
73166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
73266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
73366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
73466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_preset_user_band_level:
73566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Fall through
73666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_preset_user_band_level_default:
73766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Fall through
73866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_preset_ci_extreme_band_level: {
73966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (arg1 == DUMMY_ARGUMENT) {
74066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        throw new IllegalArgumentException("Dummy arg passed.");
74166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
74266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short band = (short) arg1;
74366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    strKey = strKey + band;
74466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
74566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
74666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case pr_current_preset:
74766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Do nothing
74866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
74966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                default:
75066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Log.e(TAG, "setParameterInt: Unknown/unsupported key " + key);
75166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    return;
75266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
75366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
75466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
75566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set preferences
75666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putInt(strKey, value);
757b6436a644aa2e78dac41e4971b60d0b8ad95884eMarco Nelissen            editor.apply();
75866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
75966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final RuntimeException e) {
76066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "setParameterInt: " + key + "; " + arg0 + "; " + arg1 + "; " + e);
76166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
76266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
76366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
76466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
76566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
76666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Sets int parameter for given key and value arg
76766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
76866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
76966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
77066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
77166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
77266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
77366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param arg
77466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
77566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static void setParameterInt(final Context context, final String packageName,
77666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key, final int arg) {
77766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        setParameterInt(context, packageName, audioSession, key, arg, DUMMY_ARGUMENT);
77866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
77966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
78066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
78166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets int parameter given key
78266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
78366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
78466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
78566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
78666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
78766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
78866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
78966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
79066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static int getParameterInt(final Context context, final String packageName,
79166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final String key) {
79266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        int value = 0;
79366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
79466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        try {
79566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final SharedPreferences prefs = context.getSharedPreferences(packageName,
79666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Context.MODE_PRIVATE);
79766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            value = prefs.getInt(key, value);
79866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final RuntimeException e) {
79966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "getParameterInt: " + key + "; " + e);
80066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
80166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
80266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return value;
80366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
80466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
80566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
80666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets int parameter given key
80766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
80866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
80966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
81066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
81166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
81266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
81366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
81466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
81566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static int getParameterInt(final Context context, final String packageName,
81666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key) {
81766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return getParameterInt(context, packageName, audioSession, key.toString());
81866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
81966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
82066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
82166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets int parameter given key and arg
82266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
82366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
82466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
82566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
82666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
82766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
82866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
82966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param arg
83066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
83166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
83266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static int getParameterInt(final Context context, final String packageName,
83366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key, final int arg) {
83466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return getParameterInt(context, packageName, audioSession, key.toString() + arg);
83566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
83666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
83766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
83866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets int parameter given key, arg0 and arg1
83966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
84066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
84166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
84266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
84366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
84466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
84566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
84666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param arg0
84766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param arg1
84866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
84966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
85066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static int getParameterInt(final Context context, final String packageName,
85166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key, final int arg0, final int arg1) {
85266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return getParameterInt(context, packageName, audioSession, key.toString() + arg0 + "_"
85366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                + arg1);
85466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
85566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
85666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
85766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets integer array parameter given key. Returns null if not found.
85866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
85966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
86066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
86166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
86266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
86366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
86466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value array
86566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
86666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static int[] getParameterIntArray(final Context context, final String packageName,
86766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key) {
86866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final SharedPreferences prefs = context.getSharedPreferences(packageName,
86966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Context.MODE_PRIVATE);
87066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
87166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        int[] intArray = null;
87266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        try {
87366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Get effect parameters
87466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            switch (key) {
87566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            case eq_level_range: {
87666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                intArray = new int[2];
87766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                break;
87866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
87966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            case eq_center_freq:
88066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Fall through
88166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            case eq_band_level:
88266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Fall through
88366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            case eq_preset_user_band_level:
88466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Fall through
88566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            case eq_preset_user_band_level_default:
88666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Fall through
88766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            case eq_preset_ci_extreme_band_level: {
88866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final int numBands = prefs.getInt(Key.eq_num_bands.toString(), 0);
88966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                intArray = new int[numBands];
89066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                break;
89166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
89266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            default:
89366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "getParameterIntArray: Unknown/unsupported key " + key);
89466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                return null;
89566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
89666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
89766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            for (int i = 0; i < intArray.length; i++) {
89866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                intArray[i] = prefs.getInt(key.toString() + i, 0);
89966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
90066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
90166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final RuntimeException e) {
90266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "getParameterIntArray: " + key + "; " + e);
90366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
90466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
90566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return intArray;
90666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
90766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
90866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
90966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets string parameter given key. Returns empty string if not found.
91066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
91166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
91266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
91366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
91466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
91566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
91666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
91766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
91866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static String getParameterString(final Context context, final String packageName,
91966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final String key) {
92066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        String value = "";
92166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        try {
92266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final SharedPreferences prefs = context.getSharedPreferences(packageName,
92366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Context.MODE_PRIVATE);
92466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
92566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Get effect parameters
92666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            value = prefs.getString(key, value);
92766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
92866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final RuntimeException e) {
92966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "getParameterString: " + key + "; " + e);
93066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
93166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
93266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return value;
93366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
93466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
93566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
93666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets string parameter given key.
93766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
93866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
93966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
94066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
94166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
94266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
94366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
94466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
94566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static String getParameterString(final Context context, final String packageName,
94666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key) {
94766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return getParameterString(context, packageName, audioSession, key.toString());
94866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
94966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
95066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
95166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets string parameter given key and arg.
95266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
95366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
95466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
95566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
95666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
95766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param args
95866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
95966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
96066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static String getParameterString(final Context context, final String packageName,
96166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key, final int arg) {
96266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return getParameterString(context, packageName, audioSession, key.toString() + arg);
96366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
96466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
96566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
96666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Opens/initializes the effects session for the given audio session with preferences linked to
96766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * the given package name and context.
96866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
96966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
97066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
97166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
97266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
97366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
97466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static void openSession(final Context context, final String packageName,
97566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession) {
97666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, "openSession(" + context + ", " + packageName + ", " + audioSession + ")");
97766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final String methodTag = "openSession: ";
97866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
97966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // init preferences
98066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final SharedPreferences prefs = context.getSharedPreferences(packageName,
98166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Context.MODE_PRIVATE);
98266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final SharedPreferences.Editor editor = prefs.edit();
98366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
98466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final boolean isGlobalEnabled = prefs.getBoolean(Key.global_enabled.toString(),
98566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                GLOBAL_ENABLED_DEFAULT);
98666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        editor.putBoolean(Key.global_enabled.toString(), isGlobalEnabled);
98766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
98819aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        if (!isGlobalEnabled) {
98919aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen            return;
99019aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        }
99119aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen
99266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Manage audioSession information
99366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
99466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Retrieve AudioSession Id from map
99566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        boolean isExistingAudioSession = false;
99666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
99766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        try {
99866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final Integer currentAudioSession = mPackageSessions.putIfAbsent(packageName,
99966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    audioSession);
100066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (currentAudioSession != null) {
100166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Compare with passed argument
100266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (currentAudioSession == audioSession) {
100366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // FIXME: Normally, we should exit the function here
100466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // BUT: we have to take care of the virtualizer because of
100566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // a bug in the Android Effects Framework
100666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // editor.commit();
100766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // return;
100866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    isExistingAudioSession = true;
100966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                } else {
101066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    closeSession(context, packageName, currentAudioSession);
101166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
101266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
101366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final NullPointerException e) {
101466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, methodTag + e);
101566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.commit();
101666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            return;
101766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
101866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
101966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Because the audioSession is new, get effects & settings from shared preferences
102066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
102166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Virtualizer
102266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // create effect
102366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Virtualizer virtualizerEffect = getVirtualizerEffect(audioSession);
102466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        {
102566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final String errorTag = methodTag + "Virtualizer error: ";
102666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
102766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            try {
102866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // read parameters
102966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final boolean isEnabled = prefs.getBoolean(Key.virt_enabled.toString(),
103066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        VIRTUALIZER_ENABLED_DEFAULT);
103120e6c9bc3240202b3470852a8793a52a3551004aMarco Nelissen                int defaultstrength = isExistingAudioSession ? VIRTUALIZER_STRENGTH_DEFAULT :
103220e6c9bc3240202b3470852a8793a52a3551004aMarco Nelissen                    virtualizerEffect.getRoundedStrength();
103320e6c9bc3240202b3470852a8793a52a3551004aMarco Nelissen                final int strength = prefs.getInt(Key.virt_strength.toString(), defaultstrength);
103466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // init settings
103566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Virtualizer.Settings settings = new Virtualizer.Settings("Virtualizer;strength="
103666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        + strength);
103766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
103866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                virtualizerEffect.setProperties(settings);
103966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
104066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // set parameters
104166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (isGlobalEnabled == true) {
104266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    virtualizerEffect.setEnabled(isEnabled);
104366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                } else {
104466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    virtualizerEffect.setEnabled(false);
104566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
104666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
104766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // get parameters
104866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                settings = virtualizerEffect.getProperties();
104966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, "Parameters: " + settings.toString() + ";enabled=" + isEnabled);
105066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
105166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // update preferences
105266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putBoolean(Key.virt_enabled.toString(), isEnabled);
105366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putInt(Key.virt_strength.toString(), settings.strength);
105466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final RuntimeException e) {
105566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, errorTag + e);
105666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
105766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
105866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
105966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // In case of an existing audio session
106066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Exit after the virtualizer has been re-enabled
106166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
106266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (isExistingAudioSession) {
1063fed4c7bc8b62de6e686d6d3a067c1f10b0a3441ab            editor.apply();
106466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            return;
106566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
106666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
106766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // BassBoost
106866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // create effect
106966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final BassBoost bassBoostEffect = getBassBoostEffect(audioSession);
107066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        {
107166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final String errorTag = methodTag + "BassBoost error: ";
107266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
107366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            try {
107466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // read parameters
107566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final boolean isEnabled = prefs.getBoolean(Key.bb_enabled.toString(),
107666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        BASS_BOOST_ENABLED_DEFAULT);
107766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final int strength = prefs.getInt(Key.bb_strength.toString(),
107866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        BASS_BOOST_STRENGTH_DEFAULT);
107966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
108066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // init settings
108166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                BassBoost.Settings settings = new BassBoost.Settings("BassBoost;strength="
108266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        + strength);
108366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
108466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                bassBoostEffect.setProperties(settings);
108566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
108666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // set parameters
108766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (isGlobalEnabled == true) {
108866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    bassBoostEffect.setEnabled(isEnabled);
108966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                } else {
109066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    bassBoostEffect.setEnabled(false);
109166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
109266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
109366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // get parameters
109466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                settings = bassBoostEffect.getProperties();
109566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, "Parameters: " + settings.toString() + ";enabled=" + isEnabled);
109666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
109766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // update preferences
109866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putBoolean(Key.bb_enabled.toString(), isEnabled);
109966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putInt(Key.bb_strength.toString(), settings.strength);
110066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final RuntimeException e) {
110166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, errorTag + e);
110266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
110366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
110466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
110566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Equalizer
110666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // create effect
110766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Equalizer equalizerEffect = getEqualizerEffect(audioSession);
110866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        {
110966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final String errorTag = methodTag + "Equalizer error: ";
111066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
111166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            try {
111266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short eQNumBands;
111366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short[] bandLevel;
111466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final int[] eQCenterFreq;
111566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short eQNumPresets;
111666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final String[] eQPresetNames;
111766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                short eQPreset;
111866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                synchronized (mEQInitLock) {
111966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // read parameters
112066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mEQBandLevelRange = equalizerEffect.getBandLevelRange();
112166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mEQNumBands = equalizerEffect.getNumberOfBands();
112266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mEQCenterFreq = new int[mEQNumBands];
112366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mEQNumPresets = equalizerEffect.getNumberOfPresets();
112466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mEQPresetNames = new String[mEQNumPresets];
112566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
112666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    for (short preset = 0; preset < mEQNumPresets; preset++) {
112766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQPresetNames[preset] = equalizerEffect.getPresetName(preset);
112866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putString(Key.eq_preset_name.toString() + preset,
112966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                mEQPresetNames[preset]);
113066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
113166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
113266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_level_range.toString() + 0, mEQBandLevelRange[0]);
113366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_level_range.toString() + 1, mEQBandLevelRange[1]);
113466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_num_bands.toString(), mEQNumBands);
113566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_num_presets.toString(), mEQNumPresets);
113666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Resetting the EQ arrays depending on the real # bands with defaults if band <
113766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // default size else 0 by copying default arrays over new ones
113866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short[] eQPresetCIExtremeBandLevel = Arrays.copyOf(
113966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            EQUALIZER_PRESET_CIEXTREME_BAND_LEVEL, mEQNumBands);
114066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short[] eQPresetUserBandLevelDefault = Arrays.copyOf(
114166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            EQUALIZER_PRESET_USER_BAND_LEVEL_DEFAULT, mEQNumBands);
114266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // If no preset prefs set use CI EXTREME (= numPresets)
114366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    eQPreset = (short) prefs
114466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            .getInt(Key.eq_current_preset.toString(), mEQNumPresets);
114566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (eQPreset < mEQNumPresets) {
114666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // OpenSL ES effect presets
114766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        equalizerEffect.usePreset(eQPreset);
114866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        eQPreset = equalizerEffect.getCurrentPreset();
114966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    } else {
115066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        for (short band = 0; band < mEQNumBands; band++) {
115166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            short level = 0;
115266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            if (eQPreset == mEQNumPresets) {
115366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                // CI EXTREME
115466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                level = eQPresetCIExtremeBandLevel[band];
115566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            } else {
115666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                // User
115766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                level = (short) prefs.getInt(
115866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                        Key.eq_preset_user_band_level.toString() + band,
115966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                        eQPresetUserBandLevelDefault[band]);
116066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            }
116166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            equalizerEffect.setBandLevel(band, level);
116266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
116366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
116466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_current_preset.toString(), eQPreset);
116566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
116666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    bandLevel = new short[mEQNumBands];
116766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    for (short band = 0; band < mEQNumBands; band++) {
116866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQCenterFreq[band] = equalizerEffect.getCenterFreq(band);
116966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        bandLevel[band] = equalizerEffect.getBandLevel(band);
117066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
117166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_band_level.toString() + band, bandLevel[band]);
117266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_center_freq.toString() + band, mEQCenterFreq[band]);
117366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_preset_ci_extreme_band_level.toString() + band,
117466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                eQPresetCIExtremeBandLevel[band]);
117566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_preset_user_band_level_default.toString() + band,
117666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                eQPresetUserBandLevelDefault[band]);
117766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
117866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
117966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    eQNumBands = mEQNumBands;
118066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    eQCenterFreq = mEQCenterFreq;
118166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    eQNumPresets = mEQNumPresets;
118266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    eQPresetNames = mEQPresetNames;
118366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
118466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
118566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final boolean isEnabled = prefs.getBoolean(Key.eq_enabled.toString(),
118666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        EQUALIZER_ENABLED_DEFAULT);
118766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putBoolean(Key.eq_enabled.toString(), isEnabled);
118866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (isGlobalEnabled == true) {
118966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    equalizerEffect.setEnabled(isEnabled);
119066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                } else {
119166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    equalizerEffect.setEnabled(false);
119266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
119366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
119466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // dump
119566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, "Parameters: Equalizer");
119666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, "bands=" + eQNumBands);
119766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                String str = "levels=";
119866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                for (short band = 0; band < eQNumBands; band++) {
119966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    str = str + bandLevel[band] + "; ";
120066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
120166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, str);
120266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                str = "center=";
120366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                for (short band = 0; band < eQNumBands; band++) {
120466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    str = str + eQCenterFreq[band] + "; ";
120566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
120666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, str);
120766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                str = "presets=";
120866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                for (short preset = 0; preset < eQNumPresets; preset++) {
120966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    str = str + eQPresetNames[preset] + "; ";
121066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
121166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, str);
121266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, "current=" + eQPreset);
121366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final RuntimeException e) {
121466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, errorTag + e);
121566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
121666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
121766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
121866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // XXX: Preset Reverb not used for the moment, so commented out the effect creation to not
121966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // use MIPS left in the code for (future) reference.
122066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Preset reverb
122166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // create effect
122266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // final PresetReverb presetReverbEffect = getPresetReverbEffect(audioSession);
122366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // {
122466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // final String errorTag = methodTag + "PresetReverb error: ";
122566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        //
122666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // try {
122766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // // read parameters
122866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // final boolean isEnabled = prefs.getBoolean(Key.pr_enabled.toString(),
122966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // PRESET_REVERB_ENABLED_DEFAULT);
123066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // final short preset = (short) prefs.getInt(Key.pr_current_preset.toString(),
123166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // PRESET_REVERB_CURRENT_PRESET_DEFAULT);
123266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        //
123366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // // init settings
123466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // PresetReverb.Settings settings = new PresetReverb.Settings("PresetReverb;preset="
123566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // + preset);
123666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        //
123766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // // read/update preferences
123866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // presetReverbEffect.setProperties(settings);
123966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        //
124066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // // set parameters
124166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // if (isGlobalEnabled == true) {
124266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // presetReverbEffect.setEnabled(isEnabled);
124366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // } else {
124466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // presetReverbEffect.setEnabled(false);
124566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // }
124666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        //
124766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // // get parameters
124866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // settings = presetReverbEffect.getProperties();
124966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Log.v(TAG, "Parameters: " + settings.toString() + ";enabled=" + isEnabled);
125066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        //
125166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // // update preferences
125266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // editor.putBoolean(Key.pr_enabled.toString(), isEnabled);
125366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // editor.putInt(Key.pr_current_preset.toString(), settings.preset);
125466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // } catch (final RuntimeException e) {
125566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Log.e(TAG, errorTag + e);
125666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // }
125766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // }
125866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        editor.commit();
125966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
126066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
126166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
126266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Closes the audio session (release effects) for the given session
126366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
126466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
126566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
126666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
126766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
126866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
126966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static void closeSession(final Context context, final String packageName,
127066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession) {
127166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, "closeSession(" + context + ", " + packageName + ", " + audioSession + ")");
127266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
127366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // PresetReverb
127466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final PresetReverb presetReverb = mPresetReverbInstances.remove(audioSession);
127566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (presetReverb != null) {
127666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            presetReverb.release();
127766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
127866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Equalizer
127966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Equalizer equalizer = mEQInstances.remove(audioSession);
128066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (equalizer != null) {
128166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            equalizer.release();
128266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
128366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // BassBoost
128466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final BassBoost bassBoost = mBassBoostInstances.remove(audioSession);
128566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (bassBoost != null) {
128666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            bassBoost.release();
128766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
128866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Virtualizer
128966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Virtualizer virtualizer = mVirtualizerInstances.remove(audioSession);
129066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (virtualizer != null) {
129166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            virtualizer.release();
129266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
129366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
129466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mPackageSessions.remove(packageName);
129566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
129666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
129766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
129866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Enables or disables all effects (global enable/disable) for a given context, package name and
129966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * audio session. It sets/inits the control mode and preferences and then sets the global
130066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * enabled parameter.
130166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
130266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
130366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
130466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
130566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
130666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param enabled
130766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
130866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static void setEnabledAll(final Context context, final String packageName,
130966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final boolean enabled) {
131066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        initEffectsPreferences(context, packageName, audioSession);
131166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        setParameterBoolean(context, packageName, audioSession, Key.global_enabled, enabled);
131266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
131366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
131466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
131566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets the virtualizer effect for the given audio session. If the effect on the session doesn't
131666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * exist yet, create it and add to collection.
131766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
131866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
131966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
132066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return virtualizerEffect
132166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
132219aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen    private static Virtualizer getVirtualizerEffectNoCreate(final int audioSession) {
132319aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        return mVirtualizerInstances.get(audioSession);
132419aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen    }
132566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static Virtualizer getVirtualizerEffect(final int audioSession) {
132619aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        Virtualizer virtualizerEffect = getVirtualizerEffectNoCreate(audioSession);
132766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (virtualizerEffect == null) {
132866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            try {
132966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final Virtualizer newVirtualizerEffect = new Virtualizer(PRIORITY, audioSession);
133066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                virtualizerEffect = mVirtualizerInstances.putIfAbsent(audioSession,
133166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        newVirtualizerEffect);
133266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (virtualizerEffect == null) {
133366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // put succeeded, use new value
133466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    virtualizerEffect = newVirtualizerEffect;
133566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
133666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final IllegalArgumentException e) {
133766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "Virtualizer: " + e);
133866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final UnsupportedOperationException e) {
133966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "Virtualizer: " + e);
134066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final RuntimeException e) {
134166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "Virtualizer: " + e);
134266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
134366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
134466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return virtualizerEffect;
134566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
134666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
134766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
134866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets the bass boost effect for the given audio session. If the effect on the session doesn't
134966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * exist yet, create it and add to collection.
135066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
135166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
135266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
135366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return bassBoostEffect
135466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
135519aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen    private static BassBoost getBassBoostEffectNoCreate(final int audioSession) {
135619aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        return mBassBoostInstances.get(audioSession);
135719aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen    }
135866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static BassBoost getBassBoostEffect(final int audioSession) {
135919aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen
136019aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        BassBoost bassBoostEffect = getBassBoostEffectNoCreate(audioSession);
136166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (bassBoostEffect == null) {
136266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            try {
136366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final BassBoost newBassBoostEffect = new BassBoost(PRIORITY, audioSession);
136466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                bassBoostEffect = mBassBoostInstances.putIfAbsent(audioSession, newBassBoostEffect);
136566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (bassBoostEffect == null) {
136666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // put succeeded, use new value
136766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    bassBoostEffect = newBassBoostEffect;
136866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
136966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final IllegalArgumentException e) {
137066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "BassBoost: " + e);
137166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final UnsupportedOperationException e) {
137266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "BassBoost: " + e);
137366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final RuntimeException e) {
137466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "BassBoost: " + e);
137566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
137666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
137766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return bassBoostEffect;
137866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
137966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
138066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
138166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets the equalizer effect for the given audio session. If the effect on the session doesn't
138266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * exist yet, create it and add to collection.
138366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
138466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
138566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
138666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return equalizerEffect
138766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
138819aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen    private static Equalizer getEqualizerEffectNoCreate(final int audioSession) {
138919aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        return mEQInstances.get(audioSession);
139019aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen    }
139166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static Equalizer getEqualizerEffect(final int audioSession) {
139219aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        Equalizer equalizerEffect = getEqualizerEffectNoCreate(audioSession);
139366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (equalizerEffect == null) {
139466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            try {
139566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final Equalizer newEqualizerEffect = new Equalizer(PRIORITY, audioSession);
139666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                equalizerEffect = mEQInstances.putIfAbsent(audioSession, newEqualizerEffect);
139766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (equalizerEffect == null) {
139866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // put succeeded, use new value
139966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    equalizerEffect = newEqualizerEffect;
140066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
140166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final IllegalArgumentException e) {
140266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "Equalizer: " + e);
140366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final UnsupportedOperationException e) {
140466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "Equalizer: " + e);
140566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final RuntimeException e) {
140666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "Equalizer: " + e);
140766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
140866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
140966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return equalizerEffect;
141066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
141166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
141266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // XXX: Preset Reverb not used for the moment, so commented out the effect creation to not
141366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // use MIPS
141466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // /**
141566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // * Gets the preset reverb effect for the given audio session. If the effect on the session
141666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // * doesn't exist yet, create it and add to collection.
141766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // *
141866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // * @param audioSession
141966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // * System wide unique audio session identifier.
142066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // * @return presetReverbEffect
142166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // */
142266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // private static PresetReverb getPresetReverbEffect(final int audioSession) {
142366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // PresetReverb presetReverbEffect = mPresetReverbInstances.get(audioSession);
142466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // if (presetReverbEffect == null) {
142566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // try {
142666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // final PresetReverb newPresetReverbEffect = new PresetReverb(PRIORITY, audioSession);
142766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // presetReverbEffect = mPresetReverbInstances.putIfAbsent(audioSession,
142866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // newPresetReverbEffect);
142966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // if (presetReverbEffect == null) {
143066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // // put succeeded, use new value
143166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // presetReverbEffect = newPresetReverbEffect;
143266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // }
143366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // } catch (final IllegalArgumentException e) {
143466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Log.e(TAG, "PresetReverb: " + e);
143566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // } catch (final UnsupportedOperationException e) {
143666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Log.e(TAG, "PresetReverb: " + e);
143766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // } catch (final RuntimeException e) {
143866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Log.e(TAG, "PresetReverb: " + e);
143966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // }
144066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // }
144166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // return presetReverbEffect;
144266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // }
144366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen}
1444