summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2011-11-06 13:58:17 +0000
committerJens Arnold <amiconn@rockbox.org>2011-11-06 13:58:17 +0000
commit544fb6a5a48036a2e28b51e2b3f4c9c12c20dd18 (patch)
tree34d3fe5f7f3071ab3690faade822afcbfa4e692e
parente5db19de484e20dabc20996b4220dd0e809dce06 (diff)
downloadrockbox-544fb6a5a48036a2e28b51e2b3f4c9c12c20dd18.tar.gz
rockbox-544fb6a5a48036a2e28b51e2b3f4c9c12c20dd18.zip
Voice related fixes and cleaup
* Fix .talk clips on hwcodec. Voice does have the entire audio buffer available there. * Get rid of the separate TALK_PROGRESSIVE_LOAD in favour of the more advanced TALK_PARTIAL_LOAD i.e. use the latter on the Ondios as well. This gets rid of quite some ifdefing, and has the advantage that the voice file can be larger than the buffer (at a slight binsize cost). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30916 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/talk.c60
1 files changed, 18 insertions, 42 deletions
diff --git a/apps/talk.c b/apps/talk.c
index c264bd7179..e1eea4d3c4 100644
--- a/apps/talk.c
+++ b/apps/talk.c
@@ -113,14 +113,13 @@ struct queue_entry /* one entry of the internal queue */
113 113
114/***************** Globals *****************/ 114/***************** Globals *****************/
115 115
116#if CONFIG_STORAGE & STORAGE_MMC 116#if (CONFIG_CODEC == SWCODEC && MEMORYSIZE <= 2) \
117/* The MMC storage on the Ondios is slow enough that we want to buffer the 117 || (CONFIG_STORAGE & STORAGE_MMC)
118 * talk clips only when they are needed */ 118/* On low memory swcodec targets the entire voice file wouldn't fit in memory
119# define TALK_PROGRESSIVE_LOAD 119 * together with codecs, so we load clips each time they are accessed.
120#elif CONFIG_CODEC == SWCODEC && MEMORYSIZE <= 2 120 * The Ondios have slow storage access and loading the entire voice file would
121/* The entire voice file wouldn't fit in memory together with codecs, so we 121 * take several seconds, so we use the same mechanism. */
122 * load clips each time they are accessed */ 122#define TALK_PARTIAL_LOAD
123# define TALK_PARTIAL_LOAD
124#endif 123#endif
125 124
126#ifdef TALK_PARTIAL_LOAD 125#ifdef TALK_PARTIAL_LOAD
@@ -213,10 +212,9 @@ static unsigned char* get_clip(long id, long* p_size)
213 clipbuf = (unsigned char *) p_voicefile + p_voicefile->index[id].offset; 212 clipbuf = (unsigned char *) p_voicefile + p_voicefile->index[id].offset;
214#endif 213#endif
215 214
216#if defined(TALK_PROGRESSIVE_LOAD) || defined(TALK_PARTIAL_LOAD) 215#ifdef TALK_PARTIAL_LOAD
217 if (!(clipsize & LOADED_MASK)) 216 if (!(clipsize & LOADED_MASK))
218 { /* clip needs loading */ 217 { /* clip needs loading */
219#ifdef TALK_PARTIAL_LOAD
220 int idx = 0; 218 int idx = 0;
221 if (id == VOICE_PAUSE) { 219 if (id == VOICE_PAUSE) {
222 idx = QUEUE_SIZE; /* we keep VOICE_PAUSE loaded */ 220 idx = QUEUE_SIZE; /* we keep VOICE_PAUSE loaded */
@@ -242,7 +240,6 @@ static unsigned char* get_clip(long id, long* p_size)
242 clip_age[idx] = 0; /* reset clip's age */ 240 clip_age[idx] = 0; /* reset clip's age */
243 } 241 }
244 clipbuf = clip_buffer + idx * max_clipsize; 242 clipbuf = clip_buffer + idx * max_clipsize;
245#endif
246 243
247 lseek(filehandle, p_voicefile->index[id].offset, SEEK_SET); 244 lseek(filehandle, p_voicefile->index[id].offset, SEEK_SET);
248 if (read(filehandle, clipbuf, clipsize) != clipsize) 245 if (read(filehandle, clipbuf, clipsize) != clipsize)
@@ -250,7 +247,6 @@ static unsigned char* get_clip(long id, long* p_size)
250 247
251 p_voicefile->index[id].size |= LOADED_MASK; /* mark as loaded */ 248 p_voicefile->index[id].size |= LOADED_MASK; /* mark as loaded */
252 249
253#ifdef TALK_PARTIAL_LOAD
254 if (id != VOICE_PAUSE) { 250 if (id != VOICE_PAUSE) {
255 if (buffered_id[idx] >= 0) { 251 if (buffered_id[idx] >= 0) {
256 /* mark previously loaded clip as unloaded */ 252 /* mark previously loaded clip as unloaded */
@@ -258,11 +254,9 @@ static unsigned char* get_clip(long id, long* p_size)
258 } 254 }
259 buffered_id[idx] = id; 255 buffered_id[idx] = id;
260 } 256 }
261#endif
262 } 257 }
263 else 258 else
264 { /* clip is in memory already */ 259 { /* clip is in memory already */
265#ifdef TALK_PARTIAL_LOAD
266 /* Find where it was loaded */ 260 /* Find where it was loaded */
267 clipbuf = clip_buffer; 261 clipbuf = clip_buffer;
268 if (id == VOICE_PAUSE) { 262 if (id == VOICE_PAUSE) {
@@ -276,10 +270,9 @@ static unsigned char* get_clip(long id, long* p_size)
276 break; 270 break;
277 } 271 }
278 } 272 }
279#endif
280 clipsize &= ~LOADED_MASK; /* without the extra bit gives true size */ 273 clipsize &= ~LOADED_MASK; /* without the extra bit gives true size */
281 } 274 }
282#endif /* defined(TALK_PROGRESSIVE_LOAD) || defined(TALK_PARTIAL_LOAD) */ 275#endif /* TALK_PARTIAL_LOAD */
283 276
284 *p_size = clipsize; 277 *p_size = clipsize;
285 return clipbuf; 278 return clipbuf;
@@ -297,9 +290,6 @@ static void load_voicefile(bool probe, char* buf, size_t bufsize)
297 290
298 size_t load_size, alloc_size; 291 size_t load_size, alloc_size;
299 ssize_t got_size; 292 ssize_t got_size;
300#ifndef TALK_PARTIAL_LOAD
301 size_t file_size;
302#endif
303#ifdef ROCKBOX_LITTLE_ENDIAN 293#ifdef ROCKBOX_LITTLE_ENDIAN
304 int i; 294 int i;
305#endif 295#endif
@@ -313,23 +303,15 @@ static void load_voicefile(bool probe, char* buf, size_t bufsize)
313 if (!voicebuf.buf) 303 if (!voicebuf.buf)
314 goto load_err; 304 goto load_err;
315 305
316#ifndef TALK_PARTIAL_LOAD 306#ifdef TALK_PARTIAL_LOAD
317 file_size = filesize(filehandle);
318 if (file_size > bufsize) /* won't fit? */
319 goto load_err;
320#endif
321
322#if defined(TALK_PROGRESSIVE_LOAD) || defined(TALK_PARTIAL_LOAD)
323 /* load only the header for now */ 307 /* load only the header for now */
324 load_size = sizeof(struct voicefile); 308 load_size = sizeof(struct voicefile);
325#else /* load the full file */ 309#else
326 load_size = file_size; 310 /* load the entire file */
311 load_size = filesize(filehandle);
327#endif 312#endif
328
329#ifdef TALK_PARTIAL_LOAD
330 if (load_size > bufsize) /* won't fit? */ 313 if (load_size > bufsize) /* won't fit? */
331 goto load_err; 314 goto load_err;
332#endif
333 315
334 got_size = read(filehandle, voicebuf.buf, load_size); 316 got_size = read(filehandle, voicebuf.buf, load_size);
335 if (got_size != (ssize_t)load_size /* failure */) 317 if (got_size != (ssize_t)load_size /* failure */)
@@ -357,15 +339,13 @@ static void load_voicefile(bool probe, char* buf, size_t bufsize)
357 else 339 else
358 goto load_err; 340 goto load_err;
359 341
360#if defined(TALK_PROGRESSIVE_LOAD) || defined(TALK_PARTIAL_LOAD) 342#ifdef TALK_PARTIAL_LOAD
361 /* load the index table, now that we know its size from the header */ 343 /* load the index table, now that we know its size from the header */
362 load_size = (p_voicefile->id1_max + p_voicefile->id2_max) 344 load_size = (p_voicefile->id1_max + p_voicefile->id2_max)
363 * sizeof(struct clip_entry); 345 * sizeof(struct clip_entry);
364 346
365#ifdef TALK_PARTIAL_LOAD
366 if (load_size > bufsize) /* won't fit? */ 347 if (load_size > bufsize) /* won't fit? */
367 goto load_err; 348 goto load_err;
368#endif
369 349
370 got_size = read(filehandle, &p_voicefile->index[0], load_size); 350 got_size = read(filehandle, &p_voicefile->index[0], load_size);
371 if (got_size != (ssize_t)load_size) /* read error */ 351 if (got_size != (ssize_t)load_size) /* read error */
@@ -375,7 +355,7 @@ static void load_voicefile(bool probe, char* buf, size_t bufsize)
375#else 355#else
376 close(filehandle); 356 close(filehandle);
377 filehandle = -1; 357 filehandle = -1;
378#endif /* defined(TALK_PROGRESSIVE_LOAD) || defined(TALK_PARTIAL_LOAD) */ 358#endif /* TALK_PARTIAL_LOAD */
379 359
380#ifdef ROCKBOX_LITTLE_ENDIAN 360#ifdef ROCKBOX_LITTLE_ENDIAN
381 for (i = 0; i < p_voicefile->id1_max + p_voicefile->id2_max; i++) 361 for (i = 0; i < p_voicefile->id1_max + p_voicefile->id2_max; i++)
@@ -394,10 +374,6 @@ static void load_voicefile(bool probe, char* buf, size_t bufsize)
394 374
395#ifdef TALK_PARTIAL_LOAD 375#ifdef TALK_PARTIAL_LOAD
396 alloc_size += silence_len + QUEUE_SIZE; 376 alloc_size += silence_len + QUEUE_SIZE;
397#else
398 /* allocate for the entire file, TALK_PROGRESSIVE_LOAD doesn't
399 * load everything just yet */
400 alloc_size = file_size;
401#endif 377#endif
402 378
403 if (alloc_size > bufsize) 379 if (alloc_size > bufsize)
@@ -736,11 +712,11 @@ bool talk_voice_required(void)
736/* return size of voice file */ 712/* return size of voice file */
737static int talk_get_buffer(void) 713static int talk_get_buffer(void)
738{ 714{
739 int ret = voicefile_size;
740#if CONFIG_CODEC == SWCODEC 715#if CONFIG_CODEC == SWCODEC
741 ret += MAX_THUMBNAIL_BUFSIZE; 716 return voicefile_size + MAX_THUMBNAIL_BUFSIZE;
717#else
718 return audio_buffer_available();
742#endif 719#endif
743 return ret;
744} 720}
745 721
746/* Sets the buffer for the voicefile and returns how many bytes of this 722/* Sets the buffer for the voicefile and returns how many bytes of this