aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_mp3/apev2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Input/in_mp3/apev2.cpp')
-rw-r--r--Src/Plugins/Input/in_mp3/apev2.cpp169
1 files changed, 169 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_mp3/apev2.cpp b/Src/Plugins/Input/in_mp3/apev2.cpp
new file mode 100644
index 00000000..a4ae0d95
--- /dev/null
+++ b/Src/Plugins/Input/in_mp3/apev2.cpp
@@ -0,0 +1,169 @@
+#include "apev2.h"
+
+APE::APE()
+{
+ hasData=false;
+ dirty=false;
+}
+
+int APE::Decode(const void *data, size_t len)
+{
+ if (APEv2::Tag::Parse(data, len) == APEv2::APEV2_SUCCESS)
+ {
+ hasData=true;
+ return 1;
+ }
+
+ return 0;
+}
+
+// return -1 for empty, 1 for OK, 0 for "don't understand metadata name"
+int APE::GetString(const char *metadata, wchar_t *data, int dataLen)
+{
+ if (!hasData)
+ return 0;
+
+ if (!_stricmp(metadata, "replaygain_track_gain")
+ || !_stricmp(metadata, "replaygain_track_peak")
+ || !_stricmp(metadata, "replaygain_album_gain")
+ || !_stricmp(metadata, "replaygain_album_peak"))
+ {
+ if (APEv2::Tag::GetString(metadata, data, dataLen) == APEv2::APEV2_SUCCESS)
+ return 1;
+ return -1;
+ }
+ else
+ {
+ const char *ape_key = MapWinampKeyToApeKey(metadata);
+ if (ape_key)
+ {
+ if (APEv2::Tag::GetString(ape_key, data, dataLen) == APEv2::APEV2_SUCCESS)
+ return 1;
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+int APE::SetString(const char *metadata, const wchar_t *data)
+{
+ if (!_stricmp(metadata, "replaygain_track_gain")
+ || !_stricmp(metadata, "replaygain_track_peak")
+ || !_stricmp(metadata, "replaygain_album_gain")
+ || !_stricmp(metadata, "replaygain_album_peak"))
+ {
+ APEv2::Tag::SetString(metadata, data);
+ dirty=true;
+ hasData=true;
+ return 1;
+ }
+ else
+ {
+ const char *ape_key = MapWinampKeyToApeKey(metadata);
+ if (ape_key)
+ {
+ APEv2::Tag::SetString(ape_key, data);
+ dirty=true;
+ hasData=true;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void APE::Clear()
+{
+ APEv2::Tag::Clear();
+ dirty=true;
+ hasData=false;
+}
+
+void APE::MarkClear()
+{
+ dirty=true;
+ hasData=false;
+}
+
+int APE::SetKeyValueByIndex(size_t index, const char *key, const wchar_t *data)
+{
+ dirty=true;
+ return APEv2::Tag::SetKeyValueByIndex(index, key, data);
+}
+
+int APE::RemoveItem(size_t index)
+{
+ dirty=true;
+ return APEv2::Tag::RemoveItem(index);
+}
+
+int APE::AddItem()
+{
+ dirty=true;
+ hasData=true;
+ APEv2::Tag::AddItem();
+ return APEv2::APEV2_SUCCESS;
+}
+
+struct ApeKeyMapping
+{
+ const char *ape_key;
+ const char *winamp_key;
+ const wchar_t *winamp_keyW;
+};
+
+static ApeKeyMapping apeKeyMapping[] =
+{
+ { "Track", "track", L"track" },
+ {"Album", "album", L"album" },
+ {"Artist", "artist", L"artist" },
+ {"Comment", "comment", L"comment" },
+ {"Year", "year", L"year" },
+ {"Genre", "genre", L"genre" },
+ {"Title", "title", L"title"},
+ {"Composer", "composer", L"composer"},
+ {"Performer", "performer", L"performer"},
+ {"Album artist", "albumartist", L"albumartist"},
+};
+
+const wchar_t *APE::MapApeKeyToWinampKeyW(const char *ape_key)
+{
+ size_t num_mappings = sizeof(apeKeyMapping)/sizeof(apeKeyMapping[0]);
+ for (size_t i=0;i!=num_mappings;i++)
+ {
+ if (!_stricmp(ape_key, apeKeyMapping[i].ape_key))
+ return apeKeyMapping[i].winamp_keyW;
+ }
+ return NULL;
+}
+
+const char *APE::MapApeKeyToWinampKey(const char *ape_key)
+{
+ size_t num_mappings = sizeof(apeKeyMapping)/sizeof(apeKeyMapping[0]);
+ for (size_t i=0;i!=num_mappings;i++)
+ {
+ if (!_stricmp(ape_key, apeKeyMapping[i].ape_key))
+ return apeKeyMapping[i].winamp_key;
+ }
+ return NULL;
+}
+
+const char *APE::MapWinampKeyToApeKey(const char *winamp_key)
+{
+ size_t num_mappings = sizeof(apeKeyMapping)/sizeof(apeKeyMapping[0]);
+ for (size_t i=0;i!=num_mappings;i++)
+ {
+ if (!_stricmp(winamp_key, apeKeyMapping[i].winamp_key))
+ return apeKeyMapping[i].ape_key;
+ }
+ return NULL;
+}
+
+int APE::AddKeyValue(const char *key, const wchar_t *data)
+{
+ dirty=true;
+ hasData=true;
+ APEv2::Item *newItem = APEv2::Tag::AddItem();
+ newItem->SetKey(key);
+ return APEv2::Tag::SetItemData(newItem, data);
+} \ No newline at end of file