forked from len0rd/rockbox
Patch #5844 by Steve Bavin - Fix confused voice file memory allocation
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10711 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
8a3b6dad94
commit
97b56a665c
2 changed files with 22 additions and 25 deletions
|
@ -481,14 +481,7 @@ static void* get_voice_memory_callback(size_t *size)
|
||||||
static void* get_codec_memory_callback(size_t *size)
|
static void* get_codec_memory_callback(size_t *size)
|
||||||
{
|
{
|
||||||
*size = MALLOC_BUFSIZE;
|
*size = MALLOC_BUFSIZE;
|
||||||
#if CONFIG_CODEC != SWCODEC
|
|
||||||
/* MASCODEC cannot play audio and voice simultaneously, so its
|
|
||||||
voice strategy is different - see talk.c for details */
|
|
||||||
if (voice_codec_loaded)
|
|
||||||
return &audiobuf[talk_get_bufsize()];
|
return &audiobuf[talk_get_bufsize()];
|
||||||
else
|
|
||||||
#endif
|
|
||||||
return audiobuf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pcmbuf_position_callback(size_t size) ICODE_ATTR;
|
static void pcmbuf_position_callback(size_t size) ICODE_ATTR;
|
||||||
|
@ -2559,14 +2552,16 @@ static void reset_buffer(void)
|
||||||
{
|
{
|
||||||
size_t offset;
|
size_t offset;
|
||||||
|
|
||||||
filebuf = (char *)&audiobuf[MALLOC_BUFSIZE];
|
/* Set up file buffer as all space available */
|
||||||
filebuflen = audiobufend - audiobuf - MALLOC_BUFSIZE - GUARD_BUFSIZE -
|
filebuf = (char *)&audiobuf[talk_get_bufsize()+MALLOC_BUFSIZE];
|
||||||
|
filebuflen = audiobufend - (unsigned char *) filebuf - GUARD_BUFSIZE -
|
||||||
(pcmbuf_get_bufsize() + get_pcmbuf_descsize() + PCMBUF_MIX_CHUNK * 2);
|
(pcmbuf_get_bufsize() + get_pcmbuf_descsize() + PCMBUF_MIX_CHUNK * 2);
|
||||||
|
|
||||||
|
/* Allow for codec(s) at end of file buffer */
|
||||||
if (talk_voice_required())
|
if (talk_voice_required())
|
||||||
{
|
{
|
||||||
filebuf = &filebuf[talk_get_bufsize()];
|
/* Allow 2 codecs at end of file buffer */
|
||||||
filebuflen -= 2*CODEC_IRAM_SIZE + 2*CODEC_SIZE + talk_get_bufsize();
|
filebuflen -= 2 * (CODEC_IRAM_SIZE + CODEC_SIZE);
|
||||||
|
|
||||||
#ifndef SIMULATOR
|
#ifndef SIMULATOR
|
||||||
iram_buf[0] = &filebuf[filebuflen];
|
iram_buf[0] = &filebuf[filebuflen];
|
||||||
|
@ -2577,16 +2572,18 @@ static void reset_buffer(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
filebuf = &filebuf[talk_get_bufsize()];
|
/* Allow for 1 codec at end of file buffer */
|
||||||
filebuflen -= CODEC_IRAM_SIZE + CODEC_SIZE + talk_get_bufsize();
|
filebuflen -= CODEC_IRAM_SIZE + CODEC_SIZE;
|
||||||
|
|
||||||
#ifndef SIMULATOR
|
#ifndef SIMULATOR
|
||||||
iram_buf[0] = &filebuf[filebuflen];
|
iram_buf[0] = &filebuf[filebuflen];
|
||||||
|
iram_buf[1] = NULL;
|
||||||
#endif
|
#endif
|
||||||
dram_buf[0] = (unsigned char *)&filebuf[filebuflen+CODEC_IRAM_SIZE*2];
|
dram_buf[0] = (unsigned char *)&filebuf[filebuflen+CODEC_IRAM_SIZE];
|
||||||
|
dram_buf[1] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ensure that everything is aligned */
|
/* Ensure that file buffer is aligned */
|
||||||
offset = (-(size_t)filebuf) & 3;
|
offset = (-(size_t)filebuf) & 3;
|
||||||
filebuf += offset;
|
filebuf += offset;
|
||||||
filebuflen -= offset;
|
filebuflen -= offset;
|
||||||
|
@ -3092,7 +3089,7 @@ static void playback_init(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
filebuf = (char *)&audiobuf[MALLOC_BUFSIZE];
|
filebuf = (char *)&audiobuf[MALLOC_BUFSIZE]; /* Will be reset by reset_buffer */
|
||||||
|
|
||||||
audio_set_crossfade(global_settings.crossfade);
|
audio_set_crossfade(global_settings.crossfade);
|
||||||
|
|
||||||
|
|
16
apps/talk.c
16
apps/talk.c
|
@ -38,6 +38,7 @@
|
||||||
#if CONFIG_CODEC == SWCODEC
|
#if CONFIG_CODEC == SWCODEC
|
||||||
#include "playback.h"
|
#include "playback.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
|
|
||||||
/* Memory layout varies between targets because the
|
/* Memory layout varies between targets because the
|
||||||
|
@ -47,7 +48,7 @@
|
||||||
(playing) | (stopped) |
|
(playing) | (stopped) |
|
||||||
audiobuf-----------+-----------+-----------
|
audiobuf-----------+-----------+-----------
|
||||||
audio | voice | thumbnail
|
audio | voice | thumbnail
|
||||||
|-----------|-----------
|
|-----------|----------- filebuf
|
||||||
| thumbnail | voice
|
| thumbnail | voice
|
||||||
| |-----------
|
| |-----------
|
||||||
| | audio
|
| | audio
|
||||||
|
@ -189,12 +190,10 @@ static void load_voicefile(void)
|
||||||
if (((struct voicefile*)audiobuf)->table /* format check */
|
if (((struct voicefile*)audiobuf)->table /* format check */
|
||||||
== offsetof(struct voicefile, index))
|
== offsetof(struct voicefile, index))
|
||||||
{
|
{
|
||||||
#if CONFIG_CODEC == SWCODEC
|
|
||||||
/* SWCODEC: allocate permanent buffer */
|
|
||||||
p_voicefile = (struct voicefile*)buffer_alloc(file_size);
|
|
||||||
#else
|
|
||||||
/* MASCODEC: now use audiobuf for voice then thumbnail */
|
|
||||||
p_voicefile = (struct voicefile*)audiobuf;
|
p_voicefile = (struct voicefile*)audiobuf;
|
||||||
|
|
||||||
|
#if CONFIG_CODEC != SWCODEC
|
||||||
|
/* MASCODEC: now use audiobuf for voice then thumbnail */
|
||||||
p_thumbnail = audiobuf + file_size;
|
p_thumbnail = audiobuf + file_size;
|
||||||
p_thumbnail += (long)p_thumbnail % 2; /* 16-bit align */
|
p_thumbnail += (long)p_thumbnail % 2; /* 16-bit align */
|
||||||
size_for_thumbnail = audiobufend - p_thumbnail;
|
size_for_thumbnail = audiobufend - p_thumbnail;
|
||||||
|
@ -526,13 +525,14 @@ void talk_init(void)
|
||||||
close(filehandle); /* close again, this was just to detect presence */
|
close(filehandle); /* close again, this was just to detect presence */
|
||||||
filehandle = -1;
|
filehandle = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return if a voice codec is required or not */
|
/* return if a voice codec is required or not */
|
||||||
bool talk_voice_required(void)
|
bool talk_voice_required(void)
|
||||||
{
|
{
|
||||||
return (voicefile_size != 0)
|
return (voicefile_size != 0) /* Voice file is available */
|
||||||
|| (global_settings.talk_dir == 3)
|
|| (global_settings.talk_dir == 3) /* Thumbnail clips are required */
|
||||||
|| (global_settings.talk_file == 3);
|
|| (global_settings.talk_file == 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue