summaryrefslogtreecommitdiff
path: root/apps/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins')
-rw-r--r--apps/plugins/vbrfix.c46
1 files changed, 26 insertions, 20 deletions
diff --git a/apps/plugins/vbrfix.c b/apps/plugins/vbrfix.c
index 79fa134499..5aaf2ffada 100644
--- a/apps/plugins/vbrfix.c
+++ b/apps/plugins/vbrfix.c
@@ -48,7 +48,7 @@ static int insert_data_in_file(const char *fname, int fpos, char *buf, int num_b
48 int readlen; 48 int readlen;
49 int rc; 49 int rc;
50 int orig_fd, fd; 50 int orig_fd, fd;
51 51
52 rb->snprintf(tmpname, MAX_PATH, "%s.tmp", fname); 52 rb->snprintf(tmpname, MAX_PATH, "%s.tmp", fname);
53 53
54 orig_fd = rb->open(fname, O_RDONLY); 54 orig_fd = rb->open(fname, O_RDONLY);
@@ -70,7 +70,7 @@ static int insert_data_in_file(const char *fname, int fpos, char *buf, int num_b
70 rb->close(orig_fd); 70 rb->close(orig_fd);
71 return 10*readlen - 3; 71 return 10*readlen - 3;
72 } 72 }
73 73
74 rc = rb->write(fd, audiobuf, readlen); 74 rc = rb->write(fd, audiobuf, readlen);
75 if(rc < 0) { 75 if(rc < 0) {
76 rb->close(fd); 76 rb->close(fd);
@@ -78,7 +78,7 @@ static int insert_data_in_file(const char *fname, int fpos, char *buf, int num_b
78 return 10*rc - 4; 78 return 10*rc - 4;
79 } 79 }
80 } 80 }
81 81
82 /* Now insert the data into the file */ 82 /* Now insert the data into the file */
83 rc = rb->write(fd, buf, num_bytes); 83 rc = rb->write(fd, buf, num_bytes);
84 if(rc < 0) { 84 if(rc < 0) {
@@ -103,7 +103,7 @@ static int insert_data_in_file(const char *fname, int fpos, char *buf, int num_b
103 return 10*rc - 8; 103 return 10*rc - 8;
104 } 104 }
105 } while(readlen > 0); 105 } while(readlen > 0);
106 106
107 rb->close(fd); 107 rb->close(fd);
108 rb->close(orig_fd); 108 rb->close(orig_fd);
109 109
@@ -118,13 +118,19 @@ static int insert_data_in_file(const char *fname, int fpos, char *buf, int num_b
118 if(rc < 0) { 118 if(rc < 0) {
119 return 10*rc - 9; 119 return 10*rc - 9;
120 } 120 }
121 121
122 return 0; 122 return 0;
123} 123}
124 124
125static void fileerror(int rc) 125static void fileerror(int rc)
126{ 126{
127 rb->splashf(HZ*2, ID2P(LANG_FILE_ERROR), rc); 127 if (rb->global_settings->talk_menu) {
128 rb->talk_id(LANG_FILE_ERROR, true);
129 rb->talk_value_decimal(rc, UNIT_INT, 0, true);
130 rb->talk_force_enqueue_next();
131 }
132
133 rb->splashf(HZ*2, rb->str(LANG_FILE_ERROR), rc);
128} 134}
129 135
130static const unsigned char empty_id3_header[] = 136static const unsigned char empty_id3_header[] =
@@ -154,7 +160,7 @@ static bool vbr_fix(const char *selected_file)
154 fileerror(rc); 160 fileerror(rc);
155 return true; 161 return true;
156 } 162 }
157 163
158 fd = rb->open(selected_file, O_RDWR); 164 fd = rb->open(selected_file, O_RDWR);
159 if(fd < 0) { 165 if(fd < 0) {
160 fileerror(fd); 166 fileerror(fd);
@@ -173,7 +179,7 @@ static bool vbr_fix(const char *selected_file)
173 entry.filesize, xingbuf, num_frames, 0, 179 entry.filesize, xingbuf, num_frames, 0,
174 0, xingupdate, true, 180 0, xingupdate, true,
175 audiobuf, audiobuflen); 181 audiobuf, audiobuflen);
176 182
177 /* Try to fit the Xing header first in the stream. Replace the existing 183 /* Try to fit the Xing header first in the stream. Replace the existing
178 VBR header if there is one, else see if there is room between the 184 VBR header if there is one, else see if there is room between the
179 ID3 tag and the first MP3 frame. */ 185 ID3 tag and the first MP3 frame. */
@@ -191,7 +197,7 @@ static bool vbr_fix(const char *selected_file)
191 197
192 unused_space = 198 unused_space =
193 entry.first_frame_offset - entry.id3v2len - framelen; 199 entry.first_frame_offset - entry.id3v2len - framelen;
194 200
195 /* Fill the unused space with 0's (using the MP3 buffer) 201 /* Fill the unused space with 0's (using the MP3 buffer)
196 and write it to the file */ 202 and write it to the file */
197 if(unused_space) 203 if(unused_space)
@@ -212,48 +218,48 @@ static bool vbr_fix(const char *selected_file)
212 fileerror(rc); 218 fileerror(rc);
213 return true; 219 return true;
214 } 220 }
215 221
216 rb->close(fd); 222 rb->close(fd);
217 } else { 223 } else {
218 /* If not, insert some space. If there is an ID3 tag in the 224 /* If not, insert some space. If there is an ID3 tag in the
219 file we only insert just enough to squeeze the Xing header 225 file we only insert just enough to squeeze the Xing header
220 in. If not, we insert an additional empty ID3 tag of 4K. */ 226 in. If not, we insert an additional empty ID3 tag of 4K. */
221 227
222 rb->close(fd); 228 rb->close(fd);
223 229
224 /* Nasty trick alert! The insert_data_in_file() function 230 /* Nasty trick alert! The insert_data_in_file() function
225 uses the MP3 buffer when copying the data. We assume 231 uses the MP3 buffer when copying the data. We assume
226 that the ID3 tag isn't longer than 1MB so the xing 232 that the ID3 tag isn't longer than 1MB so the xing
227 buffer won't be overwritten. */ 233 buffer won't be overwritten. */
228 234
229 if(entry.first_frame_offset) { 235 if(entry.first_frame_offset) {
230 DEBUGF("Inserting %d bytes\n", framelen); 236 DEBUGF("Inserting %d bytes\n", framelen);
231 numbytes = framelen; 237 numbytes = framelen;
232 } else { 238 } else {
233 DEBUGF("Inserting 4096+%d bytes\n", framelen); 239 DEBUGF("Inserting 4096+%d bytes\n", framelen);
234 numbytes = 4096 + framelen; 240 numbytes = 4096 + framelen;
235 241
236 rb->memset(audiobuf + 0x100000, 0, numbytes); 242 rb->memset(audiobuf + 0x100000, 0, numbytes);
237 243
238 /* Insert the ID3 header */ 244 /* Insert the ID3 header */
239 rb->memcpy(audiobuf + 0x100000, empty_id3_header, 245 rb->memcpy(audiobuf + 0x100000, empty_id3_header,
240 sizeof(empty_id3_header)); 246 sizeof(empty_id3_header));
241 } 247 }
242 248
243 /* Copy the Xing header */ 249 /* Copy the Xing header */
244 rb->memcpy(audiobuf + 0x100000 + numbytes - framelen, 250 rb->memcpy(audiobuf + 0x100000 + numbytes - framelen,
245 xingbuf, framelen); 251 xingbuf, framelen);
246 252
247 rc = insert_data_in_file(selected_file, 253 rc = insert_data_in_file(selected_file,
248 entry.first_frame_offset, 254 entry.first_frame_offset,
249 audiobuf + 0x100000, numbytes); 255 audiobuf + 0x100000, numbytes);
250 256
251 if(rc < 0) { 257 if(rc < 0) {
252 fileerror(rc); 258 fileerror(rc);
253 return true; 259 return true;
254 } 260 }
255 } 261 }
256 262
257 xingupdate(100); 263 xingupdate(100);
258 } 264 }
259 else 265 else
@@ -276,7 +282,7 @@ enum plugin_status plugin_start(const void *parameter)
276 return PLUGIN_ERROR; 282 return PLUGIN_ERROR;
277 283
278 audiobuf = rb->plugin_get_audio_buffer(&audiobuflen); 284 audiobuf = rb->plugin_get_audio_buffer(&audiobuflen);
279 285
280#ifdef HAVE_ADJUSTABLE_CPU_FREQ 286#ifdef HAVE_ADJUSTABLE_CPU_FREQ
281 rb->cpu_boost(true); 287 rb->cpu_boost(true);
282#endif 288#endif