aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/github/daneren2005/dsub/util/tags/BastpUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/github/daneren2005/dsub/util/tags/BastpUtil.java')
-rw-r--r--app/src/main/java/github/daneren2005/dsub/util/tags/BastpUtil.java126
1 files changed, 91 insertions, 35 deletions
diff --git a/app/src/main/java/github/daneren2005/dsub/util/tags/BastpUtil.java b/app/src/main/java/github/daneren2005/dsub/util/tags/BastpUtil.java
index 7ff517fd..802aa5ad 100644
--- a/app/src/main/java/github/daneren2005/dsub/util/tags/BastpUtil.java
+++ b/app/src/main/java/github/daneren2005/dsub/util/tags/BastpUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 Adrian Ulrich <adrian@blinkenlights.ch>
+ * Copyright (C) 2013-2019 Adrian Ulrich <adrian@blinkenlights.ch>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -14,59 +14,115 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-
+
package github.daneren2005.dsub.util.tags;
-import android.support.v4.util.LruCache;
+import android.util.LruCache;
+import java.util.ArrayList;
import java.util.HashMap;
-import java.util.Vector;
-public final class BastpUtil {
- private static final RGLruCache rgCache = new RGLruCache(16);
+public class BastpUtil {
+ /**
+ * Our global instance cache
+ */
+ private RGLruCache rgCache;
+ /**
+ * What we return & cache
+ */
+ public class GainValues {
+ public float album;
+ public float track;
+ public boolean found;
+ }
+ /**
+ * LRU cache for ReplayGain values
+ */
+ private class RGLruCache extends LruCache<String, GainValues> {
+ public RGLruCache(int size) {
+ super(size);
+ }
+ }
+
- /** Returns the ReplayGain values of 'path' as <track,album>
+ public BastpUtil() {
+ rgCache = new RGLruCache(64);
+ }
+
+ /**
+ * Returns a GainValues object for `path'
*/
- public static float[] getReplayGainValues(String path) {
- float[] cached = rgCache.get(path);
+ public GainValues getReplayGainValues(String path) {
+ if(path == null) {
+ // path must not be null
+ path = "//null\\";
+ }
+ GainValues cached = rgCache.get(path);
if(cached == null) {
cached = getReplayGainValuesFromFile(path);
rgCache.put(path, cached);
}
return cached;
}
-
-
-
- /** Parse given file and return track,album replay gain values
+
+ /**
+ * Parse given file and return track,album replay gain values
*/
- private static float[] getReplayGainValuesFromFile(String path) {
- String[] keys = { "REPLAYGAIN_TRACK_GAIN", "REPLAYGAIN_ALBUM_GAIN" };
- float[] adjust= { 0f , 0f };
+ private GainValues getReplayGainValuesFromFile(String path) {
HashMap tags = (new Bastp()).getTags(path);
-
- for (int i=0; i<keys.length; i++) {
- String curKey = keys[i];
- if(tags.containsKey(curKey)) {
- String rg_raw = (String)((Vector)tags.get(curKey)).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[i] = rg_float;
+ GainValues gv = new GainValues();
+
+ // normal replay gain
+ if(tags.containsKey("REPLAYGAIN_TRACK_GAIN")) {
+ gv.track = getFloatFromString((String)((ArrayList)tags.get("REPLAYGAIN_TRACK_GAIN")).get(0));
+ gv.found = true;
+ }
+ if(tags.containsKey("REPLAYGAIN_ALBUM_GAIN")) {
+ gv.album = getFloatFromString((String)((ArrayList)tags.get("REPLAYGAIN_ALBUM_GAIN")).get(0));
+ gv.found = true;
+ }
+
+ // R128 replay gain
+ boolean r128 = false;
+ if(tags.containsKey("R128_BASTP_BASE_GAIN")) {
+ // This is the gain found in the opus header which automatically gets applied by the media framework.
+ // We therefore do not need to include it in our calculation, but we set the 'found' bit and reset
+ // both album and track gain information as an opus file should only ever contain r128 gain infos.
+ float base = getFloatFromString((String)((ArrayList)tags.get("R128_BASTP_BASE_GAIN")).get(0)) / 256.0f;
+ if (base != 0.0f) {
+ gv.track = 0;
+ gv.album = 0;
+ gv.found = true;
}
}
- return adjust;
+ if(tags.containsKey("R128_TRACK_GAIN")) {
+ gv.track += getFloatFromString((String)((ArrayList)tags.get("R128_TRACK_GAIN")).get(0)) / 256.0f;
+ gv.found = true;
+ r128 = true;
+ }
+ if(tags.containsKey("R128_ALBUM_GAIN")) {
+ gv.album += getFloatFromString((String)((ArrayList)tags.get("R128_ALBUM_GAIN")).get(0)) / 256.0f;
+ gv.found = true;
+ r128 = true;
+ }
+
+ if (r128) {
+ gv.track += 5.0f;
+ gv.album += 5.0f;
+ }
+ return gv;
}
-
- /** LRU cache for ReplayGain values
+
+ /**
+ * Parses common replayGain string values
*/
- private static class RGLruCache extends LruCache<String, float[]> {
- public RGLruCache(int size) {
- super(size);
- }
+ private float getFloatFromString(String rg_raw) {
+ float rg_float = 0f;
+ try {
+ String nums = rg_raw.replaceAll("[^0-9.-]","");
+ rg_float = Float.parseFloat(nums);
+ } catch(Exception e) {}
+ return rg_float;
}
}