From 79902cfcf1ca70c7ab19b4728959da6610590b15 Mon Sep 17 00:00:00 2001 From: Adrian Ulrich Date: Sun, 28 Apr 2013 20:53:17 +0200 Subject: [PATCH] yet another try on RG We are now using the equalizer feature of android which seems to be pretty buggy: Attaching to a single audio session does not work, so we are using the global '0' id even if it is deprecated --- res/values/translatable.xml | 2 - res/xml/preference_replaygain.xml | 5 -- .../android/vanilla/PlaybackService.java | 68 ++++++++++++------- .../android/vanilla/PrefKeys.java | 1 - 4 files changed, 44 insertions(+), 32 deletions(-) diff --git a/res/values/translatable.xml b/res/values/translatable.xml index e71eabdf..abce3e74 100644 --- a/res/values/translatable.xml +++ b/res/values/translatable.xml @@ -160,8 +160,6 @@ THE SOFTWARE. Play all tracks at equal loudness Enable album Replay Gain Preserve album dynamics - Keep volume down - Automatically reduce the volume by 30% for tracks without any Replay Gain information Notifications Notification Mode diff --git a/res/xml/preference_replaygain.xml b/res/xml/preference_replaygain.xml index d0a55e8b..60ace3c1 100644 --- a/res/xml/preference_replaygain.xml +++ b/res/xml/preference_replaygain.xml @@ -33,9 +33,4 @@ THE SOFTWARE. android:title="@string/replaygain_album_title" android:summary="@string/replaygain_album_summary" android:defaultValue="false" /> - diff --git a/src/ch/blinkenlights/android/vanilla/PlaybackService.java b/src/ch/blinkenlights/android/vanilla/PlaybackService.java index 354be416..9381e132 100644 --- a/src/ch/blinkenlights/android/vanilla/PlaybackService.java +++ b/src/ch/blinkenlights/android/vanilla/PlaybackService.java @@ -44,6 +44,7 @@ import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.media.AudioManager; import android.media.MediaPlayer; +import android.media.audiofx.Equalizer; import android.os.Build; import android.os.Handler; import android.os.HandlerThread; @@ -301,6 +302,7 @@ public final class PlaybackService extends Service private Handler mHandler; MediaPlayer mMediaPlayer; MediaPlayer mPreparedMediaPlayer; + Equalizer mEqualizer; private boolean mMediaPlayerInitialized; private PowerManager.WakeLock mWakeLock; private NotificationManager mNotificationManager; @@ -372,7 +374,6 @@ public final class PlaybackService extends Service */ private boolean mReplayGainTrackEnabled; private boolean mReplayGainAlbumEnabled; - private boolean mReplayGainSilenceEnabled; @Override public void onCreate() @@ -385,6 +386,7 @@ public final class PlaybackService extends Service int state = loadState(); mMediaPlayer = getNewMediaPlayer(); + mEqualizer = getNewEqualizer(); mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE); @@ -408,7 +410,6 @@ public final class PlaybackService extends Service mReplayGainTrackEnabled = settings.getBoolean(PrefKeys.ENABLE_TRACK_REPLAYGAIN, false); mReplayGainAlbumEnabled = settings.getBoolean(PrefKeys.ENABLE_ALBUM_REPLAYGAIN, false); - mReplayGainSilenceEnabled = settings.getBoolean(PrefKeys.SILENCE_NONRG_TRACKS, false); PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE); mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "VanillaMusicLock"); @@ -535,6 +536,10 @@ public final class PlaybackService extends Service // clear the notification stopForeground(true); + if (mEqualizer != null) { + mEqualizer.release(); + mEqualizer = null; + } if (mMediaPlayer != null) { saveState(mMediaPlayer.getCurrentPosition()); mMediaPlayer.release(); @@ -569,36 +574,53 @@ public final class PlaybackService extends Service return mp; } + private Equalizer getNewEqualizer() { + Equalizer eq = null; + try { + eq = new Equalizer(0, 0); + eq.setEnabled(true); + } catch (IllegalArgumentException e) { + /* eq not supported by this build */ + Log.d("VanillaMusic", "Device does not support EQs: "+e); + } + return eq; + } + public void prepareMediaPlayer(MediaPlayer mp, String path) throws IOException{ - float adjust = 0f; - mp.setDataSource(path); + mp.prepare(); + } + + private void applyReplayGain(MediaPlayer mp, String path) { + + if(mEqualizer == null) + return; /* device does not support EQs */ + if(mReplayGainAlbumEnabled == false && mReplayGainTrackEnabled == false) + return; /* no need to parse tags: RG is disabled */ float[] rg = calculateReplayGainAdjustment(path); /* track, album */ + short[] eqRange = mEqualizer.getBandLevelRange(); + float adjust = 0f; if(mReplayGainAlbumEnabled) { - adjust = (rg[0] > 0 ? rg[0] : adjust); /* do we have track adjustment ? */ - adjust = (rg[1] > 0 ? rg[1] : adjust); /* ..or, even better, album adj? */ + adjust = (rg[0] != 0 ? rg[0] : adjust); /* do we have track adjustment ? */ + adjust = (rg[1] != 0 ? rg[1] : adjust); /* ..or, even better, album adj? */ } if(mReplayGainTrackEnabled || (mReplayGainAlbumEnabled && adjust == 0)) { - adjust = (rg[1] > 0 ? rg[1] : adjust); /* do we have album adjustment ? */ - adjust = (rg[0] > 0 ? rg[0] : adjust); /* ..or, even better, track adj? */ + adjust = (rg[1] != 0 ? rg[1] : adjust); /* do we have album adjustment ? */ + adjust = (rg[0] != 0 ? rg[0] : adjust); /* ..or, even better, track adj? */ } - if(adjust == 0 && mReplayGainSilenceEnabled) { - adjust = 0.25f; + short gain = (short)((adjust * 100)); + if(gain != 0) { gain += 900; } /* 900 because a 'modern' track has a rg-value of about -9dB */ + if(gain < eqRange[0]) { gain = eqRange[0]; } + if(gain > eqRange[1]) { gain = eqRange[1]; } + Log.d("VanillaMusic", "setBandLevel gain = "+gain); + for (short i = mEqualizer.getNumberOfBands(); --i != -1; ) { + mEqualizer.setBandLevel(i, gain); } - if(adjust > 0) { - adjust = adjust * 1.5f; /* add some slack */ - Log.d("VanillaMusic", "adjusting replaygain of "+path+" to "+adjust); - } else { - adjust = 1.0f; /* no RG found -> (re-)set mediaplayer to default volume */ - } - - mp.setVolume(adjust, adjust); - mp.prepare(); } /** @@ -620,9 +642,7 @@ public final class PlaybackService extends Service String nums = rg_raw.replaceAll("[^0-9.-]",""); rg_float = Float.parseFloat(nums); } catch(Exception e) {} - - float rg_result = (float)Math.pow(10, (rg_float/20) ); - adjust[i] = rg_result; + adjust[i] = rg_float; } } return adjust; @@ -745,8 +765,6 @@ public final class PlaybackService extends Service mReplayGainTrackEnabled = settings.getBoolean(PrefKeys.ENABLE_TRACK_REPLAYGAIN, false); } else if (PrefKeys.ENABLE_ALBUM_REPLAYGAIN.equals(key)) { mReplayGainAlbumEnabled = settings.getBoolean(PrefKeys.ENABLE_ALBUM_REPLAYGAIN, false); - } else if (PrefKeys.SILENCE_NONRG_TRACKS.equals(key)) { - mReplayGainSilenceEnabled = settings.getBoolean(PrefKeys.SILENCE_NONRG_TRACKS, false); } CompatFroyo.dataChanged(this); @@ -1129,6 +1147,7 @@ public final class PlaybackService extends Service if(mPreparedMediaPlayer != null && mPreparedMediaPlayer.isPlaying()) { + mMediaPlayer.release(); mMediaPlayer = mPreparedMediaPlayer; mPreparedMediaPlayer = null; @@ -1138,6 +1157,7 @@ public final class PlaybackService extends Service } mMediaPlayerInitialized = true; + applyReplayGain(mMediaPlayer, song.path); triggerGaplessUpdate(); if (mPendingSeek != 0 && mPendingSeekSong == song.id) { diff --git a/src/ch/blinkenlights/android/vanilla/PrefKeys.java b/src/ch/blinkenlights/android/vanilla/PrefKeys.java index 7daddf0a..24230a67 100644 --- a/src/ch/blinkenlights/android/vanilla/PrefKeys.java +++ b/src/ch/blinkenlights/android/vanilla/PrefKeys.java @@ -59,5 +59,4 @@ public class PrefKeys { public static final String VISIBLE_EXTRA_INFO = "visible_extra_info"; public static final String ENABLE_TRACK_REPLAYGAIN = "enable_track_replaygain"; public static final String ENABLE_ALBUM_REPLAYGAIN = "enable_album_replaygain"; - public static final String SILENCE_NONRG_TRACKS = "silence_nonreplaygain_tracks"; }