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 Nelissen 21709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissenimport android.app.ActionBar; 2266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.app.Activity; 2366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.app.AlertDialog; 2466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.app.Dialog; 2566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.bluetooth.BluetoothClass; 2666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.bluetooth.BluetoothDevice; 2766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.BroadcastReceiver; 2866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.Context; 2966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.DialogInterface; 3066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.DialogInterface.OnCancelListener; 3166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.Intent; 3266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.content.IntentFilter; 334fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Triviimport android.media.AudioFormat; 3466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.AudioManager; 3566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.audiofx.AudioEffect; 3666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.media.audiofx.AudioEffect.Descriptor; 374fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Triviimport android.media.audiofx.Virtualizer; 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; 55a3818dbc8cbd1d0ac65ba4f869ccdb100e3db66aMarco Nelissenimport android.widget.SeekBar; 56a3818dbc8cbd1d0ac65ba4f869ccdb100e3db66aMarco Nelissenimport android.widget.SeekBar.OnSeekBarChangeListener; 57e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissenimport android.widget.Spinner; 58709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissenimport android.widget.Switch; 5966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.TextView; 6066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenimport android.widget.Toast; 6166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 62f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissenimport java.util.Formatter; 63f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissenimport java.util.Locale; 641c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissenimport java.util.UUID; 6566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 6666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen/** 6766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 6866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 6966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissenpublic class ActivityMusic extends Activity implements OnSeekBarChangeListener { 7066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private final static String TAG = "MusicFXActivityMusic"; 7166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 7266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 7366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Max number of EQ bands supported 7466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 7566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private final static int EQUALIZER_MAX_BANDS = 32; 7666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 7766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 789ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia * Max levels per EQ band in millibels (1 dB = 100 mB) 799ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia */ 809ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia private final static int EQUALIZER_MAX_LEVEL = 1000; 819ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia 829ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia /** 839ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia * Min levels per EQ band in millibels (1 dB = 100 mB) 849ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia */ 859ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia private final static int EQUALIZER_MIN_LEVEL = -1000; 869ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia 879ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia /** 8866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Indicates if Virtualizer effect is supported. 8966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 9066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private boolean mVirtualizerSupported; 911c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen private boolean mVirtualizerIsHeadphoneOnly; 9266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 9366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Indicates if BassBoost effect is supported. 9466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 9566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private boolean mBassBoostSupported; 9666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 9766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Indicates if Equalizer effect is supported. 9866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 9966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private boolean mEqualizerSupported; 10066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 10166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Indicates if Preset Reverb effect is supported. 10266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 10366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private boolean mPresetReverbSupported; 10466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 10566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Equalizer fields 10666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private final SeekBar[] mEqualizerSeekBar = new SeekBar[EQUALIZER_MAX_BANDS]; 10766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int mNumberEqualizerBands; 10866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int mEqualizerMinBandLevel; 10966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int mEQPresetUserPos = 1; 11066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int mEQPreset; 11166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int mEQPresetPrevious; 11266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int[] mEQPresetUserBandLevelsPrev; 113c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen private String[] mEQPresetNames; 11466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 11566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int mPRPreset; 116e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen private int mPRPresetPrevious; 11766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 11866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private boolean mIsHeadsetOn = false; 119709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen private CompoundButton mToggleSwitch; 12066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 121f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen private StringBuilder mFormatBuilder = new StringBuilder(); 122f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen private Formatter mFormatter = new Formatter(mFormatBuilder, Locale.getDefault()); 123f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen 12466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 12566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Mapping for the EQ widget ids per band 12666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 12766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private static final int[][] EQViewElementIds = { 128c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand0TextView, R.id.EQBand0SeekBar }, 129c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand1TextView, R.id.EQBand1SeekBar }, 130c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand2TextView, R.id.EQBand2SeekBar }, 131c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand3TextView, R.id.EQBand3SeekBar }, 132c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand4TextView, R.id.EQBand4SeekBar }, 133c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand5TextView, R.id.EQBand5SeekBar }, 134c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand6TextView, R.id.EQBand6SeekBar }, 135c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand7TextView, R.id.EQBand7SeekBar }, 136c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand8TextView, R.id.EQBand8SeekBar }, 137c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand9TextView, R.id.EQBand9SeekBar }, 138c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand10TextView, R.id.EQBand10SeekBar }, 139c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand11TextView, R.id.EQBand11SeekBar }, 140c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand12TextView, R.id.EQBand12SeekBar }, 141c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand13TextView, R.id.EQBand13SeekBar }, 142c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand14TextView, R.id.EQBand14SeekBar }, 143c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand15TextView, R.id.EQBand15SeekBar }, 144c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand16TextView, R.id.EQBand16SeekBar }, 145c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand17TextView, R.id.EQBand17SeekBar }, 146c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand18TextView, R.id.EQBand18SeekBar }, 147c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand19TextView, R.id.EQBand19SeekBar }, 148c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand20TextView, R.id.EQBand20SeekBar }, 149c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand21TextView, R.id.EQBand21SeekBar }, 150c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand22TextView, R.id.EQBand22SeekBar }, 151c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand23TextView, R.id.EQBand23SeekBar }, 152c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand24TextView, R.id.EQBand24SeekBar }, 153c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand25TextView, R.id.EQBand25SeekBar }, 154c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand26TextView, R.id.EQBand26SeekBar }, 155c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand27TextView, R.id.EQBand27SeekBar }, 156c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand28TextView, R.id.EQBand28SeekBar }, 157c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand29TextView, R.id.EQBand29SeekBar }, 158c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand30TextView, R.id.EQBand30SeekBar }, 159c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen { R.id.EQBand31TextView, R.id.EQBand31SeekBar } }; 16066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 16166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Preset Reverb fields 16266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 16366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Array containing the PR preset names. 16466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 16566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private static final String[] PRESETREVERBPRESETSTRINGS = { "None", "SmallRoom", "MediumRoom", 16666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen "LargeRoom", "MediumHall", "LargeHall", "Plate" }; 16766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 16866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 16966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Context field 17066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 17166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private Context mContext; 17266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 17366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 17466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Calling package name field 17566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 17666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private String mCallingPackageName = "empty"; 17766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 17866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 17966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Audio session field 18066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 18166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private int mAudioSession = AudioEffect.ERROR_BAD_VALUE; 18266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 18366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Broadcast receiver to handle wired and Bluetooth A2dp headset events 18466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 18566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 18666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onReceive(final Context context, final Intent intent) { 18766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final String action = intent.getAction(); 18866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final boolean isHeadsetOnPrev = mIsHeadsetOn; 18966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 19066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (action.equals(Intent.ACTION_HEADSET_PLUG)) { 19166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mIsHeadsetOn = (intent.getIntExtra("state", 0) == 1) 19266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen || audioManager.isBluetoothA2dpOn(); 19366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } else if (action.equals(BluetoothDevice.ACTION_ACL_CONNECTED)) { 19466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int deviceClass = ((BluetoothDevice) intent 19566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)).getBluetoothClass() 19666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen .getDeviceClass(); 19766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if ((deviceClass == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES) 19866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen || (deviceClass == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET)) { 19966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mIsHeadsetOn = true; 20066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 20166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } else if (action.equals(AudioManager.ACTION_AUDIO_BECOMING_NOISY)) { 20266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mIsHeadsetOn = audioManager.isBluetoothA2dpOn() || audioManager.isWiredHeadsetOn(); 20366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } else if (action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) { 20466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int deviceClass = ((BluetoothDevice) intent 20566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)).getBluetoothClass() 20666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen .getDeviceClass(); 20766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if ((deviceClass == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES) 20866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen || (deviceClass == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET)) { 20966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mIsHeadsetOn = audioManager.isWiredHeadsetOn(); 21066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 21166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 21266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (isHeadsetOnPrev != mIsHeadsetOn) { 21366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen updateUIHeadset(); 21466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 21566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 21666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen }; 21766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 21866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /* 21966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Declares and initializes all objects and widgets in the layouts and the CheckBox and SeekBar 22066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * onchange methods on creation. 22166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 22266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * (non-Javadoc) 22366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 22466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @see android.app.ActivityGroup#onCreate(android.os.Bundle) 22566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 22666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 22766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onCreate(final Bundle savedInstanceState) { 22866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen super.onCreate(savedInstanceState); 22966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 23066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Init context to be used in listeners 23166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mContext = this; 23266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 23366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Receive intent 23466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // get calling intent 23566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final Intent intent = getIntent(); 23666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, 23766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen AudioEffect.ERROR_BAD_VALUE); 23866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen Log.v(TAG, "audio session: " + mAudioSession); 23966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 24066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mCallingPackageName = getCallingPackage(); 24166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 24266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // check for errors 24366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mCallingPackageName == null) { 24466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen Log.e(TAG, "Package name is null"); 24566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen setResult(RESULT_CANCELED); 24666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen finish(); 24766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen return; 24866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 24966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen setResult(RESULT_OK); 25066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 25166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen Log.v(TAG, mCallingPackageName + " (" + mAudioSession + ")"); 25266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 25366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.initEffectsPreferences(mContext, mCallingPackageName, mAudioSession); 25466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 25566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // query available effects 25666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final Descriptor[] effects = AudioEffect.queryEffects(); 25766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 25866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Determine available/supported effects 25966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen Log.v(TAG, "Available effects:"); 26066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen for (final Descriptor effect : effects) { 26166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen Log.v(TAG, effect.name.toString() + ", type: " + effect.type.toString()); 26266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 26366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (effect.type.equals(AudioEffect.EFFECT_TYPE_VIRTUALIZER)) { 26466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mVirtualizerSupported = true; 2654fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi mVirtualizerIsHeadphoneOnly = !isVirtualizerTransauralSupported(); 26666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } else if (effect.type.equals(AudioEffect.EFFECT_TYPE_BASS_BOOST)) { 26766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mBassBoostSupported = true; 26866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } else if (effect.type.equals(AudioEffect.EFFECT_TYPE_EQUALIZER)) { 26966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mEqualizerSupported = true; 27066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } else if (effect.type.equals(AudioEffect.EFFECT_TYPE_PRESET_REVERB)) { 27166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mPresetReverbSupported = true; 27266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 27366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 27466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 27566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen setContentView(R.layout.music_main); 27666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final ViewGroup viewGroup = (ViewGroup) findViewById(R.id.contentSoundEffects); 27766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 2789412a204062d411d1e66f03e4d0a28a4d823984fjiabin // Set accessibility label for bass boost and virtualizer strength seekbars. 2799412a204062d411d1e66f03e4d0a28a4d823984fjiabin findViewById(R.id.bBStrengthText).setLabelFor(R.id.bBStrengthSeekBar); 2809412a204062d411d1e66f03e4d0a28a4d823984fjiabin findViewById(R.id.vIStrengthText).setLabelFor(R.id.vIStrengthSeekBar); 2819412a204062d411d1e66f03e4d0a28a4d823984fjiabin 282c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen // Fill array with presets from AudioEffects call. 283c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen // allocate a space for 2 extra strings (CI Extreme & User) 284c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen final int numPresets = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName, 285c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mAudioSession, ControlPanelEffect.Key.eq_num_presets); 286c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mEQPresetNames = new String[numPresets + 2]; 287c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen for (short i = 0; i < numPresets; i++) { 288c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mEQPresetNames[i] = ControlPanelEffect.getParameterString(mContext, 289c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_preset_name, i); 290c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen } 291c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mEQPresetNames[numPresets] = getString(R.string.ci_extreme); 292c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mEQPresetNames[numPresets + 1] = getString(R.string.user); 293c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mEQPresetUserPos = numPresets + 1; 294c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen 29566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Watch for button clicks and initialization. 29666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if ((mVirtualizerSupported) || (mBassBoostSupported) || (mEqualizerSupported) 29766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen || (mPresetReverbSupported)) { 29866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Set the listener for the main enhancements toggle button. 29966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Depending on the state enable the supported effects if they were 30066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // checked in the setup tab. 301709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen mToggleSwitch = new Switch(this); 302709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen mToggleSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() { 30366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 30466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onCheckedChanged(final CompoundButton buttonView, 30566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final boolean isChecked) { 30666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 30766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // set parameter and state 30866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName, 30966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.global_enabled, isChecked); 31066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Enable Linear layout (in scroll layout) view with all 31166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // effect contents depending on checked state 31229daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen setEnabledAllChildren(viewGroup, isChecked); 31366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // update UI according to headset state 31466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen updateUIHeadset(); 31566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 31666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen }); 31766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 31866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Initialize the Virtualizer elements. 31966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Set the SeekBar listener. 32066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mVirtualizerSupported) { 32166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Show msg when disabled slider (layout) is touched 32266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen findViewById(R.id.vILayout).setOnTouchListener(new OnTouchListener() { 32366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 32466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 32566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public boolean onTouch(final View v, final MotionEvent event) { 32684c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen if (event.getAction() == MotionEvent.ACTION_UP) { 32784c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen showHeadsetMsg(); 32884c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen } 32966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen return false; 33066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 33166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen }); 33266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 33366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final SeekBar seekbar = (SeekBar) findViewById(R.id.vIStrengthSeekBar); 33466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen seekbar.setMax(OpenSLESConstants.VIRTUALIZER_MAX_STRENGTH 33566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen - OpenSLESConstants.VIRTUALIZER_MIN_STRENGTH); 33666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 33766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 33866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Update the parameters while SeekBar changes and set the 33966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // effect parameter. 34066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 34166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 34266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onProgressChanged(final SeekBar seekBar, final int progress, 34366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final boolean fromUser) { 34466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // set parameter and state 34566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, 34666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.virt_strength, progress); 34766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 34866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 34966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // If slider pos was 0 when starting re-enable effect 35066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 35166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onStartTrackingTouch(final SeekBar seekBar) { 35266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (seekBar.getProgress() == 0) { 35366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName, 35466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.virt_enabled, true); 35566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 35666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 35766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 35866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // If slider pos = 0 when stopping disable effect 35966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 36066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onStopTrackingTouch(final SeekBar seekBar) { 36166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (seekBar.getProgress() == 0) { 36266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // disable 36366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName, 36466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.virt_enabled, false); 36566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 36666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 36766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen }); 368bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen 369bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen final Switch sw = (Switch) findViewById(R.id.vIStrengthToggle); 370bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen sw.setOnCheckedChangeListener(new OnCheckedChangeListener() { 371bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen @Override 372bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen public void onCheckedChanged(final CompoundButton buttonView, 373bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen final boolean isChecked) { 374bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName, 375bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen mAudioSession, ControlPanelEffect.Key.virt_enabled, isChecked); 376bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen } 377bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen }); 37866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 37966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 38066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Initialize the Bass Boost elements. 38166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Set the SeekBar listener. 38266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mBassBoostSupported) { 38366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Show msg when disabled slider (layout) is touched 38466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen findViewById(R.id.bBLayout).setOnTouchListener(new OnTouchListener() { 38566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 38666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 38766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public boolean onTouch(final View v, final MotionEvent event) { 38884c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen if (event.getAction() == MotionEvent.ACTION_UP) { 38984c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen showHeadsetMsg(); 39084c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen } 39166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen return false; 39266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 39366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen }); 39466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 39566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final SeekBar seekbar = (SeekBar) findViewById(R.id.bBStrengthSeekBar); 39666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen seekbar.setMax(OpenSLESConstants.BASSBOOST_MAX_STRENGTH 39766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen - OpenSLESConstants.BASSBOOST_MIN_STRENGTH); 39866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 39966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 40066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Update the parameters while SeekBar changes and set the 40166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // effect parameter. 40266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 40366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 40466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onProgressChanged(final SeekBar seekBar, final int progress, 40566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final boolean fromUser) { 40666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // set parameter and state 40766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, 40866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.bb_strength, progress); 40966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 41066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 41166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // If slider pos was 0 when starting re-enable effect 41266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 41366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onStartTrackingTouch(final SeekBar seekBar) { 41466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (seekBar.getProgress() == 0) { 41566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName, 41666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.bb_enabled, true); 41766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 41866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 41966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 42066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // If slider pos = 0 when stopping disable effect 42166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 42266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onStopTrackingTouch(final SeekBar seekBar) { 42366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (seekBar.getProgress() == 0) { 42466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // disable 42566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterBoolean(mContext, mCallingPackageName, 42666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.bb_enabled, false); 42766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 42866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 42966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 43066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen }); 43166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 43266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 43366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Initialize the Equalizer elements. 43466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mEqualizerSupported) { 435e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mEQPreset = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName, 436e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mAudioSession, ControlPanelEffect.Key.eq_current_preset); 437e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen if (mEQPreset >= mEQPresetNames.length) { 438e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mEQPreset = 0; 439e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen } 440e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mEQPresetPrevious = mEQPreset; 441e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen equalizerSpinnerInit((Spinner)findViewById(R.id.eqSpinner)); 442e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen equalizerBandsInit(findViewById(R.id.eqcontainer)); 44366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 44466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 44566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Initialize the Preset Reverb elements. 44666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Set Spinner listeners. 44766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mPresetReverbSupported) { 448e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mPRPreset = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName, 449e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mAudioSession, ControlPanelEffect.Key.pr_current_preset); 450e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mPRPresetPrevious = mPRPreset; 451e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen reverbSpinnerInit((Spinner)findViewById(R.id.prSpinner)); 45266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 45366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 454597c06688c95b72ad4d8da8d027ef466656801f3guojingx ActionBar ab = getActionBar(); 455597c06688c95b72ad4d8da8d027ef466656801f3guojingx final int padding = getResources().getDimensionPixelSize( 456597c06688c95b72ad4d8da8d027ef466656801f3guojingx R.dimen.action_bar_switch_padding); 457597c06688c95b72ad4d8da8d027ef466656801f3guojingx mToggleSwitch.setPadding(0,0, padding, 0); 458597c06688c95b72ad4d8da8d027ef466656801f3guojingx ab.setCustomView(mToggleSwitch, new ActionBar.LayoutParams( 459597c06688c95b72ad4d8da8d027ef466656801f3guojingx ActionBar.LayoutParams.WRAP_CONTENT, 460597c06688c95b72ad4d8da8d027ef466656801f3guojingx ActionBar.LayoutParams.WRAP_CONTENT, 461597c06688c95b72ad4d8da8d027ef466656801f3guojingx Gravity.CENTER_VERTICAL | Gravity.RIGHT)); 462597c06688c95b72ad4d8da8d027ef466656801f3guojingx ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_CUSTOM); 463597c06688c95b72ad4d8da8d027ef466656801f3guojingx 46466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } else { 46566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen viewGroup.setVisibility(View.GONE); 46666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ((TextView) findViewById(R.id.noEffectsTextView)).setVisibility(View.VISIBLE); 46766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 46884c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen 46966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 47066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 47166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /* 47266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * (non-Javadoc) 47366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 47466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @see android.app.Activity#onResume() 47566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 47666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 47766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen protected void onResume() { 47866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen super.onResume(); 47966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if ((mVirtualizerSupported) || (mBassBoostSupported) || (mEqualizerSupported) 48066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen || (mPresetReverbSupported)) { 48166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Listen for broadcast intents that might affect the onscreen UI for headset. 48266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final IntentFilter intentFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); 48366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); 48466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); 48566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen intentFilter.addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY); 48666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen registerReceiver(mReceiver, intentFilter); 48766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 48866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Check if wired or Bluetooth headset is connected/on 48966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 49066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mIsHeadsetOn = (audioManager.isWiredHeadsetOn() || audioManager.isBluetoothA2dpOn()); 49166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen Log.v(TAG, "onResume: mIsHeadsetOn : " + mIsHeadsetOn); 49266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 49366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Update UI 49466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen updateUI(); 49566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 49666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 49766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 49866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /* 49966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * (non-Javadoc) 50066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 50166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @see android.app.Activity#onPause() 50266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 50366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 50466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen protected void onPause() { 50566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen super.onPause(); 50666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 50766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Unregister for broadcast intents. (These affect the visible UI, 50866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // so we only care about them while we're in the foreground.) 509597c06688c95b72ad4d8da8d027ef466656801f3guojingx if ((mVirtualizerSupported) || (mBassBoostSupported) || (mEqualizerSupported) 510597c06688c95b72ad4d8da8d027ef466656801f3guojingx || (mPresetReverbSupported)) { 511597c06688c95b72ad4d8da8d027ef466656801f3guojingx unregisterReceiver(mReceiver); 512597c06688c95b72ad4d8da8d027ef466656801f3guojingx } 51366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 51466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 515e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen private void reverbSpinnerInit(Spinner spinner) { 516e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 517e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen android.R.layout.simple_spinner_item, PRESETREVERBPRESETSTRINGS); 518e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 519e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen spinner.setAdapter(adapter); 520e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 521e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen 522e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen @Override 523e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 524e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen if (position != mPRPresetPrevious) { 525e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen presetReverbSetPreset(position); 52666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 527e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mPRPresetPrevious = position; 528e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen } 52966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 530e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen @Override 531e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen public void onNothingSelected(AdapterView<?> parent) { 532e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen } 533e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen }); 534e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen spinner.setSelection(mPRPreset); 53566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 53666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 537e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen private void equalizerSpinnerInit(Spinner spinner) { 538e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 539e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen android.R.layout.simple_spinner_item, mEQPresetNames); 540e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 541e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen spinner.setAdapter(adapter); 542e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 543e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen 544e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen @Override 545e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 546e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen if (position != mEQPresetPrevious) { 547e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen equalizerSetPreset(position); 548e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen } 549e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen mEQPresetPrevious = position; 550743172011ae03fe3f82759750932c6220a3a50a6Marco Nelissen } 551e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen 552e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen @Override 553e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen public void onNothingSelected(AdapterView<?> parent) { 554e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen } 555e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen }); 556e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen spinner.setSelection(mEQPreset); 55766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 55866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 559e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen 56066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 56129daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen * En/disables all children for a given view. For linear and relative layout children do this 56266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * recursively 56366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 56429daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen * @param viewGroup 56566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @param enabled 56666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 56729daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen private void setEnabledAllChildren(final ViewGroup viewGroup, final boolean enabled) { 56866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int count = viewGroup.getChildCount(); 56966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen for (int i = 0; i < count; i++) { 57066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final View view = viewGroup.getChildAt(i); 571a3818dbc8cbd1d0ac65ba4f869ccdb100e3db66aMarco Nelissen if ((view instanceof ViewGroup)) { 57266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final ViewGroup vg = (ViewGroup) view; 57329daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen setEnabledAllChildren(vg, enabled); 57466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 57566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen view.setEnabled(enabled); 57666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 57766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 57866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 57966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 58066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Updates UI (checkbox, seekbars, enabled states) according to the current stored preferences. 58166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 58266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private void updateUI() { 58366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final boolean isEnabled = ControlPanelEffect.getParameterBoolean(mContext, 58466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mCallingPackageName, mAudioSession, ControlPanelEffect.Key.global_enabled); 585709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen mToggleSwitch.setChecked(isEnabled); 58629daf21d80412d192e2ec879005f844baab1cf54Marco Nelissen setEnabledAllChildren((ViewGroup) findViewById(R.id.contentSoundEffects), isEnabled); 58766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen updateUIHeadset(); 58866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 58966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mVirtualizerSupported) { 590bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen SeekBar bar = (SeekBar) findViewById(R.id.vIStrengthSeekBar); 591bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen Switch sw = (Switch) findViewById(R.id.vIStrengthToggle); 592bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen int strength = ControlPanelEffect 59366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen .getParameterInt(mContext, mCallingPackageName, mAudioSession, 594bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen ControlPanelEffect.Key.virt_strength); 595bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen bar.setProgress(strength); 596bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen boolean hasStrength = ControlPanelEffect.getParameterBoolean(mContext, 597bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen mCallingPackageName, mAudioSession, 598bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen ControlPanelEffect.Key.virt_strength_supported); 599bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen if (hasStrength) { 600bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen sw.setVisibility(View.GONE); 601bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen } else { 602bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen bar.setVisibility(View.GONE); 603bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen sw.setChecked(sw.isEnabled() && strength != 0); 604bc778ede573dc74646d42dfe96997f74b23ac61dMarco Nelissen } 60566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 60666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mBassBoostSupported) { 60766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ((SeekBar) findViewById(R.id.bBStrengthSeekBar)).setProgress(ControlPanelEffect 60866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen .getParameterInt(mContext, mCallingPackageName, mAudioSession, 60966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.Key.bb_strength)); 61066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 61166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mEqualizerSupported) { 61284c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen equalizerUpdateDisplay(); 61366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 61466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (mPresetReverbSupported) { 615e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen int reverb = ControlPanelEffect.getParameterInt( 61666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mContext, mCallingPackageName, mAudioSession, 617e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen ControlPanelEffect.Key.pr_current_preset); 618e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen ((Spinner)findViewById(R.id.prSpinner)).setSelection(reverb); 61966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 62066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 62166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 62266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 62366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Updates UI for headset mode. En/disable VI and BB controls depending on headset state 62466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * (on/off) if effects are on. Do the inverse for their layouts so they can take over 62566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * control/events. 62666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 62766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private void updateUIHeadset() { 628709c41588693deef6f9130c819fe742bf0ced05fMarco Nelissen if (mToggleSwitch.isChecked()) { 6291c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen ((TextView) findViewById(R.id.vIStrengthText)).setEnabled( 6301c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly); 6311c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen ((SeekBar) findViewById(R.id.vIStrengthSeekBar)).setEnabled( 6321c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly); 6331c9259eb99450fbfdbbea8c82b79c46d339179b7Marco Nelissen findViewById(R.id.vILayout).setEnabled(!mIsHeadsetOn || !mVirtualizerIsHeadphoneOnly); 63466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ((TextView) findViewById(R.id.bBStrengthText)).setEnabled(mIsHeadsetOn); 63566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ((SeekBar) findViewById(R.id.bBStrengthSeekBar)).setEnabled(mIsHeadsetOn); 63666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen findViewById(R.id.bBLayout).setEnabled(!mIsHeadsetOn); 63766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 63866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 63966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 64066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 64166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Initializes the equalizer elements. Set the SeekBars and Spinner listeners. 64266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 643e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen private void equalizerBandsInit(View eqcontainer) { 64466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Initialize the N-Band Equalizer elements. 64566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mNumberEqualizerBands = ControlPanelEffect.getParameterInt(mContext, mCallingPackageName, 64666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mAudioSession, ControlPanelEffect.Key.eq_num_bands); 64766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mEQPresetUserBandLevelsPrev = ControlPanelEffect.getParameterIntArray(mContext, 64866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mCallingPackageName, mAudioSession, 64966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.Key.eq_preset_user_band_level); 65066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int[] centerFreqs = ControlPanelEffect.getParameterIntArray(mContext, 65166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_center_freq); 65266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int[] bandLevelRange = ControlPanelEffect.getParameterIntArray(mContext, 65366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_level_range); 6549ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia mEqualizerMinBandLevel = (int) Math.max(EQUALIZER_MIN_LEVEL, bandLevelRange[0]); 6559ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia final int mEqualizerMaxBandLevel = (int) Math.min(EQUALIZER_MAX_LEVEL, bandLevelRange[1]); 65666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 65766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen for (int band = 0; band < mNumberEqualizerBands; band++) { 65866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Unit conversion from mHz to Hz and use k prefix if necessary to display 65966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int centerFreq = centerFreqs[band] / 1000; 66066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen float centerFreqHz = centerFreq; 66166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen String unitPrefix = ""; 66266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (centerFreqHz >= 1000) { 66366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen centerFreqHz = centerFreqHz / 1000; 66466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen unitPrefix = "k"; 66566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 66684c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen ((TextView) eqcontainer.findViewById(EQViewElementIds[band][0])).setText( 667f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen format("%.0f ", centerFreqHz) + unitPrefix + "Hz"); 66884c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen mEqualizerSeekBar[band] = (SeekBar) eqcontainer 66966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen .findViewById(EQViewElementIds[band][1]); 6709412a204062d411d1e66f03e4d0a28a4d823984fjiabin eqcontainer.findViewById(EQViewElementIds[band][0]) 6719412a204062d411d1e66f03e4d0a28a4d823984fjiabin .setLabelFor(EQViewElementIds[band][1]); 67266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mEqualizerSeekBar[band].setMax(mEqualizerMaxBandLevel - mEqualizerMinBandLevel); 67366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mEqualizerSeekBar[band].setOnSeekBarChangeListener(this); 67466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 67566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 67666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Hide the inactive Equalizer bands. 67766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen for (int band = mNumberEqualizerBands; band < EQUALIZER_MAX_BANDS; band++) { 67866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // CenterFreq text 67984c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen eqcontainer.findViewById(EQViewElementIds[band][0]).setVisibility(View.GONE); 68066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // SeekBar 68184c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen eqcontainer.findViewById(EQViewElementIds[band][1]).setVisibility(View.GONE); 68266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 683c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen 684c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen TextView tv = (TextView) findViewById(R.id.maxLevelText); 6859ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia tv.setText(String.format("+%d dB", (int) Math.ceil(mEqualizerMaxBandLevel / 100))); 686c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen tv = (TextView) findViewById(R.id.centerLevelText); 687c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen tv.setText("0 dB"); 688c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen tv = (TextView) findViewById(R.id.minLevelText); 6899ce8fee40b1d179d389381eabf7ebfd10e46fc62Ricardo Garcia tv.setText(String.format("%d dB", (int) Math.floor(mEqualizerMinBandLevel / 100))); 69084c2c6c96c88df3282247d4fa5b02e6b2fd9dc50Marco Nelissen equalizerUpdateDisplay(); 69166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 69266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 693f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen private String format(String format, Object... args) { 694f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen mFormatBuilder.setLength(0); 695f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen mFormatter.format(format, args); 696f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen return mFormatBuilder.toString(); 697f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen } 698f3b2798428ebb3e3895eb5106a4cb69c6bbc8181Marco Nelissen 69966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /* 70066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * For the EQ Band SeekBars 70166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 70266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * (non-Javadoc) 70366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 70466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @see android.widget.SeekBar.OnSeekBarChangeListener#onProgressChanged(android 70566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * .widget.SeekBar, int, boolean) 70666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 70766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 70866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 70966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onProgressChanged(final SeekBar seekbar, final int progress, final boolean fromUser) { 71066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int id = seekbar.getId(); 71166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 71266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen for (short band = 0; band < mNumberEqualizerBands; band++) { 71366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (id == EQViewElementIds[band][1]) { 71466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final short level = (short) (progress + mEqualizerMinBandLevel); 71566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen if (fromUser) { 71666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen equalizerBandUpdate(band, level); 71766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 71866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen break; 71966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 72066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 72166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 72266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 72366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /* 72466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * (non-Javadoc) 72566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 72666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @see android.widget.SeekBar.OnSeekBarChangeListener#onStartTrackingTouch(android 72766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * .widget.SeekBar) 72866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 72966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 73066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 73166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onStartTrackingTouch(final SeekBar seekbar) { 732c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen // get current levels 733c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen final int[] bandLevels = ControlPanelEffect.getParameterIntArray(mContext, 734c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_band_level); 735c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen // copy current levels to user preset 736c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen for (short band = 0; band < mNumberEqualizerBands; band++) { 737c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen equalizerBandUpdate(band, bandLevels[band]); 738c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen } 739c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen equalizerSetPreset(mEQPresetUserPos); 7409c37307a1e0b59572fc474a77aeeb371477a3e8aMarco Nelissen ((Spinner)findViewById(R.id.eqSpinner)).setSelection(mEQPresetUserPos); 74166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 74266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 74366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /* 74466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Updates the EQ display when the user stops changing. 74566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 74666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * (non-Javadoc) 74766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 74866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @see android.widget.SeekBar.OnSeekBarChangeListener#onStopTrackingTouch(android 74966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * .widget.SeekBar) 75066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 75166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 75266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen @Override 75366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen public void onStopTrackingTouch(final SeekBar seekbar) { 75466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen equalizerUpdateDisplay(); 75566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 75666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 75766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 75866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Updates the EQ by getting the parameters. 75966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 76066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private void equalizerUpdateDisplay() { 76166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen // Update and show the active N-Band Equalizer bands. 76266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int[] bandLevels = ControlPanelEffect.getParameterIntArray(mContext, 76366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mCallingPackageName, mAudioSession, ControlPanelEffect.Key.eq_band_level); 76466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen for (short band = 0; band < mNumberEqualizerBands; band++) { 76566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int level = bandLevels[band]; 76666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int progress = level - mEqualizerMinBandLevel; 76766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen mEqualizerSeekBar[band].setProgress(progress); 76866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 76966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 77066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 77166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 77266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Updates/sets a given EQ band level. 77366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 77466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @param band 77566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Band id 77666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @param level 77766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * EQ band level 77866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 779c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen private void equalizerBandUpdate(final int band, final int level) { 78066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, mAudioSession, 78166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.Key.eq_band_level, level, band); 78266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 78366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 78466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 78566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Sets the given EQ preset. 78666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 78766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @param preset 78866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * EQ preset id. 78966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 790c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen private void equalizerSetPreset(final int preset) { 79166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, mAudioSession, 79266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.Key.eq_current_preset, preset); 793c4724440363b1a984e6466d9541d91d20b6950d8Marco Nelissen equalizerUpdateDisplay(); 79466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 79566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 79666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 79766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Sets the given PR preset. 79866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * 79966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * @param preset 80066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * PR preset id. 80166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 802e7de651d5cf0c53340bd4502813ccfb3096dff9eMarco Nelissen private void presetReverbSetPreset(final int preset) { 80366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.setParameterInt(mContext, mCallingPackageName, mAudioSession, 80466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen ControlPanelEffect.Key.pr_current_preset, preset); 80566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 80666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 80766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen /** 80866f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen * Show msg that headset needs to be plugged. 80966f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen */ 81066f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen private void showHeadsetMsg() { 81166f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final Context context = getApplicationContext(); 81266f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final int duration = Toast.LENGTH_SHORT; 81366f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen 81466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen final Toast toast = Toast.makeText(context, getString(R.string.headset_plug), duration); 81566f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen toast.setGravity(Gravity.CENTER, toast.getXOffset() / 2, toast.getYOffset() / 2); 81666f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen toast.show(); 81766f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen } 8184fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi 8194fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi private static boolean isVirtualizerTransauralSupported() { 8204fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi Virtualizer virt = null; 8214fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi boolean transauralSupported = false; 8224fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi try { 8234fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi virt = new Virtualizer(0, android.media.AudioSystem.newAudioSessionId()); 8244fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi transauralSupported = virt.canVirtualize(AudioFormat.CHANNEL_OUT_STEREO, 8254fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi Virtualizer.VIRTUALIZATION_MODE_TRANSAURAL); 8264fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi } catch (Exception e) { 8274fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi } finally { 8284fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi if (virt != null) { 8294fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi virt.release(); 8304fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi } 8314fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi } 8324fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi return transauralSupported; 8334fb8174a191b5a33f18b3d63c79423cd229bc559Jean-Michel Trivi } 83466f2cfede1affd65ebc0b2e6854d2aabcfd9bb90Marco Nelissen} 835