summaryrefslogtreecommitdiffstats
path: root/media/java
diff options
context:
space:
mode:
authorMarco Nelissen <marcone@google.com>2011-02-10 11:21:49 -0800
committerMarco Nelissen <marcone@google.com>2011-02-10 12:09:16 -0800
commitcb613a04c16915f6374c6436b5b37355bce3ed1c (patch)
tree3e17912b19b66d4cfce63a74a42f4374e313b43a /media/java
parentc77d7b42ab6ddbe2a358b81103c4856f76392354 (diff)
downloadframeworks_base-cb613a04c16915f6374c6436b5b37355bce3ed1c.zip
frameworks_base-cb613a04c16915f6374c6436b5b37355bce3ed1c.tar.gz
frameworks_base-cb613a04c16915f6374c6436b5b37355bce3ed1c.tar.bz2
Better genre support.
Expand the list of genres, and support genres that look like "(192)CustomGenre". b/3349415 Change-Id: I617ea7dfeace708bbd0d9c00ff04de72fa2d383e
Diffstat (limited to 'media/java')
-rw-r--r--media/java/android/media/MediaScanner.java87
1 files changed, 69 insertions, 18 deletions
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java
index 33c6385..b2dc1e3 100644
--- a/media/java/android/media/MediaScanner.java
+++ b/media/java/android/media/MediaScanner.java
@@ -276,7 +276,31 @@ public class MediaScanner
"Drum Solo",
"A capella",
"Euro-House",
- "Dance Hall"
+ "Dance Hall",
+ // The following ones seem to be fairly widely supported as well
+ "Goa",
+ "Drum & Bass",
+ "Club-House",
+ "Hardcore",
+ "Terror",
+ "Indie",
+ "Britpop",
+ "Negerpunk",
+ "Polsk Punk",
+ "Beat",
+ "Christian Gangsta",
+ "Heavy Metal",
+ "Black Metal",
+ "Crossover",
+ "Contemporary Christian",
+ "Christian Rock",
+ "Merengue",
+ "Salsa",
+ "Thrash Metal",
+ "Anime",
+ "JPop",
+ "Synthpop",
+ // 148 and up don't seem to have been defined yet.
};
private int mNativeContext;
@@ -588,23 +612,7 @@ public class MediaScanner
} else if (name.equalsIgnoreCase("composer") || name.startsWith("composer;")) {
mComposer = value.trim();
} else if (name.equalsIgnoreCase("genre") || name.startsWith("genre;")) {
- // handle numeric genres, which PV sometimes encodes like "(20)"
- if (value.length() > 0) {
- int genreCode = -1;
- char ch = value.charAt(0);
- if (ch == '(') {
- genreCode = parseSubstring(value, 1, -1);
- } else if (ch >= '0' && ch <= '9') {
- genreCode = parseSubstring(value, 0, -1);
- }
- if (genreCode >= 0 && genreCode < ID3_GENRES.length) {
- value = ID3_GENRES[genreCode];
- } else if (genreCode == 255) {
- // 255 is defined to be unknown
- value = null;
- }
- }
- mGenre = value;
+ mGenre = getGenreName(value);
} else if (name.equalsIgnoreCase("year") || name.startsWith("year;")) {
mYear = parseSubstring(value, 0, 0);
} else if (name.equalsIgnoreCase("tracknumber") || name.startsWith("tracknumber;")) {
@@ -627,6 +635,49 @@ public class MediaScanner
}
}
+ public String getGenreName(String genreTagValue) {
+
+ if (genreTagValue == null) {
+ return null;
+ }
+ final int length = genreTagValue.length();
+
+ if (length > 0 && genreTagValue.charAt(0) == '(') {
+ StringBuffer number = new StringBuffer();
+ int i = 1;
+ for (; i < length - 1; ++i) {
+ char c = genreTagValue.charAt(i);
+ if (Character.isDigit(c)) {
+ number.append(c);
+ } else {
+ break;
+ }
+ }
+ if (genreTagValue.charAt(i) == ')') {
+ try {
+ short genreIndex = Short.parseShort(number.toString());
+ if (genreIndex >= 0) {
+ if (genreIndex < ID3_GENRES.length) {
+ return ID3_GENRES[genreIndex];
+ } else if (genreIndex == 0xFF) {
+ return null;
+ } else if (genreIndex < 0xFF && (i + 1) < length) {
+ // genre is valid but unknown,
+ // if there is a string after the value we take it
+ return genreTagValue.substring(i + 1);
+ } else {
+ // else return the number, without parentheses
+ return number.toString();
+ }
+ }
+ } catch (NumberFormatException e) {
+ }
+ }
+ }
+
+ return genreTagValue;
+ }
+
public void setMimeType(String mimeType) {
if ("audio/mp4".equals(mMimeType) &&
mimeType.startsWith("video")) {