summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2002-06-04 22:05:00 +0000
committerDaniel Stenberg <daniel@haxx.se>2002-06-04 22:05:00 +0000
commitc9ea73e19df55473de9671d8fd3a4fbb7145e986 (patch)
tree83622eaf51f425a11177ff2914719ec434388055 /firmware
parentfb153c5570dfe197913239fce5677df7f45edeac (diff)
downloadrockbox-c9ea73e19df55473de9671d8fd3a4fbb7145e986.tar.gz
rockbox-c9ea73e19df55473de9671d8fd3a4fbb7145e986.zip
NOTE! the 'mp3entry' struct grew quite a bit now, as the previously static
buffers were moved into the struct instead and thus we enable the mp3info() function to be called in a re-entrant way. Just don't allocate that struct on the stack without careful consideration! git-svn-id: svn://svn.rockbox.org/rockbox/trunk@896 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/id3.c19
-rw-r--r--firmware/id3.h4
2 files changed, 13 insertions, 10 deletions
diff --git a/firmware/id3.c b/firmware/id3.c
index 8133f7c4f6..2c1f85e0ae 100644
--- a/firmware/id3.c
+++ b/firmware/id3.c
@@ -115,7 +115,6 @@ setid3v1title(int fd, mp3entry *entry)
115 char buffer[31]; 115 char buffer[31];
116 int offsets[3] = {-95,-65,-125}; 116 int offsets[3] = {-95,-65,-125};
117 int i; 117 int i;
118 static char keepit[3][32];
119 118
120 for(i=0;i<3;i++) { 119 for(i=0;i<3;i++) {
121 if(-1 == lseek(fd, offsets[i], SEEK_END)) 120 if(-1 == lseek(fd, offsets[i], SEEK_END))
@@ -128,16 +127,16 @@ setid3v1title(int fd, mp3entry *entry)
128 if(buffer[0]) { 127 if(buffer[0]) {
129 switch(i) { 128 switch(i) {
130 case 0: 129 case 0:
131 strcpy(keepit[0], buffer); 130 strcpy(entry->id3v1buf[0], buffer);
132 entry->artist = keepit[0]; 131 entry->artist = entry->id3v1buf[0];
133 break; 132 break;
134 case 1: 133 case 1:
135 strcpy(keepit[1], buffer); 134 strcpy(entry->id3v1buf[1], buffer);
136 entry->album = keepit[1]; 135 entry->album = entry->id3v1buf[1];
137 break; 136 break;
138 case 2: 137 case 2:
139 strcpy(keepit[2], buffer); 138 strcpy(entry->id3v1buf[2], buffer);
140 entry->title = keepit[2]; 139 entry->title = entry->id3v1buf[2];
141 break; 140 break;
142 } 141 }
143 } 142 }
@@ -166,8 +165,8 @@ setid3v2title(int fd, mp3entry *entry)
166 char *album = NULL; 165 char *album = NULL;
167 char header[10]; 166 char header[10];
168 unsigned short int version; 167 unsigned short int version;
169 static char buffer[512];
170 int titlen=0, artistn=0, albumn=0; 168 int titlen=0, artistn=0, albumn=0;
169 char *buffer = entry->id3v2buf;
171 170
172 /* 10 = headerlength */ 171 /* 10 = headerlength */
173 if(entry->id3v2len < 10) 172 if(entry->id3v2len < 10)
@@ -183,8 +182,8 @@ setid3v2title(int fd, mp3entry *entry)
183 /* Read all frames in the tag */ 182 /* Read all frames in the tag */
184 size = entry->id3v2len - 10; 183 size = entry->id3v2len - 10;
185 184
186 if(size >= (int)sizeof(buffer)) 185 if(size >= (int)sizeof(entry->id3v2buf))
187 size = sizeof(buffer)-1; 186 size = sizeof(entry->id3v2buf)-1;
188 187
189 if(size != read(fd, buffer, size)) { 188 if(size != read(fd, buffer, size)) {
190 free(buffer); 189 free(buffer);
diff --git a/firmware/id3.h b/firmware/id3.h
index 3f7be7bd3f..9c8d54aab8 100644
--- a/firmware/id3.h
+++ b/firmware/id3.h
@@ -29,6 +29,10 @@ struct mp3entry {
29 int id3v1len; 29 int id3v1len;
30 int filesize; /* in bytes */ 30 int filesize; /* in bytes */
31 int length; /* song length */ 31 int length; /* song length */
32
33 /* these following two fields are used for local buffering */
34 char id3v2buf[300];
35 char id3v1buf[3][32];
32}; 36};
33 37
34typedef struct mp3entry mp3entry; 38typedef struct mp3entry mp3entry;