ControlPanelEffect.java revision bc778ede573dc74646d42dfe96997f74b23ac61d
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    private final static short[][] EQUALIZER_PRESET_OPENSL_ES_BAND_LEVEL_DEFAULT = new short[EQUALIZER_NUMBER_PRESETS_DEFAULT][EQUALIZER_NUMBER_BANDS_DEFAULT];
13166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
13266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // EQ effect properties which are invariable over all EQ effects sessions
13366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static short[] mEQBandLevelRange = EQUALIZER_BAND_LEVEL_RANGE_DEFAULT;
13466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static short mEQNumBands = EQUALIZER_NUMBER_BANDS_DEFAULT;
13566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static int[] mEQCenterFreq = EQUALIZER_CENTER_FREQ_DEFAULT;
13666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static short mEQNumPresets = EQUALIZER_NUMBER_PRESETS_DEFAULT;
13766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static short[][] mEQPresetOpenSLESBandLevel = EQUALIZER_PRESET_OPENSL_ES_BAND_LEVEL_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);
17566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int vIStrength = prefs.getInt(Key.virt_strength.toString(),
17666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    VIRTUALIZER_STRENGTH_DEFAULT);
17766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putBoolean(Key.virt_enabled.toString(), isVIEnabled);
17866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putInt(Key.virt_strength.toString(), vIStrength);
179bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            {
180bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                final MediaPlayer mediaPlayer = new MediaPlayer();
181bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                final int session = mediaPlayer.getAudioSessionId();
182bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                Virtualizer virtualizerEffect = null;
183bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                try {
184bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    virtualizerEffect = new Virtualizer(PRIORITY, session);
185bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    editor.putBoolean(Key.virt_strength_supported.toString(),
186bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                            virtualizerEffect.getStrengthSupported());
187bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                } finally {
188bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    if (virtualizerEffect != null) {
189bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                        Log.d(TAG, "Releasing dummy Virtualizer effect");
190bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                        virtualizerEffect.release();
191bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    }
192bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                    mediaPlayer.release();
193bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen                }
194bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen            }
19519aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen
19666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // BassBoost
19766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final boolean isBBEnabled = prefs.getBoolean(Key.bb_enabled.toString(),
19866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    BASS_BOOST_ENABLED_DEFAULT);
19966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int bBStrength = prefs.getInt(Key.bb_strength.toString(),
20066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    BASS_BOOST_STRENGTH_DEFAULT);
20166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putBoolean(Key.bb_enabled.toString(), isBBEnabled);
20266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putInt(Key.bb_strength.toString(), bBStrength);
20319aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen
20466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Equalizer
20566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            synchronized (mEQInitLock) {
20666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // If EQ is not initialized already create "dummy" audio session created by
20766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // MediaPlayer and create effect on it to retrieve the invariable EQ properties
20866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (!mIsEQInitialized) {
20966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final MediaPlayer mediaPlayer = new MediaPlayer();
21066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final int session = mediaPlayer.getAudioSessionId();
21166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Equalizer equalizerEffect = null;
21266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    try {
21319aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                        Log.d(TAG, "Creating dummy EQ effect on session " + session);
21466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        equalizerEffect = new Equalizer(PRIORITY, session);
21566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
21666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQBandLevelRange = equalizerEffect.getBandLevelRange();
21766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQNumBands = equalizerEffect.getNumberOfBands();
21866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQCenterFreq = new int[mEQNumBands];
21966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        for (short band = 0; band < mEQNumBands; band++) {
22066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            mEQCenterFreq[band] = equalizerEffect.getCenterFreq(band);
22166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
22266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQNumPresets = equalizerEffect.getNumberOfPresets();
22366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQPresetNames = new String[mEQNumPresets];
22466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQPresetOpenSLESBandLevel = new short[mEQNumPresets][mEQNumBands];
22566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        for (short preset = 0; preset < mEQNumPresets; preset++) {
22666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            mEQPresetNames[preset] = equalizerEffect.getPresetName(preset);
22766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            equalizerEffect.usePreset(preset);
22866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            for (short band = 0; band < mEQNumBands; band++) {
22966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                mEQPresetOpenSLESBandLevel[preset][band] = equalizerEffect
23066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                        .getBandLevel(band);
23166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            }
23266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
23366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
23466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mIsEQInitialized = true;
23566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    } catch (final IllegalStateException e) {
23666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        Log.e(TAG, "Equalizer: " + e);
23766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    } catch (final IllegalArgumentException e) {
23866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        Log.e(TAG, "Equalizer: " + e);
23966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    } catch (final UnsupportedOperationException e) {
24066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        Log.e(TAG, "Equalizer: " + e);
24166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    } catch (final RuntimeException e) {
24266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        Log.e(TAG, "Equalizer: " + e);
24366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    } finally {
24466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (equalizerEffect != null) {
24519aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            Log.d(TAG, "Releasing dummy EQ effect");
24666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            equalizerEffect.release();
24766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
24866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mediaPlayer.release();
24966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
25066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // When there was a failure set some good defaults
25166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (!mIsEQInitialized) {
25266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            mEQPresetOpenSLESBandLevel = new short[mEQNumPresets][mEQNumBands];
25366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            for (short preset = 0; preset < mEQNumPresets; preset++) {
25466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                // Init preset names to a dummy name
25566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                mEQPresetNames[preset] = prefs.getString(
25666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                        Key.eq_preset_name.toString() + preset,
25766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                        EQUALIZER_PRESET_NAME_DEFAULT + preset);
25866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                if (preset < EQUALIZER_PRESET_OPENSL_ES_BAND_LEVEL_DEFAULT.length) {
25966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    mEQPresetOpenSLESBandLevel[preset] = Arrays.copyOf(
26066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                            EQUALIZER_PRESET_OPENSL_ES_BAND_LEVEL_DEFAULT[preset],
26166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                            mEQNumBands);
26266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                }
26366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            }
26466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
26566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
26666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
26766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putInt(Key.eq_level_range.toString() + 0, mEQBandLevelRange[0]);
26866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putInt(Key.eq_level_range.toString() + 1, mEQBandLevelRange[1]);
26966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putInt(Key.eq_num_bands.toString(), mEQNumBands);
27066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putInt(Key.eq_num_presets.toString(), mEQNumPresets);
27166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Resetting the EQ arrays depending on the real # bands with defaults if
27266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // band < default size else 0 by copying default arrays over new ones
27366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short[] eQPresetCIExtremeBandLevel = Arrays.copyOf(
27466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        EQUALIZER_PRESET_CIEXTREME_BAND_LEVEL, mEQNumBands);
27566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short[] eQPresetUserBandLevelDefault = Arrays.copyOf(
27666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        EQUALIZER_PRESET_USER_BAND_LEVEL_DEFAULT, mEQNumBands);
27766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // If no preset prefs set use CI EXTREME (= numPresets)
27866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short eQPreset = (short) prefs.getInt(Key.eq_current_preset.toString(),
27966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQNumPresets);
28066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putInt(Key.eq_current_preset.toString(), eQPreset);
28166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short[] bandLevel = new short[mEQNumBands];
28266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                for (short band = 0; band < mEQNumBands; band++) {
28366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (controlMode == ControlMode.CONTROL_PREFERENCES) {
28466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (eQPreset < mEQNumPresets) {
28566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // OpenSL ES effect presets
28666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bandLevel[band] = mEQPresetOpenSLESBandLevel[eQPreset][band];
28766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        } else if (eQPreset == mEQNumPresets) {
28866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // CI EXTREME
28966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bandLevel[band] = eQPresetCIExtremeBandLevel[band];
29066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        } else {
29166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // User
29266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bandLevel[band] = (short) prefs.getInt(
29366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    Key.eq_preset_user_band_level.toString() + band,
29466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    eQPresetUserBandLevelDefault[band]);
29566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
29666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_band_level.toString() + band, bandLevel[band]);
29766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
29866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_center_freq.toString() + band, mEQCenterFreq[band]);
29966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_preset_ci_extreme_band_level.toString() + band,
30066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            eQPresetCIExtremeBandLevel[band]);
30166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_preset_user_band_level_default.toString() + band,
30266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            eQPresetUserBandLevelDefault[band]);
30366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
30466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                for (short preset = 0; preset < mEQNumPresets; preset++) {
30566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putString(Key.eq_preset_name.toString() + preset, mEQPresetNames[preset]);
30666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    for (short band = 0; band < mEQNumBands; band++) {
30766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_preset_opensl_es_band_level.toString() + preset + "_"
30866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                + band, mEQPresetOpenSLESBandLevel[preset][band]);
30966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
31066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
31166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
31266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final boolean isEQEnabled = prefs.getBoolean(Key.eq_enabled.toString(),
31366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    EQUALIZER_ENABLED_DEFAULT);
31466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putBoolean(Key.eq_enabled.toString(), isEQEnabled);
31566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
31666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Preset reverb
31766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final boolean isEnabledPR = prefs.getBoolean(Key.pr_enabled.toString(),
31866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    PRESET_REVERB_ENABLED_DEFAULT);
31966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final short presetPR = (short) prefs.getInt(Key.pr_current_preset.toString(),
32066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    PRESET_REVERB_CURRENT_PRESET_DEFAULT);
32166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putBoolean(Key.pr_enabled.toString(), isEnabledPR);
32266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putInt(Key.pr_current_preset.toString(), presetPR);
32366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
32466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.commit();
32566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final RuntimeException e) {
32666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "initEffectsPreferences: processingEnabled: " + e);
32766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
32866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
32966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
33066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
33166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets the effect control mode based on the given audio session in the control panel. Control
33266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * mode defines if the control panel is controlling effects and/or preferences
33366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
33466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
33566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
33666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return effect control mode
33766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
33866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static ControlMode getControlMode(final int audioSession) {
33966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (audioSession == AudioEffect.ERROR_BAD_VALUE) {
34066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            return ControlMode.CONTROL_PREFERENCES;
34166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
34266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return ControlMode.CONTROL_EFFECTS;
34366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
34466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
34566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
34666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Sets boolean parameter to value for given key
34766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
34866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
34966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
35066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
35166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
35266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
35366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param value
35466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
35566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static void setParameterBoolean(final Context context, final String packageName,
35666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key, final boolean value) {
35766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        try {
35866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final SharedPreferences prefs = context.getSharedPreferences(packageName,
35966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Context.MODE_PRIVATE);
36066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final ControlMode controlMode = getControlMode(audioSession);
36166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            boolean enabled = value;
36266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
36366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Global on/off
36466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (key == Key.global_enabled) {
36566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                boolean processingEnabled = false;
36666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (value == true) {
36766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // enable all with respect to preferences
36866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (controlMode == ControlMode.CONTROL_EFFECTS) {
36966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final Virtualizer virtualizerEffect = getVirtualizerEffect(audioSession);
37066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (virtualizerEffect != null) {
37166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            virtualizerEffect.setEnabled(prefs.getBoolean(
37266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    Key.virt_enabled.toString(), VIRTUALIZER_ENABLED_DEFAULT));
37319aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            final int vIStrength = prefs.getInt(Key.virt_strength.toString(),
37419aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                                    VIRTUALIZER_STRENGTH_DEFAULT);
37519aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            setParameterInt(context, packageName,
37619aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                                    audioSession, Key.virt_strength, vIStrength);
37766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
37866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final BassBoost bassBoostEffect = getBassBoostEffect(audioSession);
37966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (bassBoostEffect != null) {
38066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bassBoostEffect.setEnabled(prefs.getBoolean(Key.bb_enabled.toString(),
38166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    BASS_BOOST_ENABLED_DEFAULT));
38219aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            final int bBStrength = prefs.getInt(Key.bb_strength.toString(),
38319aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                                    BASS_BOOST_STRENGTH_DEFAULT);
38419aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            setParameterInt(context, packageName,
38519aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                                    audioSession, Key.bb_strength, bBStrength);
38666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
38766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final Equalizer equalizerEffect = getEqualizerEffect(audioSession);
38866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (equalizerEffect != null) {
38966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            equalizerEffect.setEnabled(prefs.getBoolean(Key.eq_enabled.toString(),
39066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    EQUALIZER_ENABLED_DEFAULT));
39119aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            final int[] bandLevels = getParameterIntArray(context,
39219aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                                    packageName, audioSession, Key.eq_band_level);
39319aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            final int len = bandLevels.length;
39419aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            for (short band = 0; band < len; band++) {
39519aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                                final int level = bandLevels[band];
39619aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                                setParameterInt(context, packageName,
39719aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                                        audioSession, Key.eq_band_level, level, band);
39819aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            }
39966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
40066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // XXX: Preset Reverb not used for the moment, so commented out the effect
40166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // creation to not use MIPS
40266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // final PresetReverb presetReverbEffect =
40366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // getPresetReverbEffect(audioSession);
40466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // if (presetReverbEffect != null) {
40566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // presetReverbEffect.setEnabled(prefs.getBoolean(
40666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // Key.pr_enabled.toString(), PRESET_REVERB_ENABLED_DEFAULT));
40766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // }
40866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
40966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
41066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    processingEnabled = true;
41166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Log.v(TAG, "processingEnabled=" + processingEnabled);
41266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
41366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                } else {
41466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // disable all
41566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (controlMode == ControlMode.CONTROL_EFFECTS) {
41619aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                        final Virtualizer virtualizerEffect = getVirtualizerEffectNoCreate(audioSession);
41766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (virtualizerEffect != null) {
41819aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            mVirtualizerInstances.remove(audioSession, virtualizerEffect);
41966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            virtualizerEffect.setEnabled(false);
42019aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            virtualizerEffect.release();
42166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
42219aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                        final BassBoost bassBoostEffect = getBassBoostEffectNoCreate(audioSession);
42366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (bassBoostEffect != null) {
42419aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            mBassBoostInstances.remove(audioSession, bassBoostEffect);
42566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bassBoostEffect.setEnabled(false);
42619aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            bassBoostEffect.release();
42766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
42819aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                        final Equalizer equalizerEffect = getEqualizerEffectNoCreate(audioSession);
42966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (equalizerEffect != null) {
43019aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            mEQInstances.remove(audioSession, equalizerEffect);
43166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            equalizerEffect.setEnabled(false);
43219aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen                            equalizerEffect.release();
43366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
43466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // XXX: Preset Reverb not used for the moment, so commented out the effect
43566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // creation to not use MIPS
43666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // final PresetReverb presetReverbEffect =
43766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // getPresetReverbEffect(audioSession);
43866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // if (presetReverbEffect != null) {
43966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // presetReverbEffect.setEnabled(false);
44066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // }
44166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
44266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
44366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    processingEnabled = false;
44466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Log.v(TAG, "processingEnabled=" + processingEnabled);
44566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
44666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                enabled = processingEnabled;
44766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else if (controlMode == ControlMode.CONTROL_EFFECTS) {
44866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final boolean isGlobalEnabled = prefs.getBoolean(Key.global_enabled.toString(),
44966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        GLOBAL_ENABLED_DEFAULT);
45066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (isGlobalEnabled == true) {
45166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Set effect parameters
45266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    switch (key) {
45366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
45466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    case global_enabled:
45566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // Global, already handled, to get out error free
45666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        break;
45766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
45866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Virtualizer
45966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    case virt_enabled:
46066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final Virtualizer virtualizerEffect = getVirtualizerEffect(audioSession);
46166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (virtualizerEffect != null) {
46266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            virtualizerEffect.setEnabled(value);
46366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            enabled = virtualizerEffect.getEnabled();
46466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
46566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        break;
46666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
46766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // BassBoost
46866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    case bb_enabled:
46966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final BassBoost bassBoostEffect = getBassBoostEffect(audioSession);
47066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (bassBoostEffect != null) {
47166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bassBoostEffect.setEnabled(value);
47266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            enabled = bassBoostEffect.getEnabled();
47366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
47466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        break;
47566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
47666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Equalizer
47766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    case eq_enabled:
47866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final Equalizer equalizerEffect = getEqualizerEffect(audioSession);
47966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (equalizerEffect != null) {
48066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            equalizerEffect.setEnabled(value);
48166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            enabled = equalizerEffect.getEnabled();
48266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
48366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        break;
48466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
48566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // PresetReverb
48666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    case pr_enabled:
48766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // XXX: Preset Reverb not used for the moment, so commented out the effect
48866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // creation to not use MIPS
48966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // final PresetReverb presetReverbEffect =
49066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // getPresetReverbEffect(audioSession);
49166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // if (presetReverbEffect != null) {
49266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // presetReverbEffect.setEnabled(value);
49366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // enabled = presetReverbEffect.getEnabled();
49466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // }
49566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        break;
49666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
49766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    default:
49866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        Log.e(TAG, "Unknown/unsupported key " + key);
49966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        return;
50066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
50166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
50266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
50366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
50466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
50566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set preferences
50666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final SharedPreferences.Editor editor = prefs.edit();
50766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putBoolean(key.toString(), enabled);
50866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.commit();
50966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
51066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final RuntimeException e) {
51166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "setParameterBoolean: " + key + "; " + value + "; " + e);
51266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
51366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
51466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
51566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
51666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets boolean parameter for given key
51766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
51866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
51966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
52066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
52166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
52266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
52366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
52466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
52566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static Boolean getParameterBoolean(final Context context, final String packageName,
52666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key) {
52766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final SharedPreferences prefs = context.getSharedPreferences(packageName,
52866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Context.MODE_PRIVATE);
52966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        boolean value = false;
53066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
53166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        try {
53266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            value = prefs.getBoolean(key.toString(), value);
53366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final RuntimeException e) {
53466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "getParameterBoolean: " + key + "; " + value + "; " + e);
53566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
53666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
53766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return value;
53866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
53966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
54066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
54166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
54266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Sets int parameter for given key and value arg0, arg1
54366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
54466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
54566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
54666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
54766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
54866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
54966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param arg0
55066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param arg1
55166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
55266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static void setParameterInt(final Context context, final String packageName,
55366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key, final int arg0, final int arg1) {
55466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        String strKey = key.toString();
55566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        int value = arg0;
55666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
55766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        try {
55866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final SharedPreferences prefs = context.getSharedPreferences(packageName,
55966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Context.MODE_PRIVATE);
56066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final SharedPreferences.Editor editor = prefs.edit();
56166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final ControlMode controlMode = getControlMode(audioSession);
56266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
56366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set effect parameters
56466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (controlMode == ControlMode.CONTROL_EFFECTS) {
56566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
56666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                switch (key) {
56766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
56866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Virtualizer
56966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case virt_strength: {
57066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final Virtualizer virtualizerEffect = getVirtualizerEffect(audioSession);
57166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (virtualizerEffect != null) {
57266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        virtualizerEffect.setStrength((short) value);
57366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        value = virtualizerEffect.getRoundedStrength();
57466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
57566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
57666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
57766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // BassBoost
57866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case bb_strength: {
57966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final BassBoost bassBoostEffect = getBassBoostEffect(audioSession);
58066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (bassBoostEffect != null) {
58166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        bassBoostEffect.setStrength((short) value);
58266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        value = bassBoostEffect.getRoundedStrength();
58366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
58466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
58566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
58666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Equalizer
58766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_band_level: {
58866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (arg1 == DUMMY_ARGUMENT) {
58966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        throw new IllegalArgumentException("Dummy arg passed.");
59066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
59166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short band = (short) arg1;
59266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    strKey = strKey + band;
59366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final Equalizer equalizerEffect = getEqualizerEffect(audioSession);
59466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (equalizerEffect != null) {
59566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        equalizerEffect.setBandLevel(band, (short) value);
59666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        value = equalizerEffect.getBandLevel(band);
59766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // save band level in User preset
59866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_preset_user_band_level.toString() + band, value);
59966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
60066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
60166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
60266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_current_preset: {
60366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final Equalizer equalizerEffect = getEqualizerEffect(audioSession);
60466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (equalizerEffect != null) {
60566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final short preset = (short) value;
60666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final int numBands = prefs.getInt(Key.eq_num_bands.toString(),
60766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                EQUALIZER_NUMBER_BANDS_DEFAULT);
60866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        final int numPresets = prefs.getInt(Key.eq_num_presets.toString(),
60966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                EQUALIZER_NUMBER_PRESETS_DEFAULT);
61066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
61166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (preset < numPresets) {
61266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // OpenSL ES EQ Effect presets
61366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            equalizerEffect.usePreset(preset);
61466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            value = equalizerEffect.getCurrentPreset();
61566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        } else {
61666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            final short[] eQPresetCIExtremeBandLevelDefault = Arrays.copyOf(
61766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    EQUALIZER_PRESET_CIEXTREME_BAND_LEVEL, numBands);
61866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            final short[] eQPresetUserBandLevelDefault = Arrays.copyOf(
61966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    EQUALIZER_PRESET_USER_BAND_LEVEL_DEFAULT, numBands);
62066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // Set the band levels manually for custom presets
62166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            for (short band = 0; band < numBands; band++) {
62266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                short bandLevel = 0;
62366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                if (preset == numPresets) {
62466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    // CI EXTREME
62566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    bandLevel = (short) prefs.getInt(
62666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                            Key.eq_preset_ci_extreme_band_level.toString() + band,
62766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                            eQPresetCIExtremeBandLevelDefault[band]);
62866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                } else {
62966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    // User
63066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    bandLevel = (short) prefs.getInt(
63166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                            Key.eq_preset_user_band_level.toString() + band,
63266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                            eQPresetUserBandLevelDefault[band]);
63366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                }
63466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                equalizerEffect.setBandLevel(band, bandLevel);
63566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            }
63666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
63766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
63866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // update band levels
63966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        for (short band = 0; band < numBands; band++) {
64066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            final short level = equalizerEffect.getBandLevel(band);
64166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            editor.putInt(Key.eq_band_level.toString() + band, level);
64266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
64366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
64466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
64566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
64666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_preset_user_band_level:
64766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Fall through
64866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_preset_user_band_level_default:
64966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Fall through
65066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_preset_ci_extreme_band_level: {
65166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (arg1 == DUMMY_ARGUMENT) {
65266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        throw new IllegalArgumentException("Dummy arg passed.");
65366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
65466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short band = (short) arg1;
65566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    strKey = strKey + band;
65666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
65766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
65866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case pr_current_preset:
65966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // XXX: Preset Reverb not used for the moment, so commented out the effect
66066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // creation to not use MIPS
66166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // final PresetReverb presetReverbEffect = getPresetReverbEffect(audioSession);
66266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // if (presetReverbEffect != null) {
66366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // presetReverbEffect.setPreset((short) value);
66466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // value = presetReverbEffect.getPreset();
66566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // }
66666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
66766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                default:
66866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Log.e(TAG, "setParameterInt: Unknown/unsupported key " + key);
66966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    return;
67066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
67166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } else {
67266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                switch (key) {
67366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Virtualizer
67466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case virt_strength:
67566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Do nothing
67666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
67766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case virt_type:
67866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Do nothing
67966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
68066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
68166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // BassBoost
68266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case bb_strength:
68366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Do nothing
68466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
68566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
68666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Equalizer
68766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_band_level: {
68866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (arg1 == DUMMY_ARGUMENT) {
68966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        throw new IllegalArgumentException("Dummy arg passed.");
69066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
69166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short band = (short) arg1;
69266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    strKey = strKey + band;
69366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
69466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_preset_user_band_level.toString() + band, value);
69566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
69666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
69766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_current_preset: {
69866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short preset = (short) value;
69966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final int numBands = prefs.getInt(Key.eq_num_bands.toString(),
70066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            EQUALIZER_NUMBER_BANDS_DEFAULT);
70166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final int numPresets = prefs.getInt(Key.eq_num_presets.toString(),
70266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            EQUALIZER_NUMBER_PRESETS_DEFAULT);
70366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
70466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short[][] eQPresetOpenSLESBandLevelDefault = Arrays.copyOf(
70566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            EQUALIZER_PRESET_OPENSL_ES_BAND_LEVEL_DEFAULT, numBands);
70666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short[] eQPresetCIExtremeBandLevelDefault = Arrays.copyOf(
70766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            EQUALIZER_PRESET_CIEXTREME_BAND_LEVEL, numBands);
70866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short[] eQPresetUserBandLevelDefault = Arrays.copyOf(
70966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            EQUALIZER_PRESET_USER_BAND_LEVEL_DEFAULT, numBands);
71066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    for (short band = 0; band < numBands; band++) {
71166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        short bandLevel = 0;
71266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        if (preset < numPresets) {
71366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // OpenSL ES EQ Effect presets
71466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bandLevel = (short) prefs.getInt(
71566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    Key.eq_preset_opensl_es_band_level.toString() + preset + "_"
71666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                            + band, eQPresetOpenSLESBandLevelDefault[preset][band]);
71766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        } else if (preset == numPresets) {
71866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // CI EXTREME
71966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bandLevel = (short) prefs.getInt(
72066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    Key.eq_preset_ci_extreme_band_level.toString() + band,
72166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    eQPresetCIExtremeBandLevelDefault[band]);
72266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        } else {
72366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            // User
72466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            bandLevel = (short) prefs.getInt(
72566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    Key.eq_preset_user_band_level.toString() + band,
72666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                    eQPresetUserBandLevelDefault[band]);
72766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
72866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_band_level.toString() + band, bandLevel);
72966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
73066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
73166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
73266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_preset_user_band_level:
73366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Fall through
73466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_preset_user_band_level_default:
73566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Fall through
73666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case eq_preset_ci_extreme_band_level: {
73766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (arg1 == DUMMY_ARGUMENT) {
73866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        throw new IllegalArgumentException("Dummy arg passed.");
73966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
74066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short band = (short) arg1;
74166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    strKey = strKey + band;
74266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
74366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
74466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                case pr_current_preset:
74566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Do nothing
74666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    break;
74766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                default:
74866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Log.e(TAG, "setParameterInt: Unknown/unsupported key " + key);
74966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    return;
75066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
75166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
75266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
75366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Set preferences
75466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.putInt(strKey, value);
755b6436a644aa2e78dac41e4971b60d0b8ad95884eMarco Nelissen            editor.apply();
75666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
75766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final RuntimeException e) {
75866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "setParameterInt: " + key + "; " + arg0 + "; " + arg1 + "; " + e);
75966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
76066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
76166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
76266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
76366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
76466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Sets int parameter for given key and value arg
76566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
76666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
76766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
76866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
76966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
77066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
77166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param arg
77266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
77366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static void setParameterInt(final Context context, final String packageName,
77466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key, final int arg) {
77566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        setParameterInt(context, packageName, audioSession, key, arg, DUMMY_ARGUMENT);
77666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
77766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
77866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
77966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets int parameter given key
78066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
78166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
78266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
78366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
78466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
78566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
78666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
78766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
78866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static int getParameterInt(final Context context, final String packageName,
78966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final String key) {
79066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        int value = 0;
79166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
79266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        try {
79366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final SharedPreferences prefs = context.getSharedPreferences(packageName,
79466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Context.MODE_PRIVATE);
79566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            value = prefs.getInt(key, value);
79666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final RuntimeException e) {
79766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "getParameterInt: " + key + "; " + e);
79866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
79966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
80066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return value;
80166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
80266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
80366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
80466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets int parameter given key
80566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
80666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
80766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
80866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
80966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
81066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
81166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
81266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
81366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static int getParameterInt(final Context context, final String packageName,
81466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key) {
81566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return getParameterInt(context, packageName, audioSession, key.toString());
81666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
81766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
81866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
81966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets int parameter given key and arg
82066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
82166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
82266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
82366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
82466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
82566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
82666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
82766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param arg
82866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
82966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
83066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static int getParameterInt(final Context context, final String packageName,
83166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key, final int arg) {
83266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return getParameterInt(context, packageName, audioSession, key.toString() + arg);
83366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
83466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
83566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
83666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets int parameter given key, arg0 and arg1
83766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
83866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
83966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
84066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
84166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
84266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
84366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
84466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param arg0
84566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param arg1
84666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
84766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
84866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static int getParameterInt(final Context context, final String packageName,
84966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key, final int arg0, final int arg1) {
85066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return getParameterInt(context, packageName, audioSession, key.toString() + arg0 + "_"
85166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                + arg1);
85266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
85366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
85466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
85566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets integer array parameter given key. Returns null if not found.
85666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
85766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
85866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
85966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
86066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
86166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
86266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value array
86366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
86466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static int[] getParameterIntArray(final Context context, final String packageName,
86566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key) {
86666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final SharedPreferences prefs = context.getSharedPreferences(packageName,
86766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Context.MODE_PRIVATE);
86866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
86966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        int[] intArray = null;
87066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        try {
87166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Get effect parameters
87266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            switch (key) {
87366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            case eq_level_range: {
87466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                intArray = new int[2];
87566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                break;
87666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
87766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            case eq_center_freq:
87866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Fall through
87966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            case eq_band_level:
88066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Fall through
88166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            case eq_preset_user_band_level:
88266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Fall through
88366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            case eq_preset_user_band_level_default:
88466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Fall through
88566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            case eq_preset_ci_extreme_band_level: {
88666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final int numBands = prefs.getInt(Key.eq_num_bands.toString(), 0);
88766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                intArray = new int[numBands];
88866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                break;
88966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
89066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            default:
89166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "getParameterIntArray: Unknown/unsupported key " + key);
89266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                return null;
89366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
89466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
89566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            for (int i = 0; i < intArray.length; i++) {
89666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                intArray[i] = prefs.getInt(key.toString() + i, 0);
89766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
89866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
89966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final RuntimeException e) {
90066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "getParameterIntArray: " + key + "; " + e);
90166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
90266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
90366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return intArray;
90466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
90566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
90666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
90766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets string parameter given key. Returns empty string if not found.
90866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
90966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
91066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
91166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
91266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
91366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
91466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
91566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
91666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static String getParameterString(final Context context, final String packageName,
91766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final String key) {
91866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        String value = "";
91966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        try {
92066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final SharedPreferences prefs = context.getSharedPreferences(packageName,
92166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    Context.MODE_PRIVATE);
92266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
92366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            // Get effect parameters
92466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            value = prefs.getString(key, value);
92566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
92666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final RuntimeException e) {
92766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, "getParameterString: " + key + "; " + e);
92866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
92966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
93066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return value;
93166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
93266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
93366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
93466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets string parameter given key.
93566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
93666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
93766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
93866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
93966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
94066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param key
94166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
94266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
94366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static String getParameterString(final Context context, final String packageName,
94466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key) {
94566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return getParameterString(context, packageName, audioSession, key.toString());
94666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
94766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
94866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
94966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets string parameter given key and arg.
95066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
95166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
95266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
95366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
95466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
95566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param args
95666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return parameter value
95766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
95866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static String getParameterString(final Context context, final String packageName,
95966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final Key key, final int arg) {
96066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return getParameterString(context, packageName, audioSession, key.toString() + arg);
96166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
96266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
96366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
96466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Opens/initializes the effects session for the given audio session with preferences linked to
96566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * the given package name and context.
96666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
96766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
96866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
96966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
97066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
97166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
97266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static void openSession(final Context context, final String packageName,
97366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession) {
97466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, "openSession(" + context + ", " + packageName + ", " + audioSession + ")");
97566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final String methodTag = "openSession: ";
97666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
97766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // init preferences
97866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final SharedPreferences prefs = context.getSharedPreferences(packageName,
97966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Context.MODE_PRIVATE);
98066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final SharedPreferences.Editor editor = prefs.edit();
98166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
98266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final boolean isGlobalEnabled = prefs.getBoolean(Key.global_enabled.toString(),
98366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                GLOBAL_ENABLED_DEFAULT);
98466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        editor.putBoolean(Key.global_enabled.toString(), isGlobalEnabled);
98566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
98619aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        if (!isGlobalEnabled) {
98719aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen            return;
98819aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        }
98919aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen
99066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Manage audioSession information
99166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
99266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Retrieve AudioSession Id from map
99366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        boolean isExistingAudioSession = false;
99466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
99566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        try {
99666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final Integer currentAudioSession = mPackageSessions.putIfAbsent(packageName,
99766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    audioSession);
99866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            if (currentAudioSession != null) {
99966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // Compare with passed argument
100066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (currentAudioSession == audioSession) {
100166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // FIXME: Normally, we should exit the function here
100266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // BUT: we have to take care of the virtualizer because of
100366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // a bug in the Android Effects Framework
100466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // editor.commit();
100566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // return;
100666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    isExistingAudioSession = true;
100766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                } else {
100866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    closeSession(context, packageName, currentAudioSession);
100966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
101066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
101166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        } catch (final NullPointerException e) {
101266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            Log.e(TAG, methodTag + e);
101366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            editor.commit();
101466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            return;
101566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
101666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
101766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Because the audioSession is new, get effects & settings from shared preferences
101866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
101966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Virtualizer
102066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // create effect
102166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Virtualizer virtualizerEffect = getVirtualizerEffect(audioSession);
102266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        {
102366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final String errorTag = methodTag + "Virtualizer error: ";
102466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
102566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            try {
102666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // read parameters
102766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final boolean isEnabled = prefs.getBoolean(Key.virt_enabled.toString(),
102866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        VIRTUALIZER_ENABLED_DEFAULT);
102966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final int strength = prefs.getInt(Key.virt_strength.toString(),
103066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        VIRTUALIZER_STRENGTH_DEFAULT);
103166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // init settings
103266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Virtualizer.Settings settings = new Virtualizer.Settings("Virtualizer;strength="
103366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        + strength);
103466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
103566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                virtualizerEffect.setProperties(settings);
103666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
103766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // set parameters
103866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (isGlobalEnabled == true) {
103966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    virtualizerEffect.setEnabled(isEnabled);
104066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                } else {
104166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    virtualizerEffect.setEnabled(false);
104266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
104366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
104466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // get parameters
104566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                settings = virtualizerEffect.getProperties();
104666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, "Parameters: " + settings.toString() + ";enabled=" + isEnabled);
104766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
104866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // update preferences
104966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putBoolean(Key.virt_enabled.toString(), isEnabled);
105066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putInt(Key.virt_strength.toString(), settings.strength);
105166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final RuntimeException e) {
105266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, errorTag + e);
105366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
105466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
105566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
105666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // In case of an existing audio session
105766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Exit after the virtualizer has been re-enabled
105866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
105966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (isExistingAudioSession) {
1060fed4c7bc8b62de6e686d6d3a067c1f10b0a3441ab            editor.apply();
106166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            return;
106266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
106366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
106466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // BassBoost
106566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // create effect
106666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final BassBoost bassBoostEffect = getBassBoostEffect(audioSession);
106766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        {
106866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final String errorTag = methodTag + "BassBoost error: ";
106966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
107066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            try {
107166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // read parameters
107266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final boolean isEnabled = prefs.getBoolean(Key.bb_enabled.toString(),
107366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        BASS_BOOST_ENABLED_DEFAULT);
107466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final int strength = prefs.getInt(Key.bb_strength.toString(),
107566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        BASS_BOOST_STRENGTH_DEFAULT);
107666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
107766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // init settings
107866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                BassBoost.Settings settings = new BassBoost.Settings("BassBoost;strength="
107966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        + strength);
108066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
108166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                bassBoostEffect.setProperties(settings);
108266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
108366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // set parameters
108466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (isGlobalEnabled == true) {
108566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    bassBoostEffect.setEnabled(isEnabled);
108666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                } else {
108766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    bassBoostEffect.setEnabled(false);
108866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
108966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
109066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // get parameters
109166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                settings = bassBoostEffect.getProperties();
109266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, "Parameters: " + settings.toString() + ";enabled=" + isEnabled);
109366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
109466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // update preferences
109566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putBoolean(Key.bb_enabled.toString(), isEnabled);
109666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putInt(Key.bb_strength.toString(), settings.strength);
109766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final RuntimeException e) {
109866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, errorTag + e);
109966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
110066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
110166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
110266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Equalizer
110366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // create effect
110466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Equalizer equalizerEffect = getEqualizerEffect(audioSession);
110566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        {
110666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final String errorTag = methodTag + "Equalizer error: ";
110766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
110866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            try {
110966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short eQNumBands;
111066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short[] bandLevel;
111166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final int[] eQCenterFreq;
111266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final short eQNumPresets;
111366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final String[] eQPresetNames;
111466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                short eQPreset;
111566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                synchronized (mEQInitLock) {
111666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // read parameters
111766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mEQBandLevelRange = equalizerEffect.getBandLevelRange();
111866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mEQNumBands = equalizerEffect.getNumberOfBands();
111966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mEQCenterFreq = new int[mEQNumBands];
112066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mEQNumPresets = equalizerEffect.getNumberOfPresets();
112166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    mEQPresetNames = new String[mEQNumPresets];
112266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
112366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    for (short preset = 0; preset < mEQNumPresets; preset++) {
112466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQPresetNames[preset] = equalizerEffect.getPresetName(preset);
112566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putString(Key.eq_preset_name.toString() + preset,
112666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                mEQPresetNames[preset]);
112766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
112866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
112966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_level_range.toString() + 0, mEQBandLevelRange[0]);
113066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_level_range.toString() + 1, mEQBandLevelRange[1]);
113166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_num_bands.toString(), mEQNumBands);
113266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_num_presets.toString(), mEQNumPresets);
113366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // Resetting the EQ arrays depending on the real # bands with defaults if band <
113466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // default size else 0 by copying default arrays over new ones
113566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short[] eQPresetCIExtremeBandLevel = Arrays.copyOf(
113666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            EQUALIZER_PRESET_CIEXTREME_BAND_LEVEL, mEQNumBands);
113766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    final short[] eQPresetUserBandLevelDefault = Arrays.copyOf(
113866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            EQUALIZER_PRESET_USER_BAND_LEVEL_DEFAULT, mEQNumBands);
113966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // If no preset prefs set use CI EXTREME (= numPresets)
114066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    eQPreset = (short) prefs
114166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            .getInt(Key.eq_current_preset.toString(), mEQNumPresets);
114266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    if (eQPreset < mEQNumPresets) {
114366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        // OpenSL ES effect presets
114466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        equalizerEffect.usePreset(eQPreset);
114566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        eQPreset = equalizerEffect.getCurrentPreset();
114666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    } else {
114766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        for (short band = 0; band < mEQNumBands; band++) {
114866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            short level = 0;
114966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            if (eQPreset == mEQNumPresets) {
115066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                // CI EXTREME
115166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                level = eQPresetCIExtremeBandLevel[band];
115266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            } else {
115366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                // User
115466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                level = (short) prefs.getInt(
115566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                        Key.eq_preset_user_band_level.toString() + band,
115666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                        eQPresetUserBandLevelDefault[band]);
115766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            }
115866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                            equalizerEffect.setBandLevel(band, level);
115966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        }
116066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
116166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    editor.putInt(Key.eq_current_preset.toString(), eQPreset);
116266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
116366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    bandLevel = new short[mEQNumBands];
116466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    for (short band = 0; band < mEQNumBands; band++) {
116566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        mEQCenterFreq[band] = equalizerEffect.getCenterFreq(band);
116666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        bandLevel[band] = equalizerEffect.getBandLevel(band);
116766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
116866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_band_level.toString() + band, bandLevel[band]);
116966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_center_freq.toString() + band, mEQCenterFreq[band]);
117066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_preset_ci_extreme_band_level.toString() + band,
117166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                eQPresetCIExtremeBandLevel[band]);
117266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        editor.putInt(Key.eq_preset_user_band_level_default.toString() + band,
117366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                                eQPresetUserBandLevelDefault[band]);
117466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    }
117566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
117666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    eQNumBands = mEQNumBands;
117766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    eQCenterFreq = mEQCenterFreq;
117866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    eQNumPresets = mEQNumPresets;
117966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    eQPresetNames = mEQPresetNames;
118066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
118166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
118266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final boolean isEnabled = prefs.getBoolean(Key.eq_enabled.toString(),
118366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        EQUALIZER_ENABLED_DEFAULT);
118466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                editor.putBoolean(Key.eq_enabled.toString(), isEnabled);
118566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (isGlobalEnabled == true) {
118666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    equalizerEffect.setEnabled(isEnabled);
118766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                } else {
118866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    equalizerEffect.setEnabled(false);
118966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
119066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
119166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                // dump
119266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, "Parameters: Equalizer");
119366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, "bands=" + eQNumBands);
119466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                String str = "levels=";
119566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                for (short band = 0; band < eQNumBands; band++) {
119666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    str = str + bandLevel[band] + "; ";
119766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
119866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, str);
119966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                str = "center=";
120066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                for (short band = 0; band < eQNumBands; band++) {
120166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    str = str + eQCenterFreq[band] + "; ";
120266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
120366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, str);
120466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                str = "presets=";
120566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                for (short preset = 0; preset < eQNumPresets; preset++) {
120666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    str = str + eQPresetNames[preset] + "; ";
120766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
120866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, str);
120966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.v(TAG, "current=" + eQPreset);
121066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final RuntimeException e) {
121166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, errorTag + e);
121266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
121366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
121466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
121566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // XXX: Preset Reverb not used for the moment, so commented out the effect creation to not
121666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // use MIPS left in the code for (future) reference.
121766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Preset reverb
121866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // create effect
121966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // final PresetReverb presetReverbEffect = getPresetReverbEffect(audioSession);
122066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // {
122166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // final String errorTag = methodTag + "PresetReverb error: ";
122266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        //
122366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // try {
122466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // // read parameters
122566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // final boolean isEnabled = prefs.getBoolean(Key.pr_enabled.toString(),
122666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // PRESET_REVERB_ENABLED_DEFAULT);
122766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // final short preset = (short) prefs.getInt(Key.pr_current_preset.toString(),
122866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // PRESET_REVERB_CURRENT_PRESET_DEFAULT);
122966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        //
123066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // // init settings
123166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // PresetReverb.Settings settings = new PresetReverb.Settings("PresetReverb;preset="
123266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // + preset);
123366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        //
123466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // // read/update preferences
123566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // presetReverbEffect.setProperties(settings);
123666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        //
123766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // // set parameters
123866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // if (isGlobalEnabled == true) {
123966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // presetReverbEffect.setEnabled(isEnabled);
124066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // } else {
124166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // presetReverbEffect.setEnabled(false);
124266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // }
124366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        //
124466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // // get parameters
124566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // settings = presetReverbEffect.getProperties();
124666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Log.v(TAG, "Parameters: " + settings.toString() + ";enabled=" + isEnabled);
124766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        //
124866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // // update preferences
124966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // editor.putBoolean(Key.pr_enabled.toString(), isEnabled);
125066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // editor.putInt(Key.pr_current_preset.toString(), settings.preset);
125166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // } catch (final RuntimeException e) {
125266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Log.e(TAG, errorTag + e);
125366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // }
125466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // }
125566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        editor.commit();
125666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
125766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
125866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
125966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Closes the audio session (release effects) for the given session
126066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
126166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
126266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
126366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
126466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
126566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
126666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static void closeSession(final Context context, final String packageName,
126766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession) {
126866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        Log.v(TAG, "closeSession(" + context + ", " + packageName + ", " + audioSession + ")");
126966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
127066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // PresetReverb
127166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final PresetReverb presetReverb = mPresetReverbInstances.remove(audioSession);
127266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (presetReverb != null) {
127366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            presetReverb.release();
127466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
127566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Equalizer
127666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Equalizer equalizer = mEQInstances.remove(audioSession);
127766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (equalizer != null) {
127866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            equalizer.release();
127966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
128066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // BassBoost
128166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final BassBoost bassBoost = mBassBoostInstances.remove(audioSession);
128266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (bassBoost != null) {
128366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            bassBoost.release();
128466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
128566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        // Virtualizer
128666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        final Virtualizer virtualizer = mVirtualizerInstances.remove(audioSession);
128766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (virtualizer != null) {
128866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            virtualizer.release();
128966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
129066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
129166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        mPackageSessions.remove(packageName);
129266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
129366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
129466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
129566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Enables or disables all effects (global enable/disable) for a given context, package name and
129666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * audio session. It sets/inits the control mode and preferences and then sets the global
129766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * enabled parameter.
129866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
129966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param context
130066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param packageName
130166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
130266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
130366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param enabled
130466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
130566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    public static void setEnabledAll(final Context context, final String packageName,
130666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            final int audioSession, final boolean enabled) {
130766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        initEffectsPreferences(context, packageName, audioSession);
130866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        setParameterBoolean(context, packageName, audioSession, Key.global_enabled, enabled);
130966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
131066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
131166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
131266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets the virtualizer effect for the given audio session. If the effect on the session doesn't
131366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * exist yet, create it and add to collection.
131466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
131566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
131666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
131766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return virtualizerEffect
131866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
131919aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen    private static Virtualizer getVirtualizerEffectNoCreate(final int audioSession) {
132019aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        return mVirtualizerInstances.get(audioSession);
132119aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen    }
132266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static Virtualizer getVirtualizerEffect(final int audioSession) {
132319aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        Virtualizer virtualizerEffect = getVirtualizerEffectNoCreate(audioSession);
132466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (virtualizerEffect == null) {
132566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            try {
132666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final Virtualizer newVirtualizerEffect = new Virtualizer(PRIORITY, audioSession);
132766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                virtualizerEffect = mVirtualizerInstances.putIfAbsent(audioSession,
132866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                        newVirtualizerEffect);
132966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (virtualizerEffect == null) {
133066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // put succeeded, use new value
133166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    virtualizerEffect = newVirtualizerEffect;
133266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
133366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final IllegalArgumentException e) {
133466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "Virtualizer: " + e);
133566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final UnsupportedOperationException e) {
133666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "Virtualizer: " + e);
133766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final RuntimeException e) {
133866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "Virtualizer: " + e);
133966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
134066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
134166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return virtualizerEffect;
134266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
134366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
134466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
134566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets the bass boost effect for the given audio session. If the effect on the session doesn't
134666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * exist yet, create it and add to collection.
134766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
134866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
134966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
135066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return bassBoostEffect
135166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
135219aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen    private static BassBoost getBassBoostEffectNoCreate(final int audioSession) {
135319aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        return mBassBoostInstances.get(audioSession);
135419aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen    }
135566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static BassBoost getBassBoostEffect(final int audioSession) {
135619aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen
135719aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        BassBoost bassBoostEffect = getBassBoostEffectNoCreate(audioSession);
135866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (bassBoostEffect == null) {
135966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            try {
136066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final BassBoost newBassBoostEffect = new BassBoost(PRIORITY, audioSession);
136166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                bassBoostEffect = mBassBoostInstances.putIfAbsent(audioSession, newBassBoostEffect);
136266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (bassBoostEffect == null) {
136366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // put succeeded, use new value
136466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    bassBoostEffect = newBassBoostEffect;
136566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
136666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final IllegalArgumentException e) {
136766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "BassBoost: " + e);
136866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final UnsupportedOperationException e) {
136966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "BassBoost: " + e);
137066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final RuntimeException e) {
137166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "BassBoost: " + e);
137266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
137366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
137466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return bassBoostEffect;
137566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
137666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
137766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    /**
137866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * Gets the equalizer effect for the given audio session. If the effect on the session doesn't
137966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * exist yet, create it and add to collection.
138066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *
138166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @param audioSession
138266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     *            System wide unique audio session identifier.
138366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     * @return equalizerEffect
138466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen     */
138519aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen    private static Equalizer getEqualizerEffectNoCreate(final int audioSession) {
138619aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        return mEQInstances.get(audioSession);
138719aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen    }
138866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    private static Equalizer getEqualizerEffect(final int audioSession) {
138919aa9179b689d3dc52419d1b33959f0beb389a5aMarco Nelissen        Equalizer equalizerEffect = getEqualizerEffectNoCreate(audioSession);
139066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        if (equalizerEffect == null) {
139166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            try {
139266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                final Equalizer newEqualizerEffect = new Equalizer(PRIORITY, audioSession);
139366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                equalizerEffect = mEQInstances.putIfAbsent(audioSession, newEqualizerEffect);
139466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                if (equalizerEffect == null) {
139566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    // put succeeded, use new value
139666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                    equalizerEffect = newEqualizerEffect;
139766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                }
139866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final IllegalArgumentException e) {
139966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "Equalizer: " + e);
140066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final UnsupportedOperationException e) {
140166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "Equalizer: " + e);
140266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            } catch (final RuntimeException e) {
140366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen                Log.e(TAG, "Equalizer: " + e);
140466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen            }
140566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        }
140666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen        return equalizerEffect;
140766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    }
140866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen
140966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // XXX: Preset Reverb not used for the moment, so commented out the effect creation to not
141066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // use MIPS
141166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // /**
141266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // * Gets the preset reverb effect for the given audio session. If the effect on the session
141366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // * doesn't exist yet, create it and add to collection.
141466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // *
141566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // * @param audioSession
141666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // * System wide unique audio session identifier.
141766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // * @return presetReverbEffect
141866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // */
141966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // private static PresetReverb getPresetReverbEffect(final int audioSession) {
142066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // PresetReverb presetReverbEffect = mPresetReverbInstances.get(audioSession);
142166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // if (presetReverbEffect == null) {
142266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // try {
142366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // final PresetReverb newPresetReverbEffect = new PresetReverb(PRIORITY, audioSession);
142466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // presetReverbEffect = mPresetReverbInstances.putIfAbsent(audioSession,
142566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // newPresetReverbEffect);
142666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // if (presetReverbEffect == null) {
142766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // // put succeeded, use new value
142866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // presetReverbEffect = newPresetReverbEffect;
142966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // }
143066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // } catch (final IllegalArgumentException e) {
143166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Log.e(TAG, "PresetReverb: " + e);
143266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // } catch (final UnsupportedOperationException e) {
143366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Log.e(TAG, "PresetReverb: " + e);
143466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // } catch (final RuntimeException e) {
143566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // Log.e(TAG, "PresetReverb: " + e);
143666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // }
143766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // }
143866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // return presetReverbEffect;
143966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen    // }
144066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen}
1441