aboutsummaryrefslogtreecommitdiff
path: root/subsonic-android/src/github/daneren2005/subdroid/audiofx/EqualizerController.java
diff options
context:
space:
mode:
Diffstat (limited to 'subsonic-android/src/github/daneren2005/subdroid/audiofx/EqualizerController.java')
-rw-r--r--subsonic-android/src/github/daneren2005/subdroid/audiofx/EqualizerController.java138
1 files changed, 138 insertions, 0 deletions
diff --git a/subsonic-android/src/github/daneren2005/subdroid/audiofx/EqualizerController.java b/subsonic-android/src/github/daneren2005/subdroid/audiofx/EqualizerController.java
new file mode 100644
index 00000000..f51a3c99
--- /dev/null
+++ b/subsonic-android/src/github/daneren2005/subdroid/audiofx/EqualizerController.java
@@ -0,0 +1,138 @@
+/*
+ This file is part of Subsonic.
+
+ Subsonic is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Subsonic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
+
+ Copyright 2011 (C) Sindre Mehus
+ */
+package github.daneren2005.subdroid.audiofx;
+
+import java.io.Serializable;
+
+import android.content.Context;
+import android.media.MediaPlayer;
+import android.media.audiofx.Equalizer;
+import android.util.Log;
+import github.daneren2005.subdroid.util.FileUtil;
+
+/**
+ * Backward-compatible wrapper for {@link Equalizer}, which is API Level 9.
+ *
+ * @author Sindre Mehus
+ * @version $Id$
+ */
+public class EqualizerController {
+
+ private static final String TAG = EqualizerController.class.getSimpleName();
+
+ private final Context context;
+ private Equalizer equalizer;
+
+ // Class initialization fails when this throws an exception.
+ static {
+ try {
+ Class.forName("android.media.audiofx.Equalizer");
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ /**
+ * Throws an exception if the {@link Equalizer} class is not available.
+ */
+ public static void checkAvailable() throws Throwable {
+ // Calling here forces class initialization.
+ }
+
+ public EqualizerController(Context context, MediaPlayer mediaPlayer) {
+ this.context = context;
+ try {
+ equalizer = new Equalizer(0, mediaPlayer.getAudioSessionId());
+ } catch (Throwable x) {
+ Log.w(TAG, "Failed to create equalizer.", x);
+ }
+ }
+
+ public void saveSettings() {
+ try {
+ if (isAvailable()) {
+ FileUtil.serialize(context, new EqualizerSettings(equalizer), "equalizer.dat");
+ }
+ } catch (Throwable x) {
+ Log.w(TAG, "Failed to save equalizer settings.", x);
+ }
+ }
+
+ public void loadSettings() {
+ try {
+ if (isAvailable()) {
+ EqualizerSettings settings = FileUtil.deserialize(context, "equalizer.dat");
+ if (settings != null) {
+ settings.apply(equalizer);
+ }
+ }
+ } catch (Throwable x) {
+ Log.w(TAG, "Failed to load equalizer settings.", x);
+ }
+ }
+
+ public boolean isAvailable() {
+ return equalizer != null;
+ }
+
+ public boolean isEnabled() {
+ return isAvailable() && equalizer.getEnabled();
+ }
+
+ public void release() {
+ if (isAvailable()) {
+ equalizer.release();
+ }
+ }
+
+ public Equalizer getEqualizer() {
+ return equalizer;
+ }
+
+ private static class EqualizerSettings implements Serializable {
+
+ private final short[] bandLevels;
+ private short preset;
+ private final boolean enabled;
+
+ public EqualizerSettings(Equalizer equalizer) {
+ enabled = equalizer.getEnabled();
+ bandLevels = new short[equalizer.getNumberOfBands()];
+ for (short i = 0; i < equalizer.getNumberOfBands(); i++) {
+ bandLevels[i] = equalizer.getBandLevel(i);
+ }
+ try {
+ preset = equalizer.getCurrentPreset();
+ } catch (Exception x) {
+ preset = -1;
+ }
+ }
+
+ public void apply(Equalizer equalizer) {
+ for (short i = 0; i < bandLevels.length; i++) {
+ equalizer.setBandLevel(i, bandLevels[i]);
+ }
+ if (preset >= 0 && preset < equalizer.getNumberOfPresets()) {
+ equalizer.usePreset(preset);
+ }
+ equalizer.setEnabled(enabled);
+ }
+ }
+}
+