]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - mp3_afh.c
afh_common.c: Avoid ifdefs.
[paraslash.git] / mp3_afh.c
index d72d85e7fb3720d67feab92fc140d4f01acdde4e..2506b95e8799780c5c5b26adf723450f63d41c91 100644 (file)
--- a/mp3_afh.c
+++ b/mp3_afh.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2003-2011 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2003 Andre Noll <maan@tuebingen.mpg.de>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -72,11 +72,11 @@ static const char *mode_text[] = {"stereo", "joint stereo", "dual channel", "mon
 
 #include <id3tag.h>
 
-static char *get_latin1(id3_ucs4_t const *string)
+static char *get_utf8(id3_ucs4_t const *string)
 {
        if (!string)
                return NULL;
-       return (char *)id3_ucs4_latin1duplicate(string);
+       return (char *)id3_ucs4_utf8duplicate(string);
 }
 
 static char *get_stringlist(union id3_field *field)
@@ -85,7 +85,7 @@ static char *get_stringlist(union id3_field *field)
        char *result = NULL;
 
        for (k = 0; k < nstrings; k++) {
-               char *tmp = (char *)get_latin1(id3_field_getstrings(field, k));
+               char *tmp = (char *)get_utf8(id3_field_getstrings(field, k));
                if (result) {
                        char *tmp2 = result;
                        result = make_message("%s %s", tmp2, tmp);
@@ -101,7 +101,7 @@ static char *get_string(union id3_field *field)
 {
        id3_ucs4_t const *string = id3_field_getfullstring(field);
 
-       return get_latin1(string);
+       return get_utf8(string);
 }
 
 #define FOR_EACH_FIELD(f, j, fr) for (j = 0; j < (fr)->nfields && \
@@ -126,9 +126,19 @@ static char *get_strings(struct id3_frame *fr)
 static void mp3_get_id3(__a_unused unsigned char *map,
                __a_unused size_t numbytes, int fd, struct taginfo *tags)
 {
-       int i;
+       int i, new_fd;
        struct id3_tag *id3_t;
-       struct id3_file *id3_f = id3_file_fdopen(fd, ID3_FILE_MODE_READONLY);
+       struct id3_file *id3_f;
+
+       /*
+        * We are not supposed to close fd, but to avoid memory leaks we must
+        * call id3_file_close() on the id3_file after we are done. As
+        * id3_file_close() closes fd, we first create a copy for libid3tag.
+        */
+       new_fd = dup(fd);
+       if (new_fd < 0)
+               return;
+       id3_f = id3_file_fdopen(new_fd, ID3_FILE_MODE_READONLY);
 
        if (!id3_f)
                return;
@@ -139,27 +149,27 @@ static void mp3_get_id3(__a_unused unsigned char *map,
        }
        for (i = 0; i < id3_t->nframes; i++) {
                struct id3_frame *fr = id3_t->frames[i];
-               if (!strcmp(fr->id, "TIT2")) {
+               if (!strcmp(fr->id, ID3_FRAME_TITLE)) {
                        if (!tags->title)
                                tags->title = get_strings(fr);
                        continue;
                }
-               if (!strcmp(fr->id, "TPE1")) {
+               if (!strcmp(fr->id, ID3_FRAME_ARTIST)) {
                        if (!tags->artist)
                                tags->artist = get_strings(fr);
                        continue;
                }
-               if (!strcmp(fr->id, "TALB")) {
+               if (!strcmp(fr->id, ID3_FRAME_ALBUM)) {
                        if (!tags->album)
                                tags->album = get_strings(fr);
                        continue;
                }
-               if (!strcmp(fr->id, "TDRC")) {
+               if (!strcmp(fr->id, ID3_FRAME_YEAR)) {
                        if (!tags->year)
                                tags->year = get_strings(fr);
                        continue;
                }
-               if (!strcmp(fr->id, "COMM")) {
+               if (!strcmp(fr->id, ID3_FRAME_COMMENT)) {
                        if (!tags->comment)
                                tags->comment = get_strings(fr);
                        continue;