diff options
author | Marco Nelissen <marcone@google.com> | 2011-02-10 11:21:49 -0800 |
---|---|---|
committer | Marco Nelissen <marcone@google.com> | 2011-02-10 12:09:16 -0800 |
commit | cb613a04c16915f6374c6436b5b37355bce3ed1c (patch) | |
tree | 3e17912b19b66d4cfce63a74a42f4374e313b43a /media/java | |
parent | c77d7b42ab6ddbe2a358b81103c4856f76392354 (diff) | |
download | frameworks_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.java | 87 |
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")) { |