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 19c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissenimport com.android.audiofx.OpenSLESConstants; 20c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissenimport com.android.musicfx.seekbar.SeekBar; 21c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissenimport com.android.musicfx.seekbar.SeekBar.OnSeekBarChangeListener; 22c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen 23709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissenimport android.app.ActionBar; 2466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.app.Activity; 2566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.app.AlertDialog; 2666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.app.Dialog; 2766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.bluetooth.BluetoothClass; 2866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.bluetooth.BluetoothDevice; 2966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.BroadcastReceiver; 3066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.Context; 3166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.DialogInterface; 3266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.DialogInterface.OnCancelListener; 3366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.Intent; 3466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.IntentFilter; 3566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.AudioManager; 3666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.audiofx.AudioEffect; 3766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.audiofx.AudioEffect.Descriptor; 3866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.os.Bundle; 3966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.util.Log; 4066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.view.Gravity; 4166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.view.LayoutInflater; 4266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.view.MotionEvent; 4366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.view.View; 4466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.view.View.OnClickListener; 4566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.view.View.OnTouchListener; 4666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.view.ViewGroup; 47e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissenimport android.widget.AdapterView; 48e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissenimport android.widget.AdapterView.OnItemSelectedListener; 49e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissenimport android.widget.ArrayAdapter; 5066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.CompoundButton; 5166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.CompoundButton.OnCheckedChangeListener; 5266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.LinearLayout; 5366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.ListView; 5466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.RelativeLayout; 55e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissenimport android.widget.Spinner; 56709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissenimport android.widget.Switch; 5766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.TextView; 5866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.Toast; 5966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 60f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissenimport java.util.Formatter; 61f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissenimport java.util.Locale; 621c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissenimport java.util.UUID; 6366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 6466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen/** 6566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 6666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 6766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenpublic class ActivityMusic extends Activity implements OnSeekBarChangeListener { 6866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private final static String TAG = "MusicFXActivityMusic"; 6966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 7066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 7166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Max number of EQ bands supported 7266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 7366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private final static int EQUALIZER_MAX_BANDS = 32; 7466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 7566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 7666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Indicates if Virtualizer effect is supported. 7766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 7866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private boolean mVirtualizerSupported; 791c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen private boolean mVirtualizerIsHeadphoneOnly; 8066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 8166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Indicates if BassBoost effect is supported. 8266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 8366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private boolean mBassBoostSupported; 8466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 8566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Indicates if Equalizer effect is supported. 8666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 8766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private boolean mEqualizerSupported; 8866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 8966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Indicates if Preset Reverb effect is supported. 9066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 9166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private boolean mPresetReverbSupported; 9266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 9366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Equalizer fields 9466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private final SeekBar[] mEqualizerSeekBar = new SeekBar[EQUALIZER_MAX_BANDS]; 9566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int mNumberEqualizerBands; 9666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int mEqualizerMinBandLevel; 9766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int mEQPresetUserPos = 1; 9866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int mEQPreset; 9966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int mEQPresetPrevious; 10066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int[] mEQPresetUserBandLevelsPrev; 101c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen private String[] mEQPresetNames; 10266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 10366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int mPRPreset; 104e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen private int mPRPresetPrevious; 10566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 10666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private boolean mIsHeadsetOn = false; 107709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen private CompoundButton mToggleSwitch; 10866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 109f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen private StringBuilder mFormatBuilder = new StringBuilder(); 110f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen private Formatter mFormatter = new Formatter(mFormatBuilder, Locale.getDefault()); 111f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen 11266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 11366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Mapping for the EQ widget ids per band 11466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 11566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private static final int[][] EQViewElementIds = { 116c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand0TextView, R.id.EQBand0SeekBar }, 117c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand1TextView, R.id.EQBand1SeekBar }, 118c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand2TextView, R.id.EQBand2SeekBar }, 119c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand3TextView, R.id.EQBand3SeekBar }, 120c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand4TextView, R.id.EQBand4SeekBar }, 121c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand5TextView, R.id.EQBand5SeekBar }, 122c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand6TextView, R.id.EQBand6SeekBar }, 123c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand7TextView, R.id.EQBand7SeekBar }, 124c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand8TextView, R.id.EQBand8SeekBar }, 125c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand9TextView, R.id.EQBand9SeekBar }, 126c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand10TextView, R.id.EQBand10SeekBar }, 127c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand11TextView, R.id.EQBand11SeekBar }, 128c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand12TextView, R.id.EQBand12SeekBar }, 129c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand13TextView, R.id.EQBand13SeekBar }, 130c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand14TextView, R.id.EQBand14SeekBar }, 131c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand15TextView, R.id.EQBand15SeekBar }, 132c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand16TextView, R.id.EQBand16SeekBar }, 133c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand17TextView, R.id.EQBand17SeekBar }, 134c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand18TextView, R.id.EQBand18SeekBar }, 135c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand19TextView, R.id.EQBand19SeekBar }, 136c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand20TextView, R.id.EQBand20SeekBar }, 137c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand21TextView, R.id.EQBand21SeekBar }, 138c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand22TextView, R.id.EQBand22SeekBar }, 139c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand23TextView, R.id.EQBand23SeekBar }, 140c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand24TextView, R.id.EQBand24SeekBar }, 141c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand25TextView, R.id.EQBand25SeekBar }, 142c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand26TextView, R.id.EQBand26SeekBar }, 143c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand27TextView, R.id.EQBand27SeekBar }, 144c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand28TextView, R.id.EQBand28SeekBar }, 145c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand29TextView, R.id.EQBand29SeekBar }, 146c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand30TextView, R.id.EQBand30SeekBar }, 147c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand31TextView, R.id.EQBand31SeekBar } }; 14866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 14966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Preset Reverb fields 15066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 15166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Array containing the PR preset names. 15266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 15366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private static final String[] PRESETREVERBPRESETSTRINGS = { "None", "SmallRoom", "MediumRoom", 15466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen "LargeRoom", "MediumHall", "LargeHall", "Plate" }; 15566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 15666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 15766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Context field 15866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 15966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private Context mContext; 16066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 16166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 16266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Calling package name field 16366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 16466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private String mCallingPackageName = "empty"; 16566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 16666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 16766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Audio session field 16866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 16966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int mAudioSession = AudioEffect.ERROR_BAD_VALUE; 17066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 17166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Broadcast receiver to handle wired and Bluetooth A2dp headset events 17266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 17366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 17466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onReceive(final Context context, final Intent intent) { 17566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final String action = intent.getAction(); 17666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final boolean isHeadsetOnPrev = mIsHeadsetOn; 17766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 17866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (action.equals(Intent.ACTION_HEADSET_PLUG)) { 17966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mIsHeadsetOn = (intent.getIntExtra("state", 0) == 1) 18066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen || audioManager.isBluetoothA2dpOn(); 18166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } else if (action.equals(BluetoothDevice.ACTION_ACL_CONNECTED)) { 18266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int deviceClass = ((BluetoothDevice) intent 18366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)).getBluetoothClass() 18466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen .getDeviceClass(); 18566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if ((deviceClass == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES) 18666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen || (deviceClass == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET)) { 18766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mIsHeadsetOn = true; 18866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 18966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } else if (action.equals(AudioManager.ACTION_AUDIO_BECOMING_NOISY)) { 19066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mIsHeadsetOn = audioManager.isBluetoothA2dpOn() || audioManager.isWiredHeadsetOn(); 19166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } else if (action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) { 19266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int deviceClass = ((BluetoothDevice) intent 19366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)).getBluetoothClass() 19466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen .getDeviceClass(); 19566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if ((deviceClass == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES) 19666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen || (deviceClass == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET)) { 19766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mIsHeadsetOn = audioManager.isWiredHeadsetOn(); 19866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 19966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 20066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (isHeadsetOnPrev != mIsHeadsetOn) { 20166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen updateUIHeadset(); 20266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 20366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 20466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen }; 20566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 20666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /* 20766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Declares and initializes all objects and widgets in the layouts and the CheckBox and SeekBar 20866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * onchange methods on creation. 20966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 21066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * (non-Javadoc) 21166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 21266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @see android.app.ActivityGroup#onCreate(android.os.Bundle) 21366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 21466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 21566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onCreate(final Bundle savedInstanceState) { 21666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen super.onCreate(savedInstanceState); 21766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 21866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Init context to be used in listeners 21966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mContext = this; 22066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 22166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Receive intent 22266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // get calling intent 22366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final Intent intent = getIntent(); 22466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, 22566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen AudioEffect.ERROR_BAD_VALUE); 22666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen Log.v(TAG, "audio session: " + mAudioSession); 22766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 22866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mCallingPackageName = getCallingPackage(); 22966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 23066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // check for errors 23166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mCallingPackageName == null) { 23266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen Log.e(TAG, "Package name is null"); 23366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen setResult(RESULT_CANCELED); 23466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen finish(); 23566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen return; 23666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 23766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen setResult(RESULT_OK); 23866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 23966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen Log.v(TAG, mCallingPackageName + " (" + mAudioSession + ")"); 24066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 24166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.initEffectsPreferences(mContext, mCallingPackageName, mAudioSession); 24266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 24366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // query available effects 24466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final Descriptor[] effects = AudioEffect.queryEffects(); 24566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 24666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Determine available/supported effects 24766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen Log.v(TAG, "Available effects:"); 24866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen for (final Descriptor effect : effects) { 24966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen Log.v(TAG, effect.name.toString() + ", type: " + effect.type.toString()); 25066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 25166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (effect.type.equals(AudioEffect.EFFECT_TYPE_VIRTUALIZER)) { 25266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mVirtualizerSupported = true; 2531c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen if (effect.uuid.equals(UUID.fromString("1d4033c0-8557-11df-9f2d-0002a5d5c51b"))) { 2541c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen mVirtualizerIsHeadphoneOnly = true; 2551c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen } 25666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } else if (effect.type.equals(AudioEffect.EFFECT_TYPE_BASS_BOOST)) { 25766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mBassBoostSupported = true; 25866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } else if (effect.type.equals(AudioEffect.EFFECT_TYPE_EQUALIZER)) { 25966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mEqualizerSupported = true; 26066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } else if (effect.type.equals(AudioEffect.EFFECT_TYPE_PRESET_REVERB)) { 26166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mPresetReverbSupported = true; 26266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 26366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 26466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 26566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen setContentView(R.layout.music_main); 26666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final ViewGroup viewGroup = (ViewGroup) findViewById(R.id.contentSoundEffects); 26766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 268c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen // Fill array with presets from AudioEffects call. 269c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen // allocate a space for 2 extra strings (CI Extreme & User) 270c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen final int numPresets = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName, 271c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mAudioSession, ControlPanelEffect.Key.eq_num_presets); 272c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mEQPresetNames = new String[numPresets + 2]; 273c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen for (short i = 0; i < numPresets; i++) { 274c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mEQPresetNames[i] = ControlPanelEffect.getParameterString(mContext, 275c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_preset_name, i); 276c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen } 277c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mEQPresetNames[numPresets] = getString(R.string.ci_extreme); 278c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mEQPresetNames[numPresets + 1] = getString(R.string.user); 279c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mEQPresetUserPos = numPresets + 1; 280c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen 28166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Watch for button clicks and initialization. 28266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if ((mVirtualizerSupported) || (mBassBoostSupported) || (mEqualizerSupported) 28366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen || (mPresetReverbSupported)) { 28466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Set the listener for the main enhancements toggle button. 28566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Depending on the state enable the supported effects if they were 28666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // checked in the setup tab. 287709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen mToggleSwitch = new Switch(this); 288709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen mToggleSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() { 28966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 29066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onCheckedChanged(final CompoundButton buttonView, 29166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final boolean isChecked) { 29266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 29366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // set parameter and state 29466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName, 29566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.global_enabled, isChecked); 29666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Enable Linear layout (in scroll layout) view with all 29766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // effect contents depending on checked state 29829daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen setEnabledAllChildren(viewGroup, isChecked); 29966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // update UI according to headset state 30066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen updateUIHeadset(); 30166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 30266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen }); 30366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 30466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Initialize the Virtualizer elements. 30566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Set the SeekBar listener. 30666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mVirtualizerSupported) { 30766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Show msg when disabled slider (layout) is touched 30866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen findViewById(R.id.vILayout).setOnTouchListener(new OnTouchListener() { 30966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 31066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 31166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public boolean onTouch(final View v, final MotionEvent event) { 31284c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen if (event.getAction() == MotionEvent.ACTION_UP) { 31384c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen showHeadsetMsg(); 31484c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen } 31566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen return false; 31666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 31766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen }); 31866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 31966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final SeekBar seekbar = (SeekBar) findViewById(R.id.vIStrengthSeekBar); 32066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen seekbar.setMax(OpenSLESConstants.VIRTUALIZER_MAX_STRENGTH 32166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen - OpenSLESConstants.VIRTUALIZER_MIN_STRENGTH); 32266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 32366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 32466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Update the parameters while SeekBar changes and set the 32566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // effect parameter. 32666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 32766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 32866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onProgressChanged(final SeekBar seekBar, final int progress, 32966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final boolean fromUser) { 33066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // set parameter and state 33166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, 33266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.virt_strength, progress); 33366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 33466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 33566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // If slider pos was 0 when starting re-enable effect 33666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 33766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onStartTrackingTouch(final SeekBar seekBar) { 33866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (seekBar.getProgress() == 0) { 33966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName, 34066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.virt_enabled, true); 34166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 34266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 34366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 34466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // If slider pos = 0 when stopping disable effect 34566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 34666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onStopTrackingTouch(final SeekBar seekBar) { 34766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (seekBar.getProgress() == 0) { 34866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // disable 34966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName, 35066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.virt_enabled, false); 35166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 35266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 35366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen }); 354bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen 355bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen final Switch sw = (Switch) findViewById(R.id.vIStrengthToggle); 356bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen sw.setOnCheckedChangeListener(new OnCheckedChangeListener() { 357bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen @Override 358bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen public void onCheckedChanged(final CompoundButton buttonView, 359bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen final boolean isChecked) { 360bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName, 361bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen mAudioSession, ControlPanelEffect.Key.virt_enabled, isChecked); 362bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen } 363bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen }); 36466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 36566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 36666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Initialize the Bass Boost elements. 36766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Set the SeekBar listener. 36866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mBassBoostSupported) { 36966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Show msg when disabled slider (layout) is touched 37066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen findViewById(R.id.bBLayout).setOnTouchListener(new OnTouchListener() { 37166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 37266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 37366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public boolean onTouch(final View v, final MotionEvent event) { 37484c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen if (event.getAction() == MotionEvent.ACTION_UP) { 37584c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen showHeadsetMsg(); 37684c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen } 37766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen return false; 37866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 37966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen }); 38066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 38166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final SeekBar seekbar = (SeekBar) findViewById(R.id.bBStrengthSeekBar); 38266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen seekbar.setMax(OpenSLESConstants.BASSBOOST_MAX_STRENGTH 38366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen - OpenSLESConstants.BASSBOOST_MIN_STRENGTH); 38466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 38566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 38666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Update the parameters while SeekBar changes and set the 38766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // effect parameter. 38866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 38966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 39066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onProgressChanged(final SeekBar seekBar, final int progress, 39166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final boolean fromUser) { 39266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // set parameter and state 39366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, 39466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.bb_strength, progress); 39566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 39666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 39766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // If slider pos was 0 when starting re-enable effect 39866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 39966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onStartTrackingTouch(final SeekBar seekBar) { 40066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (seekBar.getProgress() == 0) { 40166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName, 40266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.bb_enabled, true); 40366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 40466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 40566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 40666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // If slider pos = 0 when stopping disable effect 40766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 40866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onStopTrackingTouch(final SeekBar seekBar) { 40966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (seekBar.getProgress() == 0) { 41066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // disable 41166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName, 41266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.bb_enabled, false); 41366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 41466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 41566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 41666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen }); 41766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 41866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 41966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Initialize the Equalizer elements. 42066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mEqualizerSupported) { 421e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mEQPreset = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName, 422e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mAudioSession, ControlPanelEffect.Key.eq_current_preset); 423e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen if (mEQPreset >= mEQPresetNames.length) { 424e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mEQPreset = 0; 425e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen } 426e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mEQPresetPrevious = mEQPreset; 427e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen equalizerSpinnerInit((Spinner)findViewById(R.id.eqSpinner)); 428e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen equalizerBandsInit(findViewById(R.id.eqcontainer)); 42966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 43066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 43166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Initialize the Preset Reverb elements. 43266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Set Spinner listeners. 43366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mPresetReverbSupported) { 434e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mPRPreset = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName, 435e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mAudioSession, ControlPanelEffect.Key.pr_current_preset); 436e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mPRPresetPrevious = mPRPreset; 437e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen reverbSpinnerInit((Spinner)findViewById(R.id.prSpinner)); 43866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 43966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 44066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } else { 44166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen viewGroup.setVisibility(View.GONE); 44266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ((TextView) findViewById(R.id.noEffectsTextView)).setVisibility(View.VISIBLE); 44366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 44484c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen 445709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen ActionBar ab = getActionBar(); 446709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen final int padding = getResources().getDimensionPixelSize( 447709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen R.dimen.action_bar_switch_padding); 448709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen mToggleSwitch.setPadding(0,0, padding, 0); 449709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen ab.setCustomView(mToggleSwitch, new ActionBar.LayoutParams( 450709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen ActionBar.LayoutParams.WRAP_CONTENT, 451709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen ActionBar.LayoutParams.WRAP_CONTENT, 452709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen Gravity.CENTER_VERTICAL | Gravity.RIGHT)); 453709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_CUSTOM); 45466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 45566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 45666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /* 45766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * (non-Javadoc) 45866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 45966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @see android.app.Activity#onResume() 46066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 46166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 46266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen protected void onResume() { 46366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen super.onResume(); 46466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if ((mVirtualizerSupported) || (mBassBoostSupported) || (mEqualizerSupported) 46566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen || (mPresetReverbSupported)) { 46666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Listen for broadcast intents that might affect the onscreen UI for headset. 46766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final IntentFilter intentFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); 46866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); 46966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); 47066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen intentFilter.addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY); 47166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen registerReceiver(mReceiver, intentFilter); 47266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 47366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Check if wired or Bluetooth headset is connected/on 47466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 47566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mIsHeadsetOn = (audioManager.isWiredHeadsetOn() || audioManager.isBluetoothA2dpOn()); 47666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen Log.v(TAG, "onResume: mIsHeadsetOn : " + mIsHeadsetOn); 47766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 47866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Update UI 47966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen updateUI(); 48066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 48166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 48266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 48366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /* 48466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * (non-Javadoc) 48566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 48666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @see android.app.Activity#onPause() 48766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 48866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 48966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen protected void onPause() { 49066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen super.onPause(); 49166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 49266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Unregister for broadcast intents. (These affect the visible UI, 49366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // so we only care about them while we're in the foreground.) 49466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen unregisterReceiver(mReceiver); 49566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 49666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 497e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen private void reverbSpinnerInit(Spinner spinner) { 498e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 499e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen android.R.layout.simple_spinner_item, PRESETREVERBPRESETSTRINGS); 500e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 501e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen spinner.setAdapter(adapter); 502e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 503e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen 504e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen @Override 505e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 506e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen if (position != mPRPresetPrevious) { 507e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen presetReverbSetPreset(position); 50866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 509e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mPRPresetPrevious = position; 510e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen } 51166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 512e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen @Override 513e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen public void onNothingSelected(AdapterView<?> parent) { 514e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen } 515e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen }); 516e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen spinner.setSelection(mPRPreset); 51766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 51866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 519e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen private void equalizerSpinnerInit(Spinner spinner) { 520e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 521e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen android.R.layout.simple_spinner_item, mEQPresetNames); 522e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 523e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen spinner.setAdapter(adapter); 524e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 525e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen 526e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen @Override 527e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 528e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen if (position != mEQPresetPrevious) { 529e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen equalizerSetPreset(position); 530e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen } 531e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mEQPresetPrevious = position; 532743172011ae03fe3f82759750932c6220a3a50a6Marco Nelissen } 533e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen 534e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen @Override 535e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen public void onNothingSelected(AdapterView<?> parent) { 536e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen } 537e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen }); 538e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen spinner.setSelection(mEQPreset); 53966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 54066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 541e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen 54266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 54329daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen * En/disables all children for a given view. For linear and relative layout children do this 54466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * recursively 54566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 54629daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen * @param viewGroup 54766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @param enabled 54866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 54929daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen private void setEnabledAllChildren(final ViewGroup viewGroup, final boolean enabled) { 55066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int count = viewGroup.getChildCount(); 55166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen for (int i = 0; i < count; i++) { 55266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final View view = viewGroup.getChildAt(i); 55366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if ((view instanceof LinearLayout) || (view instanceof RelativeLayout)) { 55466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final ViewGroup vg = (ViewGroup) view; 55529daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen setEnabledAllChildren(vg, enabled); 55666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 55766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen view.setEnabled(enabled); 55866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 55966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 56066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 56166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 56266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Updates UI (checkbox, seekbars, enabled states) according to the current stored preferences. 56366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 56466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private void updateUI() { 56566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final boolean isEnabled = ControlPanelEffect.getParameterBoolean(mContext, 56666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mCallingPackageName, mAudioSession, ControlPanelEffect.Key.global_enabled); 567709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen mToggleSwitch.setChecked(isEnabled); 56829daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen setEnabledAllChildren((ViewGroup) findViewById(R.id.contentSoundEffects), isEnabled); 56966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen updateUIHeadset(); 57066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 57166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mVirtualizerSupported) { 572bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen SeekBar bar = (SeekBar) findViewById(R.id.vIStrengthSeekBar); 573bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen Switch sw = (Switch) findViewById(R.id.vIStrengthToggle); 574bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen int strength = ControlPanelEffect 57566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen .getParameterInt(mContext, mCallingPackageName, mAudioSession, 576bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen ControlPanelEffect.Key.virt_strength); 577bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen bar.setProgress(strength); 578bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen boolean hasStrength = ControlPanelEffect.getParameterBoolean(mContext, 579bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen mCallingPackageName, mAudioSession, 580bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen ControlPanelEffect.Key.virt_strength_supported); 581bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen if (hasStrength) { 582bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen sw.setVisibility(View.GONE); 583bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen } else { 584bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen bar.setVisibility(View.GONE); 585bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen sw.setChecked(sw.isEnabled() && strength != 0); 586bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen } 58766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 58866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mBassBoostSupported) { 58966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ((SeekBar) findViewById(R.id.bBStrengthSeekBar)).setProgress(ControlPanelEffect 59066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen .getParameterInt(mContext, mCallingPackageName, mAudioSession, 59166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.Key.bb_strength)); 59266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 59366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mEqualizerSupported) { 59484c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen equalizerUpdateDisplay(); 59566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 59666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mPresetReverbSupported) { 597e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen int reverb = ControlPanelEffect.getParameterInt( 59866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mContext, mCallingPackageName, mAudioSession, 599e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen ControlPanelEffect.Key.pr_current_preset); 600e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen ((Spinner)findViewById(R.id.prSpinner)).setSelection(reverb); 60166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 60266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 60366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 60466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 60566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Updates UI for headset mode. En/disable VI and BB controls depending on headset state 60666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * (on/off) if effects are on. Do the inverse for their layouts so they can take over 60766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * control/events. 60866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 60966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private void updateUIHeadset() { 610709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen if (mToggleSwitch.isChecked()) { 6111c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen ((TextView) findViewById(R.id.vIStrengthText)).setEnabled( 6121c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly); 6131c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen ((SeekBar) findViewById(R.id.vIStrengthSeekBar)).setEnabled( 6141c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly); 6151c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen findViewById(R.id.vILayout).setEnabled(!mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly); 61666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ((TextView) findViewById(R.id.bBStrengthText)).setEnabled(mIsHeadsetOn); 61766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ((SeekBar) findViewById(R.id.bBStrengthSeekBar)).setEnabled(mIsHeadsetOn); 61866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen findViewById(R.id.bBLayout).setEnabled(!mIsHeadsetOn); 61966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 62066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 62166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 62266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 62366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Initializes the equalizer elements. Set the SeekBars and Spinner listeners. 62466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 625e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen private void equalizerBandsInit(View eqcontainer) { 62666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Initialize the N-Band Equalizer elements. 62766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mNumberEqualizerBands = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName, 62866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.eq_num_bands); 62966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mEQPresetUserBandLevelsPrev = ControlPanelEffect.getParameterIntArray(mContext, 63066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mCallingPackageName, mAudioSession, 63166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.Key.eq_preset_user_band_level); 63266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int[] centerFreqs = ControlPanelEffect.getParameterIntArray(mContext, 63366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_center_freq); 63466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int[] bandLevelRange = ControlPanelEffect.getParameterIntArray(mContext, 63566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_level_range); 63666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mEqualizerMinBandLevel = bandLevelRange[0]; 63766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int mEqualizerMaxBandLevel = bandLevelRange[1]; 63866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 63966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen for (int band = 0; band < mNumberEqualizerBands; band++) { 64066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Unit conversion from mHz to Hz and use k prefix if necessary to display 64166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int centerFreq = centerFreqs[band] / 1000; 64266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen float centerFreqHz = centerFreq; 64366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen String unitPrefix = ""; 64466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (centerFreqHz >= 1000) { 64566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen centerFreqHz = centerFreqHz / 1000; 64666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen unitPrefix = "k"; 64766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 64884c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen ((TextView) eqcontainer.findViewById(EQViewElementIds[band][0])).setText( 649f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen format("%.0f ", centerFreqHz) + unitPrefix + "Hz"); 65084c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen mEqualizerSeekBar[band] = (SeekBar) eqcontainer 65166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen .findViewById(EQViewElementIds[band][1]); 65266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mEqualizerSeekBar[band].setMax(mEqualizerMaxBandLevel - mEqualizerMinBandLevel); 65366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mEqualizerSeekBar[band].setOnSeekBarChangeListener(this); 65466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 65566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 65666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Hide the inactive Equalizer bands. 65766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen for (int band = mNumberEqualizerBands; band < EQUALIZER_MAX_BANDS; band++) { 65866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // CenterFreq text 65984c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen eqcontainer.findViewById(EQViewElementIds[band][0]).setVisibility(View.GONE); 66066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // SeekBar 66184c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen eqcontainer.findViewById(EQViewElementIds[band][1]).setVisibility(View.GONE); 66266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 663c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen 664c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen // TODO: get the actual values from somewhere 665c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen TextView tv = (TextView) findViewById(R.id.maxLevelText); 666c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen tv.setText("+15 dB"); 667c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen tv = (TextView) findViewById(R.id.centerLevelText); 668c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen tv.setText("0 dB"); 669c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen tv = (TextView) findViewById(R.id.minLevelText); 670c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen tv.setText("-15 dB"); 67184c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen equalizerUpdateDisplay(); 67266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 67366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 674f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen private String format(String format, Object... args) { 675f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen mFormatBuilder.setLength(0); 676f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen mFormatter.format(format, args); 677f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen return mFormatBuilder.toString(); 678f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen } 679f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen 68066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /* 68166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * For the EQ Band SeekBars 68266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 68366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * (non-Javadoc) 68466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 68566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @see android.widget.SeekBar.OnSeekBarChangeListener#onProgressChanged(android 68666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * .widget.SeekBar, int, boolean) 68766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 68866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 68966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 69066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onProgressChanged(final SeekBar seekbar, final int progress, final boolean fromUser) { 69166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int id = seekbar.getId(); 69266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 69366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen for (short band = 0; band < mNumberEqualizerBands; band++) { 69466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (id == EQViewElementIds[band][1]) { 69566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final short level = (short) (progress + mEqualizerMinBandLevel); 69666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (fromUser) { 69766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen equalizerBandUpdate(band, level); 69866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 69966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen break; 70066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 70166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 70266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 70366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 70466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /* 70566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * (non-Javadoc) 70666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 70766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @see android.widget.SeekBar.OnSeekBarChangeListener#onStartTrackingTouch(android 70866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * .widget.SeekBar) 70966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 71066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 71166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 71266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onStartTrackingTouch(final SeekBar seekbar) { 713c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen // get current levels 714c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen final int[] bandLevels = ControlPanelEffect.getParameterIntArray(mContext, 715c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_band_level); 716c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen // copy current levels to user preset 717c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen for (short band = 0; band < mNumberEqualizerBands; band++) { 718c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen equalizerBandUpdate(band, bandLevels[band]); 719c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen } 720c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen equalizerSetPreset(mEQPresetUserPos); 7219c37307a1e0b59572fc474a77aeeb371477a3e8aMarco Nelissen ((Spinner)findViewById(R.id.eqSpinner)).setSelection(mEQPresetUserPos); 72266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 72366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 72466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /* 72566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Updates the EQ display when the user stops changing. 72666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 72766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * (non-Javadoc) 72866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 72966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @see android.widget.SeekBar.OnSeekBarChangeListener#onStopTrackingTouch(android 73066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * .widget.SeekBar) 73166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 73266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 73366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 73466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onStopTrackingTouch(final SeekBar seekbar) { 73566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen equalizerUpdateDisplay(); 73666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 73766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 73866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 73966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Updates the EQ by getting the parameters. 74066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 74166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private void equalizerUpdateDisplay() { 74266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Update and show the active N-Band Equalizer bands. 74366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int[] bandLevels = ControlPanelEffect.getParameterIntArray(mContext, 74466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_band_level); 74566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen for (short band = 0; band < mNumberEqualizerBands; band++) { 74666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int level = bandLevels[band]; 74766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int progress = level - mEqualizerMinBandLevel; 74866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mEqualizerSeekBar[band].setProgress(progress); 74966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 75066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 75166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 75266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 75366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Updates/sets a given EQ band level. 75466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 75566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @param band 75666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Band id 75766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @param level 75866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * EQ band level 75966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 760c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen private void equalizerBandUpdate(final int band, final int level) { 76166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, mAudioSession, 76266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.Key.eq_band_level, level, band); 76366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 76466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 76566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 76666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Sets the given EQ preset. 76766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 76866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @param preset 76966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * EQ preset id. 77066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 771c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen private void equalizerSetPreset(final int preset) { 77266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, mAudioSession, 77366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.Key.eq_current_preset, preset); 774c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen equalizerUpdateDisplay(); 77566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 77666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 77766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 77866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Sets the given PR preset. 77966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 78066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @param preset 78166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * PR preset id. 78266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 783e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen private void presetReverbSetPreset(final int preset) { 78466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, mAudioSession, 78566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.Key.pr_current_preset, preset); 78666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 78766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 78866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 78966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Show msg that headset needs to be plugged. 79066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 79166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private void showHeadsetMsg() { 79266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final Context context = getApplicationContext(); 79366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int duration = Toast.LENGTH_SHORT; 79466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 79566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final Toast toast = Toast.makeText(context, getString(R.string.headset_plug), duration); 79666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen toast.setGravity(Gravity.CENTER, toast.getXOffset() / 2, toast.getYOffset() / 2); 79766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen toast.show(); 79866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 79966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen} 800