diff options
23 files changed, 351 insertions, 609 deletions
diff --git a/res/drawable/logo_dts_fc.xml b/res/drawable/logo_dts_fc.xml index ea9bbed..a9abeb3 100644 --- a/res/drawable/logo_dts_fc.xml +++ b/res/drawable/logo_dts_fc.xml @@ -80,4 +80,4 @@ c-0.1-0.1-0.1-0.2-0.2-0.2c0,0-0.1,0-0.1,0h-0.1v0.4H54.7z M54.9,3h0.2c0.1,0,0.2,0,0.2,0c0,0,0.1-0.1,0.1-0.1c0,0,0-0.1,0-0.1 c0,0,0,0-0.1-0.1c0,0-0.1,0-0.2,0h-0.2V3z" /> </group> -</vector>
\ No newline at end of file +</vector> diff --git a/res/layout/action_bar.xml b/res/layout/action_bar.xml deleted file mode 100644 index 6477951..0000000 --- a/res/layout/action_bar.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <Spinner xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/spinner" - android:layout_weight="0" - android:dropDownWidth="wrap_content" - android:layout_width="wrap_content" - android:layout_height="wrap_content"/> - - <Space android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1"/> - - <CheckBox - android:layout_weight="0" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:id="@+id/device_toggle"/> - -</LinearLayout> diff --git a/res/layout/action_bar_custom_components.xml b/res/layout/action_bar_custom_components.xml new file mode 100644 index 0000000..3d65eb3 --- /dev/null +++ b/res/layout/action_bar_custom_components.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="wrap_content" + android:layout_height="match_parent"> + + <ViewStub + android:id="@+id/logo_stub" + android:gravity="center_vertical" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + /> + + <CheckBox + android:id="@+id/global_toggle" + android:layout_gravity="center_vertical" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:button="@drawable/toggle_check" + android:paddingRight="@dimen/action_bar_switch_padding" + /> + +</LinearLayout> diff --git a/res/layout/action_bar_dts_logo.xml b/res/layout/action_bar_dts_logo.xml new file mode 100644 index 0000000..89a439c --- /dev/null +++ b/res/layout/action_bar_dts_logo.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:paddingRight="@dimen/action_bar_dts_switch_padding"> + + <TextView + android:text="@string/powered_by" + android:layout_gravity="center_horizontal" + android:textSize="10sp" + android:typeface="sans" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + /> + + <ImageView + android:id="@+id/dts_logo" + android:src="@drawable/logo_dts_fc" + android:layout_weight="1" + android:layout_width="wrap_content" + android:layout_height="0dp" + /> + + +</LinearLayout> diff --git a/res/layout/action_bar_spinner.xml b/res/layout/action_bar_spinner.xml deleted file mode 100644 index 67b81d1..0000000 --- a/res/layout/action_bar_spinner.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<RelativeLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:padding="8dp"> - - <TextView android:id="@android:id/summary" - android:textSize="14sp" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentBottom="true" - android:gravity="center_vertical"/> - - <TextView android:id="@android:id/title" - android:textSize="18sp" - android:textStyle="bold" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentTop="true" - android:layout_above="@android:id/summary" - android:layout_alignWithParentIfMissing="true" - android:gravity="center_vertical"/> - -</RelativeLayout> - diff --git a/res/layout/action_bar_spinner_row.xml b/res/layout/action_bar_spinner_row.xml deleted file mode 100644 index d081618..0000000 --- a/res/layout/action_bar_spinner_row.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<RelativeLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="64dp" - android:padding="8dp"> - - <TextView android:id="@android:id/summary" - android:textSize="14sp" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentBottom="true" - android:gravity="center_vertical"/> - - <TextView android:id="@android:id/title" - android:textSize="18sp" - android:textStyle="bold" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentTop="true" - android:layout_above="@android:id/summary" - android:layout_alignWithParentIfMissing="true" - android:gravity="center_vertical"/> - -</RelativeLayout> diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml index 6b25b14..d22a7f0 100644 --- a/res/values/cm_strings.xml +++ b/res/values/cm_strings.xml @@ -66,11 +66,12 @@ <string name="rename">Rename</string> <string name="remove_custom_preset_warning_message">Are you sure you want to remove %1$s?</string> - <string name="mode_audiofx" translatable="false"></string> - <string name="mode_dts" translatable="false">with DTS Sound™</string> - <string name="app_name" translatable="false">AudioFX</string> <string name="app_title" translatable="false">@string/app_name</string> - <string name="app_subtitle" translatable="false">Powered by MaxxAudio</string> + + <string name="powered_by_maxx_audio" translatable="false">Powered by MaxxAudio</string> + <string name="mode_dts" translatable="false">with DTS Sound™</string> + <string name="powered_by">powered by</string> + </resources> diff --git a/res/values/dimens.xml b/res/values/dimens.xml index f7c8a71..93019de 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -52,7 +52,6 @@ <dimen name="radial_text_size">18sp</dimen> <dimen name="radial_knob_stroke">22dp</dimen> - <!-- 16 dp + 64 dp --> <dimen name="action_bar_dts_switch_padding">48dp</dimen> </resources> diff --git a/src/com/cyngn/audiofx/activity/ActivityMusic.java b/src/com/cyngn/audiofx/activity/ActivityMusic.java index 622ba5c..f75273d 100644 --- a/src/com/cyngn/audiofx/activity/ActivityMusic.java +++ b/src/com/cyngn/audiofx/activity/ActivityMusic.java @@ -2,7 +2,6 @@ package com.cyngn.audiofx.activity; import android.app.ActionBar; import android.app.Activity; -import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; @@ -10,60 +9,35 @@ import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; +import android.view.ViewStub; import android.widget.CheckBox; import android.widget.CompoundButton; -import android.widget.Spinner; -import android.widget.TextView; import com.cyanogen.ambient.analytics.Event; import com.cyngn.audiofx.AudioFxApplication; import com.cyngn.audiofx.Constants; import com.cyngn.audiofx.R; import com.cyngn.audiofx.fragment.AudioFxFragment; -import com.cyngn.audiofx.fragment.DTSFragment; import com.cyngn.audiofx.knobs.KnobCommander; import com.cyngn.audiofx.service.AudioFxService; -import com.cyngn.audiofx.service.DtsControl; import com.cyngn.audiofx.stats.AppState; import com.cyngn.audiofx.stats.UserSession; -import java.util.ArrayList; -import java.util.List; - public class ActivityMusic extends Activity { private static final String TAG = ActivityMusic.class.getSimpleName(); private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - public static final int CURRENT_MODE_AUDIOFX = 1; - public static final int CURRENT_MODE_DTS = 2; - public static final String TAG_AUDIOFX = "audiofx"; - public static final String TAG_DTS = "dts"; public static final String EXTRA_CALLING_PACKAGE = "audiofx::extra_calling_package"; - private int mCurrentMode = CURRENT_MODE_AUDIOFX; - private Spinner mSpinner; - DtsControl mDts; - private CheckBox mCurrentDeviceToggle; MasterConfigControl mConfig; String mCallingPackage; - private List<ActivityStateListener> mGlobalToggleListeners = new ArrayList<>(); - private boolean mWaitingForService = true; private SharedPreferences.OnSharedPreferenceChangeListener mServiceReadyObserver; - public interface ActivityStateListener { - public void onModeChanged(int mode); - } - private CompoundButton.OnCheckedChangeListener mGlobalEnableToggleListener = new CompoundButton.OnCheckedChangeListener() { @Override @@ -102,7 +76,6 @@ public class ActivityMusic extends Activity { sharedPreferences.unregisterOnSharedPreferenceChangeListener(this); mConfig.onResetDefaults(); init(savedInstanceState); - setupDtsActionBar(); mWaitingForService = false; invalidateOptionsMenu(); @@ -145,91 +118,39 @@ public class ActivityMusic extends Activity { private void init(Bundle savedInstanceState) { mConfig = MasterConfigControl.getInstance(this); - mDts = new DtsControl(this); ActionBar ab = getActionBar(); ab.setTitle(R.string.app_title); - ab.setDisplayShowCustomEnabled(true); - - if (mDts.hasDts()) { - ab.setCustomView(R.layout.action_bar); + ab.setDisplayShowTitleEnabled(true); - mCurrentDeviceToggle = (CheckBox) findViewById(R.id.device_toggle); - final int padding = getResources().getDimensionPixelSize( - R.dimen.action_bar_switch_padding); - mCurrentDeviceToggle.setPaddingRelative(mCurrentDeviceToggle.getPaddingLeft(), - mCurrentDeviceToggle.getPaddingTop(), - padding, - mCurrentDeviceToggle.getPaddingBottom()); - - mCurrentDeviceToggle.setButtonDrawable(R.drawable.toggle_check); - mCurrentDeviceToggle.setOnCheckedChangeListener(mGlobalEnableToggleListener); - - ModeAdapter spinnerAdapter = new ModeAdapter(this); - - mSpinner = (Spinner) findViewById(R.id.spinner); - mSpinner.setAdapter(spinnerAdapter); - - final boolean shouldUseDts = mDts.shouldUseDts(); - setCurrentMode(shouldUseDts ? CURRENT_MODE_DTS : CURRENT_MODE_AUDIOFX); - mSpinner.setSelection(shouldUseDts ? 1 : 0, false); - } else { - // manually populate action bar - if (mConfig.hasMaxxAudio()) { - ab.setDisplayShowTitleEnabled(true); - ab.setSubtitle(R.string.app_subtitle); - } - // setup actionbar on off switch - mCurrentDeviceToggle = new CheckBox(this); - final int padding = getResources().getDimensionPixelSize( - R.dimen.action_bar_switch_padding); - mCurrentDeviceToggle.setPaddingRelative(0, 0, padding, 0); - mCurrentDeviceToggle.setButtonDrawable(R.drawable.toggle_check); - mCurrentDeviceToggle.setOnCheckedChangeListener(mGlobalEnableToggleListener); + final View extraView = LayoutInflater.from(this) + .inflate(R.layout.action_bar_custom_components, null); + ActionBar.LayoutParams lp = new ActionBar.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, + ActionBar.LayoutParams.WRAP_CONTENT, Gravity.RIGHT | Gravity.CENTER_VERTICAL); + ab.setCustomView(extraView, lp); + ab.setDisplayShowCustomEnabled(true); - final ActionBar.LayoutParams params = new ActionBar.LayoutParams( - ActionBar.LayoutParams.WRAP_CONTENT, - ActionBar.LayoutParams.WRAP_CONTENT, - Gravity.CENTER_VERTICAL | Gravity.END); - ab.setCustomView(mCurrentDeviceToggle, params); - } + mCurrentDeviceToggle = (CheckBox) ab.getCustomView().findViewById(R.id.global_toggle); + mCurrentDeviceToggle.setOnCheckedChangeListener(mGlobalEnableToggleListener); if (savedInstanceState == null && findViewById(R.id.main_fragment) != null) { getFragmentManager() .beginTransaction() - .add(R.id.main_fragment, - mCurrentMode == CURRENT_MODE_AUDIOFX - ? new AudioFxFragment() - : new DTSFragment(), - TAG_AUDIOFX) + .add(R.id.main_fragment, new AudioFxFragment(), TAG_AUDIOFX) .commit(); } + applyOemDecor(); } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - if (!mWaitingForService && mDts.hasDts()) { - final boolean audioFX = mCurrentMode == CURRENT_MODE_AUDIOFX; - final int padding = getResources().getDimensionPixelSize( - audioFX ? R.dimen.action_bar_switch_padding - : R.dimen.action_bar_dts_switch_padding); - - mCurrentDeviceToggle.setPaddingRelative(mCurrentDeviceToggle.getPaddingLeft(), - mCurrentDeviceToggle.getPaddingTop(), - padding, - mCurrentDeviceToggle.getPaddingBottom()); + private void applyOemDecor() { + ActionBar ab = getActionBar(); + if (mConfig.hasMaxxAudio()) { + ab.setSubtitle(R.string.powered_by_maxx_audio); + } else if (mConfig.hasDts()) { + final ViewStub stub = (ViewStub) ab.getCustomView().findViewById(R.id.logo_stub); + stub.setLayoutResource(R.layout.action_bar_dts_logo); + stub.inflate(); } - return super.onPrepareOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - return super.onOptionsItemSelected(item); } @Override @@ -239,13 +160,6 @@ public class ActivityMusic extends Activity { // initiate a new session new UserSession(mCallingPackage); - - if (mWaitingForService) { - return; - } - - // action bar controls need to live beyond all fragments - setupDtsActionBar(); } @Override @@ -257,7 +171,7 @@ public class ActivityMusic extends Activity { final Event.Builder builder = new Event.Builder("session", "ended"); UserSession.getInstance().append(builder); AppState.appendState(mConfig, KnobCommander.getInstance(this), builder); - ((AudioFxApplication)getApplicationContext()).sendEvent(builder.build()); + ((AudioFxApplication) getApplicationContext()).sendEvent(builder.build()); } @Override @@ -270,55 +184,6 @@ public class ActivityMusic extends Activity { } } - private void setupDtsActionBar() { - if (!mDts.hasDts()) { - return; - } - mCurrentDeviceToggle = (CheckBox) findViewById(R.id.device_toggle); - - mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { - int selectedMode = (Integer) parent.getItemAtPosition(position); - setCurrentMode(selectedMode); - - mDts.setShouldUseDts(mCurrentMode == CURRENT_MODE_DTS); - - if (mCurrentMode == CURRENT_MODE_AUDIOFX) { - mCurrentDeviceToggle.setChecked(mConfig.isCurrentDeviceEnabled()); - - // change to audio fx layout - getFragmentManager() - .beginTransaction() - .replace(R.id.main_fragment, new AudioFxFragment(), TAG_AUDIOFX) - .commit(); - - } else if (mCurrentMode == CURRENT_MODE_DTS) { - // change to dts layout - getFragmentManager() - .beginTransaction() - .replace(R.id.main_fragment, new DTSFragment(), TAG_DTS) - .commit(); - } - mCurrentDeviceToggle = null; - setupDtsActionBar(); - } - - @Override - public void onNothingSelected(AdapterView<?> parent) { - - } - }); - } - - public void addToggleListener(ActivityStateListener listener) { - mGlobalToggleListeners.add(listener); - } - - public void removeToggleListener(ActivityStateListener listener) { - mGlobalToggleListeners.remove(listener); - } - public void setGlobalToggleChecked(boolean checked) { if (mCurrentDeviceToggle != null) { mCurrentDeviceToggle.setOnCheckedChangeListener(null); @@ -327,85 +192,7 @@ public class ActivityMusic extends Activity { } } - public void setCurrentMode(int currentMode) { - if (mCurrentMode != currentMode) { - mCurrentMode = currentMode; - for (ActivityStateListener listener : mGlobalToggleListeners) { - listener.onModeChanged(mCurrentMode); - } - } - } - public CompoundButton getGlobalSwitch() { return mCurrentDeviceToggle; } - - public int getCurrentMode() { - return mCurrentMode; - } - - private static class ModeAdapter extends ArrayAdapter<Integer> { - private LayoutInflater mInflater; - public ModeAdapter(Context context) { - super(context, R.layout.action_bar_spinner_row, android.R.id.title, - new Integer[]{CURRENT_MODE_AUDIOFX, CURRENT_MODE_DTS} - ); - setDropDownViewResource(R.layout.action_bar_spinner_row); - mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - } - - @Override - public View getDropDownView(int position, View convertView, ViewGroup parent) { - View view; - TextView text; - TextView subText; - - if (convertView == null) { - view = mInflater.inflate(R.layout.action_bar_spinner_row, parent, false); - } else { - view = convertView; - } - final Integer mode = getItem(position); - - text = (TextView) view.findViewById(android.R.id.title); - text.setText(R.string.app_name); - - subText = (TextView) view.findViewById(android.R.id.summary); - subText.setText(getModeSubTitle(mode)); - subText.setVisibility(subText.length() == 0 ? View.GONE : View.VISIBLE); - return view; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View view; - TextView text; - TextView subText; - - if (convertView == null) { - view = mInflater.inflate(R.layout.action_bar_spinner, parent, false); - } else { - view = convertView; - } - - final Integer mode = getItem(position); - text = (TextView) view.findViewById(android.R.id.title); - text.setText(R.string.app_name); - - subText = (TextView) view.findViewById(android.R.id.summary); - subText.setText(getModeSubTitle(mode)); - subText.setVisibility(subText.length() == 0 ? View.GONE : View.VISIBLE); - return view; - } - - public String getModeSubTitle(int mode) { - switch (mode) { - case CURRENT_MODE_DTS: - return getContext().getResources().getString(R.string.mode_dts); - case CURRENT_MODE_AUDIOFX: - default: - return null; - } - } - } } diff --git a/src/com/cyngn/audiofx/activity/EqualizerManager.java b/src/com/cyngn/audiofx/activity/EqualizerManager.java index b7f8e8d..7fa85cb 100644 --- a/src/com/cyngn/audiofx/activity/EqualizerManager.java +++ b/src/com/cyngn/audiofx/activity/EqualizerManager.java @@ -107,13 +107,16 @@ public class EqualizerManager { // setup equalizer presets final int numPresets = Integer.parseInt(getGlobalPref("equalizer.number_of_presets", "0")); - // add library-provided presets - String[] presetNames = getGlobalPref("equalizer.preset_names", "").split("\\|"); - mPredefinedPresets = presetNames.length + 1; // we consider first EQ to be part of predefined - for (int i = 0; i < numPresets; i++) { - mEqPresets.add(new Preset.StaticPreset(presetNames[i], getPersistedPresetLevels(i))); + if (numPresets > 0) { + // add library-provided presets + String[] presetNames = getGlobalPref("equalizer.preset_names", "").split("\\|"); + mPredefinedPresets = presetNames.length + 1; // we consider first EQ to be part of predefined + for (int i = 0; i < numPresets; i++) { + mEqPresets.add(new Preset.StaticPreset(presetNames[i], getPersistedPresetLevels(i))); + } + } else { + mPredefinedPresets = 1; // custom is predefined } - // add custom preset mEqPresets.add(new Preset.PermCustomPreset(mContext.getString(R.string.user), getPersistedCustomLevels())); diff --git a/src/com/cyngn/audiofx/activity/MasterConfigControl.java b/src/com/cyngn/audiofx/activity/MasterConfigControl.java index 4ba57f4..ec36613 100644 --- a/src/com/cyngn/audiofx/activity/MasterConfigControl.java +++ b/src/com/cyngn/audiofx/activity/MasterConfigControl.java @@ -279,6 +279,10 @@ public class MasterConfigControl { return mContext.getSharedPreferences(getCurrentDeviceIdentifier(), 0); } + public boolean hasDts() { + return getGlobalPrefs().getBoolean(Constants.AUDIOFX_GLOBAL_HAS_DTS, false); + } + public boolean hasMaxxAudio() { return mHasMaxxAudio; } diff --git a/src/com/cyngn/audiofx/backends/AndroidEffects.java b/src/com/cyngn/audiofx/backends/AndroidEffects.java index bf1c423..ece7742 100644 --- a/src/com/cyngn/audiofx/backends/AndroidEffects.java +++ b/src/com/cyngn/audiofx/backends/AndroidEffects.java @@ -7,7 +7,7 @@ import android.media.audiofx.Virtualizer; /** * EffectSet which comprises standard Android effects */ -class AndroidEffects extends EffectSet { +class AndroidEffects extends EffectSetWithAndroidEq { /** * Session-specific bassboost diff --git a/src/com/cyngn/audiofx/backends/EffectSet.java b/src/com/cyngn/audiofx/backends/EffectSet.java index 32d185c..b31a2b8 100644 --- a/src/com/cyngn/audiofx/backends/EffectSet.java +++ b/src/com/cyngn/audiofx/backends/EffectSet.java @@ -1,27 +1,20 @@ package com.cyngn.audiofx.backends; +import android.content.Context; import android.media.audiofx.Equalizer; +import java.util.List; + /** * Helper class representing the full complement of effects attached to one * audio session. */ public abstract class EffectSet { - /** - * Session-specific equalizer - */ - private final Equalizer mEqualizer; - - private short mEqNumPresets = -1; - private short mEqNumBands = -1; - private final int mSessionId; public EffectSet(int sessionId) { mSessionId = sessionId; - - mEqualizer = new Equalizer(1000, sessionId); } // required effects @@ -42,73 +35,52 @@ public abstract class EffectSet { return false; } - /* - * Take lots of care to not poke values that don't need - * to be poked- this can cause audible pops. - */ - private boolean mEqualizerEnabled = false; - - public void enableEqualizer(boolean enable) { - if (enable != mEqualizerEnabled) { - mEqualizerEnabled = enable; - mEqualizer.setEnabled(enable); - } - } + public abstract void enableEqualizer(boolean enable); - public void setEqualizerLevels(short[] levels) { - if (mEqualizerEnabled) { - for (short i = 0; i < levels.length; i++) { - mEqualizer.setBandLevel(i, levels[i]); - } - } - } + /** + * @param levels in decibels + */ + public void setEqualizerLevelsDecibels(float[] levels) { } - public short getNumEqualizerBands() { - if (mEqNumBands < 0) { - mEqNumBands = mEqualizer.getNumberOfBands(); - } - return mEqNumBands; - } + public abstract short getNumEqualizerBands(); - public void setEqualizerBandLevel(short band, short level) { - if (mEqualizerEnabled) { - mEqualizer.setBandLevel(band, level); - } - } + /** + * @param band + * @param level in millibels + */ + public abstract void setEqualizerBandLevel(short band, float level); - public int getEqualizerBandLevel(short band) { - return mEqualizer.getBandLevel(band); - } + /** + * @return level in millibels + */ + public abstract int getEqualizerBandLevel(short band); - public String getEqualizerPresetName(short preset) { - return mEqualizer.getPresetName(preset); - } + public abstract String getEqualizerPresetName(short preset); - public void useEqualizerPreset(short preset) { - mEqualizer.usePreset(preset); - } + public abstract void useEqualizerPreset(short preset); - public short getNumEqualizerPresets() { - if (mEqNumPresets < 0) { - mEqNumPresets = mEqualizer.getNumberOfPresets(); - } - return mEqNumPresets; - } + public abstract short getNumEqualizerPresets(); - public short[] getEqualizerBandLevelRange() { - return mEqualizer.getBandLevelRange(); - } + public abstract short[] getEqualizerBandLevelRange(); - public int getCenterFrequency(short band) { - return mEqualizer.getCenterFreq(band); - } + /** + * @param band + * @return center frequency of the band in millihertz + */ + public abstract int getCenterFrequency(short band); public abstract void enableBassBoost(boolean enable); + /** + * @param strength with range [0-1000] + */ public abstract void setBassBoostStrength(short strength); public abstract void enableVirtualizer(boolean enable); + /** + * @param strength with range [0-1000] + */ public abstract void setVirtualizerStrength(short strength); public void enableReverb(boolean enable) { @@ -123,6 +95,9 @@ public abstract class EffectSet { return; } + /** + * @param strength with range [0-100] + */ public void setTrebleBoostStrength(short strength) { return; } @@ -131,9 +106,7 @@ public abstract class EffectSet { return; } - public void release() { - mEqualizer.release(); - } + public abstract void release(); public void disableAll() { enableBassBoost(false); @@ -145,4 +118,6 @@ public abstract class EffectSet { } public abstract int getBrand(); + + public void setGlobalEnabled(boolean globalEnabled) { } } diff --git a/src/com/cyngn/audiofx/backends/EffectSetWithAndroidEq.java b/src/com/cyngn/audiofx/backends/EffectSetWithAndroidEq.java new file mode 100644 index 0000000..fef8f54 --- /dev/null +++ b/src/com/cyngn/audiofx/backends/EffectSetWithAndroidEq.java @@ -0,0 +1,91 @@ +package com.cyngn.audiofx.backends; + +import android.media.audiofx.Equalizer; +import com.cyngn.audiofx.eq.EqUtils; + +/** + * Created by roman on 3/1/16. + */ +public abstract class EffectSetWithAndroidEq extends EffectSet { + /** + * Session-specific equalizer + */ + private final Equalizer mEqualizer; + + private short mEqNumPresets = -1; + private short mEqNumBands = -1; + + /* + * Take lots of care to not poke values that don't need + * to be poked- this can cause audible pops. + */ + private boolean mEqualizerEnabled = false; + + public EffectSetWithAndroidEq(int sessionId) { + super(sessionId); + mEqualizer = new Equalizer(1000, sessionId); + } + + + public void enableEqualizer(boolean enable) { + if (enable != mEqualizerEnabled) { + mEqualizerEnabled = enable; + mEqualizer.setEnabled(enable); + } + } + + @Override + public void setEqualizerLevelsDecibels(float[] levels) { + if (mEqualizerEnabled) { + final short[] equalizerLevels = EqUtils.convertDecibelsToMillibelsInShorts(levels); + for (short i = 0; i < equalizerLevels.length; i++) { + mEqualizer.setBandLevel(i, equalizerLevels[i]); + } + } + } + + public short getNumEqualizerBands() { + if (mEqNumBands < 0) { + mEqNumBands = mEqualizer.getNumberOfBands(); + } + return mEqNumBands; + } + + @Override + public void setEqualizerBandLevel(short band, float level) { + if (mEqualizerEnabled) { + mEqualizer.setBandLevel(band, (short) level); + } + } + + public int getEqualizerBandLevel(short band) { + return mEqualizer.getBandLevel(band); + } + + public String getEqualizerPresetName(short preset) { + return mEqualizer.getPresetName(preset); + } + + public void useEqualizerPreset(short preset) { + mEqualizer.usePreset(preset); + } + + public short getNumEqualizerPresets() { + if (mEqNumPresets < 0) { + mEqNumPresets = mEqualizer.getNumberOfPresets(); + } + return mEqNumPresets; + } + public short[] getEqualizerBandLevelRange() { + return mEqualizer.getBandLevelRange(); + } + + public int getCenterFrequency(short band) { + return mEqualizer.getCenterFreq(band); + } + + @Override + public void release() { + mEqualizer.release(); + } +} diff --git a/src/com/cyngn/audiofx/backends/EffectsFactory.java b/src/com/cyngn/audiofx/backends/EffectsFactory.java index e0aeaaf..0775ec0 100644 --- a/src/com/cyngn/audiofx/backends/EffectsFactory.java +++ b/src/com/cyngn/audiofx/backends/EffectsFactory.java @@ -1,5 +1,10 @@ package com.cyngn.audiofx.backends; +import android.content.Context; +import com.cyngn.audiofx.Constants; + +import java.io.File; + /** * Creates an EffectSet appropriate for the current device * @@ -8,15 +13,19 @@ package com.cyngn.audiofx.backends; */ public class EffectsFactory { - public static final int ANDROID = 0; + private static Boolean sHasDts; + public static final int ANDROID = 0; public static final int MAXXAUDIO = 1; - public static final int DTS = 2; - public static EffectSet createEffectSet(int sessionId) { + public static EffectSet createEffectSet(Context context, int sessionId) { - // try MaxxAudio first, this will throw an exception if unavailable + if (hasDts()) { + return new DtsEffects(context, sessionId); + } + + // try MaxxAudio next, this will throw an exception if unavailable MaxxAudioEffects fx = null; try { fx = new MaxxAudioEffects(sessionId); @@ -31,4 +40,12 @@ public class EffectsFactory { return new AndroidEffects(sessionId); } + + public static boolean hasDts() { + if (sHasDts == null) { + sHasDts = new File("***REMOVED***").exists(); + } + return sHasDts; + } + } diff --git a/src/com/cyngn/audiofx/eq/EqSwipeController.java b/src/com/cyngn/audiofx/eq/EqSwipeController.java index 89d6a90..637be6e 100644 --- a/src/com/cyngn/audiofx/eq/EqSwipeController.java +++ b/src/com/cyngn/audiofx/eq/EqSwipeController.java @@ -4,6 +4,7 @@ import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.VelocityTracker; +import android.view.ViewConfiguration; import android.view.ViewGroup; import android.widget.LinearLayout; @@ -15,21 +16,9 @@ import com.cyngn.audiofx.preset.InfiniteViewPager; public class EqSwipeController extends LinearLayout { /* - * minimum amount of time we wait before allowing user to "attach" to a bar, to allow - * for swiping - */ - private static final int SWIPE_THRESH = 100; - - /* - * maximum amount of time in ms, from downtime, which will allow bars to be grabbed. - * basically, when the user goes > this threshold swiping, we ignore bar "attach" events - */ - private static final int BAR_MAX_THRESH = 1000; - - /* * x velocity max for deciding whether to try to grab a bar */ - private static final int X_VELOCITY_THRESH = 20; + private static int X_VELOCITY_THRESH = 20; EqContainerView mEq; InfiniteViewPager mPager; @@ -40,6 +29,8 @@ public class EqSwipeController extends LinearLayout { private ViewGroup mControls; private final EqualizerManager mEqManager; + private float mDownPositionX; + private float mDownPositionY; public EqSwipeController(Context context, AttributeSet attrs) { super(context, attrs); @@ -76,6 +67,8 @@ public class EqSwipeController extends LinearLayout { switch (action) { case MotionEvent.ACTION_DOWN: + mDownPositionX = event.getRawX(); + mDownPositionY = event.getRawY(); mDownTime = System.currentTimeMillis(); if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); @@ -91,14 +84,20 @@ public class EqSwipeController extends LinearLayout { float xVelocity = mVelocityTracker.getXVelocity(pointerId); float yVelocity = mVelocityTracker.getYVelocity(pointerId); - if (!mBarActive - && !mEqManager.isChangingPresets() - && System.currentTimeMillis() - mDownTime > SWIPE_THRESH - && System.currentTimeMillis() - mDownTime < BAR_MAX_THRESH - && Math.abs(xVelocity) < X_VELOCITY_THRESH - && !mEqManager.isEqualizerLocked()) { - mBarActive = true; - mBar = mEq.startTouchingBarUnder(event); + final float deltaX = mDownPositionX - event.getRawX(); + final float deltaY = mDownPositionY - event.getRawY(); + final float distanceSquared = deltaX * deltaX + deltaY * deltaY; + + final ViewConfiguration viewConfiguration = ViewConfiguration.get(getContext()); + final int touchSlop = viewConfiguration.getScaledTouchSlop(); + + if (!mBarActive && !mEqManager.isChangingPresets() + && !mEqManager.isEqualizerLocked() + && Math.abs(xVelocity) < X_VELOCITY_THRESH) { + if (distanceSquared < touchSlop * touchSlop) { + mBarActive = true; + mBar = mEq.startTouchingBarUnder(event); + } } } diff --git a/src/com/cyngn/audiofx/eq/EqUtils.java b/src/com/cyngn/audiofx/eq/EqUtils.java index 4659c3b..30d546c 100644 --- a/src/com/cyngn/audiofx/eq/EqUtils.java +++ b/src/com/cyngn/audiofx/eq/EqUtils.java @@ -14,29 +14,84 @@ public class EqUtils { private static final String TAG = EqUtils.class.getSimpleName(); private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + private static final String DEFAULT_DELIMITER = ";"; public static String getZeroedBandsString(int length) { - StringBuffer buff = new StringBuffer(); + return getZeroedBandsString(length, DEFAULT_DELIMITER); + } + + public static float[] stringBandsToFloats(String input) { + return stringBandsToFloats(input, DEFAULT_DELIMITER); + } + + public static String floatLevelsToString(float[] levels) { + return floatLevelsToString(levels, DEFAULT_DELIMITER); + } + + public static short[] stringBandsToShorts(String input) { + return stringBandsToShorts(input, DEFAULT_DELIMITER); + } + + public static String shortLevelsToString(short[] levels) { + return shortLevelsToString(levels, DEFAULT_DELIMITER); + } + + public static String getZeroedBandsString(int length, final String delimiter) { + StringBuilder buff = new StringBuilder(); for (int i = 0; i < length; i++) { - buff.append("0;"); + buff.append("0").append(delimiter); } buff.deleteCharAt(buff.length() - 1); return buff.toString(); } - public static String floatLevelsToString(float[] levels) { + public static String floatLevelsToString(float[] levels, final String delimiter) { // save StringBuilder builder = new StringBuilder(); for (int i = 0; i < levels.length; i++) { builder.append(levels[i]); - builder.append(";"); + builder.append(delimiter); } builder.deleteCharAt(builder.length() - 1); return builder.toString(); } - public static short[] stringBandsToShorts(String input) { - String[] levels = input.split(";"); + + public static String shortLevelsToString(short[] levels, final String delimiter) { + // save + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < levels.length; i++) { + builder.append(levels[i]); + builder.append(delimiter); + } + builder.deleteCharAt(builder.length() - 1); + return builder.toString(); + } + + public static String intLevelsToString(int[] levels, final String delimiter) { + // save + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < levels.length; i++) { + builder.append(levels[i]); + builder.append(delimiter); + } + builder.deleteCharAt(builder.length() - 1); + return builder.toString(); + } + + public static <T> String levelsToString(T[] levels, final String delimiter) { + // save + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < levels.length; i++) { + builder.append(levels[i]); + builder.append(delimiter); + } + builder.deleteCharAt(builder.length() - 1); + return builder.toString(); + } + + public static short[] stringBandsToShorts(String input, final String delimiter) { + String[] levels = input.split(delimiter); short[] equalizerLevels = new short[levels.length]; for (int i = 0; i < levels.length; i++) { @@ -45,8 +100,9 @@ public class EqUtils { return equalizerLevels; } - public static float[] stringBandsToFloats(String input) { - String[] levels = input.split(";"); + + public static float[] stringBandsToFloats(String input, final String delimiter) { + String[] levels = input.split(delimiter); float[] equalizerLevels = new float[levels.length]; for (int i = 0; i < levels.length; i++) { diff --git a/src/com/cyngn/audiofx/fragment/AudioFxFragment.java b/src/com/cyngn/audiofx/fragment/AudioFxFragment.java index ce97fa9..377570a 100644 --- a/src/com/cyngn/audiofx/fragment/AudioFxFragment.java +++ b/src/com/cyngn/audiofx/fragment/AudioFxFragment.java @@ -36,8 +36,7 @@ import com.cyngn.audiofx.widget.InterceptableLinearLayout; import java.util.List; import java.util.Map; -public class AudioFxFragment extends Fragment implements ActivityMusic.ActivityStateListener, - StateCallbacks.DeviceChangedCallback { +public class AudioFxFragment extends Fragment implements StateCallbacks.DeviceChangedCallback { private static final String TAG = AudioFxFragment.class.getSimpleName(); private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); @@ -67,8 +66,6 @@ public class AudioFxFragment extends Fragment implements ActivityMusic.ActivityS private MasterConfigControl mConfig; private EqualizerManager mEqManager; - private int mCurrentMode; - private AudioDeviceInfo mSystemDevice; private AudioDeviceInfo mUserSelection; @@ -92,9 +89,6 @@ public class AudioFxFragment extends Fragment implements ActivityMusic.ActivityS mDisabledColor = getResources().getColor(R.color.disabled_eq); setHasOptionsMenu(true); - ((ActivityMusic) getActivity()).addToggleListener(this); - - mCurrentMode = ((ActivityMusic) getActivity()).getCurrentMode(); } @Override @@ -107,13 +101,11 @@ public class AudioFxFragment extends Fragment implements ActivityMusic.ActivityS @Override public void onDestroy() { super.onDestroy(); - ((ActivityMusic) getActivity()).removeToggleListener(this); } @Override public void onAttach(Activity activity) { super.onAttach(activity); - mCurrentMode = ((ActivityMusic) getActivity()).getCurrentMode(); } private boolean showFragments() { @@ -426,9 +418,6 @@ public class AudioFxFragment extends Fragment implements ActivityMusic.ActivityS @Override public void onGlobalDeviceToggle(final boolean checked) { - if (mCurrentMode != ActivityMusic.CURRENT_MODE_AUDIOFX) { - return; - } final CompoundButton buttonView = getGlobalSwitch(); final Animator.AnimatorListener animatorListener = new Animator.AnimatorListener() { @Override @@ -466,11 +455,6 @@ public class AudioFxFragment extends Fragment implements ActivityMusic.ActivityS } }; - @Override - public void onModeChanged(int mode) { - mCurrentMode = mode; - } - public static class ColorUpdateListener implements ValueAnimator.AnimatorUpdateListener { final AudioFxBaseFragment mFrag; diff --git a/src/com/cyngn/audiofx/fragment/DTSFragment.java b/src/com/cyngn/audiofx/fragment/DTSFragment.java deleted file mode 100644 index 9343333..0000000 --- a/src/com/cyngn/audiofx/fragment/DTSFragment.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.cyngn.audiofx.fragment; - -import android.annotation.Nullable; -import android.app.Activity; -import android.app.Fragment; -import android.media.AudioDeviceInfo; -import android.os.Bundle; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CompoundButton; -import android.widget.ImageView; - -import com.cyngn.audiofx.R; -import com.cyngn.audiofx.activity.ActivityMusic; -import com.cyngn.audiofx.activity.MasterConfigControl; -import com.cyngn.audiofx.activity.StateCallbacks; -import com.cyngn.audiofx.service.AudioFxService; -import com.cyngn.audiofx.service.DtsControl; - -public class DTSFragment extends Fragment implements ActivityMusic.ActivityStateListener, StateCallbacks.DeviceChangedCallback { - - private static final String TAG = DTSFragment.class.getSimpleName(); - private static final boolean DEBUG = false; - - private ImageView mLogo; - private boolean mGlobalToggleEnabled; - private DtsControl mDts; - private MasterConfigControl mConfig; - private int mMode; - - @Override - public void onCreate(Bundle savedInstanceState) { - if (DEBUG) Log.i(TAG, "onCreate() called with " - + "savedInstanceState = [" + savedInstanceState + "]"); - super.onCreate(savedInstanceState); - mDts = new DtsControl(getActivity()); - ((ActivityMusic)getActivity()).addToggleListener(this); - MasterConfigControl.getInstance(getActivity()).getCallbacks().addDeviceChangedCallback(this); - - mMode = ((ActivityMusic) getActivity()).getCurrentMode(); - mConfig = MasterConfigControl.getInstance(getActivity()); - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - mMode = ((ActivityMusic) getActivity()).getCurrentMode(); - } - - @Override - public void onDestroy() { - super.onDestroy(); - MasterConfigControl.getInstance(getActivity()).getCallbacks().removeDeviceChangedCallback(this); - ((ActivityMusic)getActivity()).removeToggleListener(this); - } - - @Override - public void onResume() { - super.onResume(); - - mConfig.bindService(); - mConfig.setAutoBindToService(true); - - final boolean dtsEnabledByUser = mDts.isUserEnabled(); - ((ActivityMusic)getActivity()) - .setGlobalToggleChecked(mGlobalToggleEnabled = dtsEnabledByUser); - updateLogo(); - - final boolean dtsEnabled = mDts.isDtsEnabled(); - if (DEBUG) Log.i(TAG, "onResume() dtsEnabledByUser=" + dtsEnabledByUser - + ", dtsEnabled=" + dtsEnabled); - } - - @Override - public void onPause() { - if (DEBUG) Log.i(TAG, "onPause() called with " + ""); - super.onPause(); - - mConfig.setAutoBindToService(false); - mConfig.unbindService(); - } - - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, - Bundle savedInstanceState) { - View root = inflater.inflate(R.layout.fragment_dts, container, false); - - return root; - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - mLogo = (ImageView) view.findViewById(R.id.logo); - updateLogo(); - } - - private void updateLogo() { - if (mLogo != null) { - mLogo.setImageResource(mGlobalToggleEnabled - ? R.drawable.logo_dts_fc : R.drawable.logo_dts_1c); - mLogo.animate().cancel(); - mLogo.animate().alpha(mGlobalToggleEnabled ? 1 : .6f); - } - } - - @Override - public void onModeChanged(int mode) { - mMode = mode; - } - - @Override - public void onDeviceChanged(AudioDeviceInfo device, boolean userChange) { - - } - - @Override - public void onGlobalDeviceToggle(boolean checked) { - if (DEBUG) Log.i(TAG, "onGlobalToggleChanged() called with " - + "checked = [" + checked + "]"); - if (mMode != ActivityMusic.CURRENT_MODE_DTS) { - Log.w(TAG, "not visible, ignoring toggle change"); - // not interested in this update - return; - } - - mGlobalToggleEnabled = checked; - updateLogo(); - - mDts.setUserEnabled(checked); - mConfig.updateService(AudioFxService.ALL_CHANGED); - } -} diff --git a/src/com/cyngn/audiofx/knobs/KnobCommander.java b/src/com/cyngn/audiofx/knobs/KnobCommander.java index efce92d..657e78d 100644 --- a/src/com/cyngn/audiofx/knobs/KnobCommander.java +++ b/src/com/cyngn/audiofx/knobs/KnobCommander.java @@ -66,7 +66,7 @@ public class KnobCommander { } public boolean hasTreble() { - return mConfig.hasMaxxAudio(); + return mConfig.hasMaxxAudio() || mConfig.hasDts(); } public boolean hasVirtualizer() { diff --git a/src/com/cyngn/audiofx/knobs/KnobContainer.java b/src/com/cyngn/audiofx/knobs/KnobContainer.java index 0387508..3cf7d70 100644 --- a/src/com/cyngn/audiofx/knobs/KnobContainer.java +++ b/src/com/cyngn/audiofx/knobs/KnobContainer.java @@ -334,12 +334,17 @@ public class KnobContainer extends LinearLayout } final boolean speaker = device.getType() == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER; final boolean maxxAudio = MasterConfigControl.getInstance(mContext).hasMaxxAudio(); + final boolean dts = MasterConfigControl.getInstance(mContext).hasDts(); + final boolean effectsEnabled = (maxxAudio && !speaker) || dts; - mKnobCommander.updateTrebleKnob(mTrebleKnob, true); // maxx audio only knob for now - mKnobCommander.updateBassKnob(mBassKnob, maxxAudio || !speaker); - mKnobCommander.updateVirtualizerKnob(mVirtualizerKnob, maxxAudio || !speaker); + mKnobCommander.updateTrebleKnob(mTrebleKnob, effectsEnabled); + mKnobCommander.updateBassKnob(mBassKnob, effectsEnabled); + mKnobCommander.updateVirtualizerKnob(mVirtualizerKnob, effectsEnabled); if (maxxAudio) { - // speaker? disable virtual + // speaker? hide virtualizer + setKnobVisible(KnobCommander.KNOB_VIRTUALIZER, !speaker); + } else if (dts) { + // same for DTS setKnobVisible(KnobCommander.KNOB_VIRTUALIZER, !speaker); } else { setKnobVisible(KnobCommander.KNOB_VIRTUALIZER, true); diff --git a/src/com/cyngn/audiofx/service/AudioFxService.java b/src/com/cyngn/audiofx/service/AudioFxService.java index d36d3f9..88431b7 100644 --- a/src/com/cyngn/audiofx/service/AudioFxService.java +++ b/src/com/cyngn/audiofx/service/AudioFxService.java @@ -56,7 +56,6 @@ import android.os.IBinder; import android.os.Looper; import android.os.Message; import android.os.Process; -import android.os.UserHandle; import android.support.v4.content.LocalBroadcastManager; import android.util.ArrayMap; import android.util.Log; @@ -130,7 +129,6 @@ public class AudioFxService extends Service { Handler mBackgroundHandler; AudioOutputChangeListener mDeviceListener; private Locale mLastLocale; - DtsControl mDts; private AudioDeviceInfo mCurrentDevice; private AudioDeviceInfo mPreviousDevice; @@ -171,7 +169,7 @@ public class AudioFxService extends Service { } } - public void setOverrideLevels(short band, short level) { + public void setOverrideLevels(short band, float level) { if (checkService()) { mService.get().setOverrideLevels(band, level); } @@ -206,8 +204,8 @@ public class AudioFxService extends Service { } } - private void setOverrideLevels(short band, short level) { - mBackgroundHandler.obtainMessage(MSG_BG_UPDATE_EQ_OVERRIDE, band, level).sendToTarget(); + private void setOverrideLevels(short band, float level) { + mBackgroundHandler.obtainMessage(MSG_BG_UPDATE_EQ_OVERRIDE, band, 0, level).sendToTarget(); } private String getCurrentDeviceIdentifier() { @@ -222,7 +220,8 @@ public class AudioFxService extends Service { case MSG_ADD_SESSION: if (!mAudioSessions.containsKey(msg.arg1)) { if (DEBUG) Log.d(TAG, "added new EffectSet for sessionId=" + msg.arg1); - mAudioSessions.put(msg.arg1, EffectsFactory.createEffectSet(msg.arg1)); + mAudioSessions.put(msg.arg1, EffectsFactory.createEffectSet( + getApplicationContext(), msg.arg1)); } mMostRecentSessionId = msg.arg1; if (DEBUG) Log.d(TAG, "new most recent sesssionId=" + msg.arg1); @@ -253,19 +252,6 @@ public class AudioFxService extends Service { break; case MSG_UPDATE_DSP: - if (mDts.hasDts()) { - if (mDts.shouldUseDts()) { - if (DEBUG) Log.d(TAG, "forcing DTS effects"); - disableAllEffects(); - - mDts.setEnabled(mDts.isUserEnabled()); - break; - } else { - if (DEBUG) Log.d(TAG, "not using DTS"); - mDts.setEnabled(false); - } - } - final String mode = getCurrentDeviceIdentifier(); if (DEBUG) Log.i(TAG, "Updating to configuration: " + mode); // immediately update most recent session @@ -324,7 +310,7 @@ public class AudioFxService extends Service { switch (msg.what) { case MSG_BG_UPDATE_EQ_OVERRIDE: if (mMostRecentSessionId != -1) { - updateEqBand((short) msg.arg1, (short) msg.arg2, + updateEqBand((short) msg.arg1, (Float) msg.obj, mAudioSessions.get(mMostRecentSessionId)); } break; @@ -352,8 +338,6 @@ public class AudioFxService extends Service { mHandler = new Handler(audioLooper, new AudioServiceHandler()); mBackgroundHandler = new Handler(backgroundLooper, new AudioBackgroundHandler()); - mDts = new DtsControl(this); - mDeviceListener = new AudioOutputChangeListener(this, mHandler) { @Override public void onAudioOutputChanged(boolean firstChange, AudioDeviceInfo outputDevice) { @@ -497,7 +481,7 @@ public class AudioFxService extends Service { * Temporarily override a band level. {@link #updateDsp(SharedPreferences, EffectSet)} will take * care of overriding the preset value when a preset is selected */ - private synchronized void updateEqBand(short band, short level, EffectSet effectSet) { + private synchronized void updateEqBand(short band, float level, EffectSet effectSet) { if (effectSet != null) { effectSet.setEqualizerBandLevel(band, level); } @@ -527,6 +511,7 @@ public class AudioFxService extends Service { final boolean globalEnabled = prefs.getBoolean(DEVICE_AUDIOFX_GLOBAL_ENABLE, DEVICE_DEFAULT_GLOBAL_ENABLE); + session.setGlobalEnabled(globalEnabled); // bass try { @@ -559,12 +544,7 @@ public class AudioFxService extends Service { String savedPreset = prefs.getString(DEVICE_AUDIOFX_EQ_PRESET_LEVELS, null); if (savedPreset != null) { - short[] equalizerLevels = EqUtils.convertDecibelsToMillibelsInShorts( - EqUtils.stringBandsToFloats(savedPreset)); - - if (equalizerLevels != null && globalEnabled) { - session.setEqualizerLevels(equalizerLevels); - } + session.setEqualizerLevelsDecibels(EqUtils.stringBandsToFloats(savedPreset)); } } } catch (Exception e) { @@ -640,7 +620,7 @@ public class AudioFxService extends Service { if (prefs.getBoolean(SAVED_DEFAULTS, false) && !needsPrefsUpdate) { return; } - EffectSet temp = EffectsFactory.createEffectSet(0); + EffectSet temp = EffectsFactory.createEffectSet(getApplicationContext(), 0); final int numBands = temp.getNumEqualizerBands(); final int numPresets = temp.getNumEqualizerPresets(); @@ -683,13 +663,16 @@ public class AudioFxService extends Service { presetBands.deleteCharAt(presetBands.length() - 1); editor.putString(EQUALIZER_PRESET + i, presetBands.toString()); } - presetNames.deleteCharAt(presetNames.length() - 1); + if (presetNames.length() > 0) { + presetNames.deleteCharAt(presetNames.length() - 1); + } editor.putString(EQUALIZER_PRESET_NAMES, presetNames.toString()); editor.putBoolean(AUDIOFX_GLOBAL_HAS_VIRTUALIZER, temp.hasVirtualizer()); editor.putBoolean(AUDIOFX_GLOBAL_HAS_BASSBOOST, temp.hasBassBoost()); editor.putBoolean(AUDIOFX_GLOBAL_HAS_MAXXAUDIO, temp.getBrand() == EffectsFactory.MAXXAUDIO); + editor.putBoolean(AUDIOFX_GLOBAL_HAS_DTS, temp.getBrand() == EffectsFactory.DTS); temp.release(); editor.commit(); diff --git a/src/com/cyngn/audiofx/service/AudioOutputChangeListener.java b/src/com/cyngn/audiofx/service/AudioOutputChangeListener.java index e1811d3..a96b67a 100644 --- a/src/com/cyngn/audiofx/service/AudioOutputChangeListener.java +++ b/src/com/cyngn/audiofx/service/AudioOutputChangeListener.java @@ -13,7 +13,7 @@ import java.util.List; import static android.media.AudioDeviceInfo.*; -abstract class AudioOutputChangeListener extends AudioDeviceCallback { +public abstract class AudioOutputChangeListener extends AudioDeviceCallback { private static final String TAG = "AudioFx-" + AudioOutputChangeListener.class.getSimpleName(); |