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
This commit is contained in:
Jens Arnold 2011-11-06 13:58:17 +00:00
parent e5db19de48
commit 544fb6a5a4

View file

@ -113,14 +113,13 @@ struct queue_entry /* one entry of the internal queue */
/***************** Globals *****************/ /***************** Globals *****************/
#if CONFIG_STORAGE & STORAGE_MMC #if (CONFIG_CODEC == SWCODEC && MEMORYSIZE <= 2) \
/* The MMC storage on the Ondios is slow enough that we want to buffer the || (CONFIG_STORAGE & STORAGE_MMC)
* talk clips only when they are needed */ /* On low memory swcodec targets the entire voice file wouldn't fit in memory
# define TALK_PROGRESSIVE_LOAD * together with codecs, so we load clips each time they are accessed.
#elif CONFIG_CODEC == SWCODEC && MEMORYSIZE <= 2 * The Ondios have slow storage access and loading the entire voice file would
/* The entire voice file wouldn't fit in memory together with codecs, so we * take several seconds, so we use the same mechanism. */
* load clips each time they are accessed */ #define TALK_PARTIAL_LOAD
# define TALK_PARTIAL_LOAD
#endif #endif
#ifdef TALK_PARTIAL_LOAD #ifdef TALK_PARTIAL_LOAD
@ -213,10 +212,9 @@ static unsigned char* get_clip(long id, long* p_size)
clipbuf = (unsigned char *) p_voicefile + p_voicefile->index[id].offset; clipbuf = (unsigned char *) p_voicefile + p_voicefile->index[id].offset;
#endif #endif
#if defined(TALK_PROGRESSIVE_LOAD) || defined(TALK_PARTIAL_LOAD) #ifdef TALK_PARTIAL_LOAD
if (!(clipsize & LOADED_MASK)) if (!(clipsize & LOADED_MASK))
{ /* clip needs loading */ { /* clip needs loading */
#ifdef TALK_PARTIAL_LOAD
int idx = 0; int idx = 0;
if (id == VOICE_PAUSE) { if (id == VOICE_PAUSE) {
idx = QUEUE_SIZE; /* we keep VOICE_PAUSE loaded */ idx = QUEUE_SIZE; /* we keep VOICE_PAUSE loaded */
@ -242,7 +240,6 @@ static unsigned char* get_clip(long id, long* p_size)
clip_age[idx] = 0; /* reset clip's age */ clip_age[idx] = 0; /* reset clip's age */
} }
clipbuf = clip_buffer + idx * max_clipsize; clipbuf = clip_buffer + idx * max_clipsize;
#endif
lseek(filehandle, p_voicefile->index[id].offset, SEEK_SET); lseek(filehandle, p_voicefile->index[id].offset, SEEK_SET);
if (read(filehandle, clipbuf, clipsize) != clipsize) if (read(filehandle, clipbuf, clipsize) != clipsize)
@ -250,7 +247,6 @@ static unsigned char* get_clip(long id, long* p_size)
p_voicefile->index[id].size |= LOADED_MASK; /* mark as loaded */ p_voicefile->index[id].size |= LOADED_MASK; /* mark as loaded */
#ifdef TALK_PARTIAL_LOAD
if (id != VOICE_PAUSE) { if (id != VOICE_PAUSE) {
if (buffered_id[idx] >= 0) { if (buffered_id[idx] >= 0) {
/* mark previously loaded clip as unloaded */ /* mark previously loaded clip as unloaded */
@ -258,11 +254,9 @@ static unsigned char* get_clip(long id, long* p_size)
} }
buffered_id[idx] = id; buffered_id[idx] = id;
} }
#endif
} }
else else
{ /* clip is in memory already */ { /* clip is in memory already */
#ifdef TALK_PARTIAL_LOAD
/* Find where it was loaded */ /* Find where it was loaded */
clipbuf = clip_buffer; clipbuf = clip_buffer;
if (id == VOICE_PAUSE) { if (id == VOICE_PAUSE) {
@ -276,10 +270,9 @@ static unsigned char* get_clip(long id, long* p_size)
break; break;
} }
} }
#endif
clipsize &= ~LOADED_MASK; /* without the extra bit gives true size */ clipsize &= ~LOADED_MASK; /* without the extra bit gives true size */
} }
#endif /* defined(TALK_PROGRESSIVE_LOAD) || defined(TALK_PARTIAL_LOAD) */ #endif /* TALK_PARTIAL_LOAD */
*p_size = clipsize; *p_size = clipsize;
return clipbuf; return clipbuf;
@ -297,9 +290,6 @@ static void load_voicefile(bool probe, char* buf, size_t bufsize)
size_t load_size, alloc_size; size_t load_size, alloc_size;
ssize_t got_size; ssize_t got_size;
#ifndef TALK_PARTIAL_LOAD
size_t file_size;
#endif
#ifdef ROCKBOX_LITTLE_ENDIAN #ifdef ROCKBOX_LITTLE_ENDIAN
int i; int i;
#endif #endif
@ -313,23 +303,15 @@ static void load_voicefile(bool probe, char* buf, size_t bufsize)
if (!voicebuf.buf) if (!voicebuf.buf)
goto load_err; goto load_err;
#ifndef TALK_PARTIAL_LOAD #ifdef TALK_PARTIAL_LOAD
file_size = filesize(filehandle);
if (file_size > bufsize) /* won't fit? */
goto load_err;
#endif
#if defined(TALK_PROGRESSIVE_LOAD) || defined(TALK_PARTIAL_LOAD)
/* load only the header for now */ /* load only the header for now */
load_size = sizeof(struct voicefile); load_size = sizeof(struct voicefile);
#else /* load the full file */ #else
load_size = file_size; /* load the entire file */
load_size = filesize(filehandle);
#endif #endif
#ifdef TALK_PARTIAL_LOAD
if (load_size > bufsize) /* won't fit? */ if (load_size > bufsize) /* won't fit? */
goto load_err; goto load_err;
#endif
got_size = read(filehandle, voicebuf.buf, load_size); got_size = read(filehandle, voicebuf.buf, load_size);
if (got_size != (ssize_t)load_size /* failure */) if (got_size != (ssize_t)load_size /* failure */)
@ -357,15 +339,13 @@ static void load_voicefile(bool probe, char* buf, size_t bufsize)
else else
goto load_err; goto load_err;
#if defined(TALK_PROGRESSIVE_LOAD) || defined(TALK_PARTIAL_LOAD) #ifdef TALK_PARTIAL_LOAD
/* load the index table, now that we know its size from the header */ /* load the index table, now that we know its size from the header */
load_size = (p_voicefile->id1_max + p_voicefile->id2_max) load_size = (p_voicefile->id1_max + p_voicefile->id2_max)
* sizeof(struct clip_entry); * sizeof(struct clip_entry);
#ifdef TALK_PARTIAL_LOAD
if (load_size > bufsize) /* won't fit? */ if (load_size > bufsize) /* won't fit? */
goto load_err; goto load_err;
#endif
got_size = read(filehandle, &p_voicefile->index[0], load_size); got_size = read(filehandle, &p_voicefile->index[0], load_size);
if (got_size != (ssize_t)load_size) /* read error */ if (got_size != (ssize_t)load_size) /* read error */
@ -375,7 +355,7 @@ static void load_voicefile(bool probe, char* buf, size_t bufsize)
#else #else
close(filehandle); close(filehandle);
filehandle = -1; filehandle = -1;
#endif /* defined(TALK_PROGRESSIVE_LOAD) || defined(TALK_PARTIAL_LOAD) */ #endif /* TALK_PARTIAL_LOAD */
#ifdef ROCKBOX_LITTLE_ENDIAN #ifdef ROCKBOX_LITTLE_ENDIAN
for (i = 0; i < p_voicefile->id1_max + p_voicefile->id2_max; i++) 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)
#ifdef TALK_PARTIAL_LOAD #ifdef TALK_PARTIAL_LOAD
alloc_size += silence_len + QUEUE_SIZE; alloc_size += silence_len + QUEUE_SIZE;
#else
/* allocate for the entire file, TALK_PROGRESSIVE_LOAD doesn't
* load everything just yet */
alloc_size = file_size;
#endif #endif
if (alloc_size > bufsize) if (alloc_size > bufsize)
@ -736,11 +712,11 @@ bool talk_voice_required(void)
/* return size of voice file */ /* return size of voice file */
static int talk_get_buffer(void) static int talk_get_buffer(void)
{ {
int ret = voicefile_size;
#if CONFIG_CODEC == SWCODEC #if CONFIG_CODEC == SWCODEC
ret += MAX_THUMBNAIL_BUFSIZE; return voicefile_size + MAX_THUMBNAIL_BUFSIZE;
#else
return audio_buffer_available();
#endif #endif
return ret;
} }
/* Sets the buffer for the voicefile and returns how many bytes of this /* Sets the buffer for the voicefile and returns how many bytes of this