From ac28a36d5af49d6df8b34e129289cf91cbb241df Mon Sep 17 00:00:00 2001 From: Adrian Ulrich Date: Mon, 1 Apr 2013 21:20:13 +0200 Subject: [PATCH] improve replay gain support --- res/values/translatable.xml | 9 ++- res/xml/preference_replaygain.xml | 16 +++- .../android/vanilla/PlaybackService.java | 79 +++++++++++++------ .../android/vanilla/PrefKeys.java | 4 +- 4 files changed, 81 insertions(+), 27 deletions(-) diff --git a/res/values/translatable.xml b/res/values/translatable.xml index fe41cd20..e71eabdf 100644 --- a/res/values/translatable.xml +++ b/res/values/translatable.xml @@ -152,10 +152,17 @@ THE SOFTWARE. Pause when the headphones are unplugged. Play When Plugged Play when the headphones are plugged in. (Only works when the service is running.) + Replay Gain Enable Replay Gain Configure handling of Replay Gain information - + Enable per-track Replay Gain + 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 Notification Action diff --git a/res/xml/preference_replaygain.xml b/res/xml/preference_replaygain.xml index c4734ac8..d0a55e8b 100644 --- a/res/xml/preference_replaygain.xml +++ b/res/xml/preference_replaygain.xml @@ -24,8 +24,18 @@ THE SOFTWARE. xmlns:android="http://schemas.android.com/apk/res/android" android:persistent="true"> + + diff --git a/src/ch/blinkenlights/android/vanilla/PlaybackService.java b/src/ch/blinkenlights/android/vanilla/PlaybackService.java index 73b00621..e0e4f2c5 100644 --- a/src/ch/blinkenlights/android/vanilla/PlaybackService.java +++ b/src/ch/blinkenlights/android/vanilla/PlaybackService.java @@ -370,7 +370,9 @@ public final class PlaybackService extends Service /** * Enables or disables Replay Gain */ - private boolean mReplayGainEnabled; + private boolean mReplayGainTrackEnabled; + private boolean mReplayGainAlbumEnabled; + private boolean mReplayGainSilenceEnabled; @Override public void onCreate() @@ -403,7 +405,10 @@ public final class PlaybackService extends Service mHeadsetPause = getSettings(this).getBoolean(PrefKeys.HEADSET_PAUSE, true); mShakeAction = settings.getBoolean(PrefKeys.ENABLE_SHAKE, false) ? Action.getAction(settings, PrefKeys.SHAKE_ACTION, Action.NextSong) : Action.Nothing; mShakeThreshold = settings.getInt(PrefKeys.SHAKE_THRESHOLD, 80) / 10.0f; - mReplayGainEnabled = settings.getBoolean(PrefKeys.ENABLE_REPLAYGAIN, false); + + 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"); @@ -565,34 +570,60 @@ public final class PlaybackService extends Service } public void prepareMediaPlayer(MediaPlayer mp, String path) throws IOException{ + float adjust = 0f; mp.setDataSource(path); - if(mReplayGainEnabled == true) { - applyReplayGain(mp, path); + float[] rg = calculateReplayGainAdjustment(path); /* track, album */ + + 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? */ + } + + 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? */ + } + + if(adjust == 0 && mReplayGainSilenceEnabled) { + adjust = 0.7f; + } + + if(adjust > 0) { + Toast.makeText(this, path+"\n"+" PX "+adjust, Toast.LENGTH_SHORT).show(); + mp.setVolume(adjust, adjust); + Log.d("VanillaMusic", "adjusting replaygain of "+path+" to "+adjust); } mp.prepare(); } - private void applyReplayGain(MediaPlayer mp, String path) { - HashMap tags = (new Bastp()).getTags(path); - float adjust = 1.0f; + /** + * Returns TRACK, ALBUM gain values for given path + * A value of 0 means that the tag was not found in given file + */ + private float[] calculateReplayGainAdjustment(String path) { + String[] keys = { "REPLAYGAIN_TRACK_GAIN", "REPLAYGAIN_ALBUM_GAIN" }; + float[] adjust= { 0f , 0f }; + HashMap tags = (new Bastp()).getTags(path); - if(tags.containsKey("REPLAYGAIN_TRACK_GAIN")) { - String rg_raw = (String)((Vector)tags.get("REPLAYGAIN_TRACK_GAIN")).get(0); - String rg_numonly = ""; - float rg_float = 0f; - try { - String nums = rg_raw.replaceAll("[^0-9.-]",""); - rg_float = Float.parseFloat(nums); - } catch(Exception e) {} - - adjust = (float)Math.pow(10, (rg_float/20) ); - Toast.makeText(this, path+"\n"+" PX "+rg_raw+" adj = "+adjust, Toast.LENGTH_SHORT).show(); + for (int i=0; i