forked from len0rd/rockbox
Move codec_get_file_pos somewhere else like the comment said should be done. Codec API version increment was needed so update all codecs.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16874 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
d746b79317
commit
4855e734f3
4 changed files with 54 additions and 72 deletions
|
@ -86,7 +86,6 @@ struct codec_api ci = {
|
||||||
NULL, /* advance_buffer_loc */
|
NULL, /* advance_buffer_loc */
|
||||||
NULL, /* seek_buffer */
|
NULL, /* seek_buffer */
|
||||||
NULL, /* seek_complete */
|
NULL, /* seek_complete */
|
||||||
NULL, /* mp3_get_filepos */
|
|
||||||
NULL, /* request_next_track */
|
NULL, /* request_next_track */
|
||||||
NULL, /* discard_codec */
|
NULL, /* discard_codec */
|
||||||
NULL, /* set_offset */
|
NULL, /* set_offset */
|
||||||
|
|
|
@ -80,12 +80,12 @@
|
||||||
#define CODEC_ENC_MAGIC 0x52454E43 /* RENC */
|
#define CODEC_ENC_MAGIC 0x52454E43 /* RENC */
|
||||||
|
|
||||||
/* increase this every time the api struct changes */
|
/* increase this every time the api struct changes */
|
||||||
#define CODEC_API_VERSION 23
|
#define CODEC_API_VERSION 24
|
||||||
|
|
||||||
/* update this to latest version if a change to the api struct breaks
|
/* update this to latest version if a change to the api struct breaks
|
||||||
backwards compatibility (and please take the opportunity to sort in any
|
backwards compatibility (and please take the opportunity to sort in any
|
||||||
new function which are "waiting" at the end of the function table) */
|
new function which are "waiting" at the end of the function table) */
|
||||||
#define CODEC_MIN_API_VERSION 23
|
#define CODEC_MIN_API_VERSION 24
|
||||||
|
|
||||||
/* codec return codes */
|
/* codec return codes */
|
||||||
enum codec_status {
|
enum codec_status {
|
||||||
|
@ -146,8 +146,6 @@ struct codec_api {
|
||||||
bool (*seek_buffer)(size_t newpos);
|
bool (*seek_buffer)(size_t newpos);
|
||||||
/* Codec should call this function when it has done the seeking. */
|
/* Codec should call this function when it has done the seeking. */
|
||||||
void (*seek_complete)(void);
|
void (*seek_complete)(void);
|
||||||
/* Calculate mp3 seek position from given time data in ms. */
|
|
||||||
off_t (*mp3_get_filepos)(int newtime);
|
|
||||||
/* Request file change from file buffer. Returns true is next
|
/* Request file change from file buffer. Returns true is next
|
||||||
track is available and changed. If return value is false,
|
track is available and changed. If return value is false,
|
||||||
codec should exit immediately with PLUGIN_OK status. */
|
codec should exit immediately with PLUGIN_OK status. */
|
||||||
|
|
|
@ -58,6 +58,57 @@ void init_mad(void)
|
||||||
stream.main_data = &mad_main_data;
|
stream.main_data = &mad_main_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int get_file_pos(int newtime)
|
||||||
|
{
|
||||||
|
int pos = -1;
|
||||||
|
struct mp3entry *id3 = ci->id3;
|
||||||
|
|
||||||
|
if (id3->vbr) {
|
||||||
|
if (id3->has_toc) {
|
||||||
|
/* Use the TOC to find the new position */
|
||||||
|
unsigned int percent, remainder;
|
||||||
|
int curtoc, nexttoc, plen;
|
||||||
|
|
||||||
|
percent = (newtime*100) / id3->length;
|
||||||
|
if (percent > 99)
|
||||||
|
percent = 99;
|
||||||
|
|
||||||
|
curtoc = id3->toc[percent];
|
||||||
|
|
||||||
|
if (percent < 99) {
|
||||||
|
nexttoc = id3->toc[percent+1];
|
||||||
|
} else {
|
||||||
|
nexttoc = 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
pos = (id3->filesize/256)*curtoc;
|
||||||
|
|
||||||
|
/* Use the remainder to get a more accurate position */
|
||||||
|
remainder = (newtime*100) % id3->length;
|
||||||
|
remainder = (remainder*100) / id3->length;
|
||||||
|
plen = (nexttoc - curtoc)*(id3->filesize/256);
|
||||||
|
pos += (plen/100)*remainder;
|
||||||
|
} else {
|
||||||
|
/* No TOC exists, estimate the new position */
|
||||||
|
pos = (id3->filesize / (id3->length / 1000)) *
|
||||||
|
(newtime / 1000);
|
||||||
|
}
|
||||||
|
} else if (id3->bitrate) {
|
||||||
|
pos = newtime * (id3->bitrate / 8);
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pos += id3->first_frame_offset;
|
||||||
|
|
||||||
|
/* Don't seek right to the end of the file so that we can
|
||||||
|
transition properly to the next song */
|
||||||
|
if (pos >= (int)(id3->filesize - id3->id3v1len))
|
||||||
|
pos = id3->filesize - id3->id3v1len - 1;
|
||||||
|
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
/* this is the codec entry point */
|
/* this is the codec entry point */
|
||||||
enum codec_status codec_main(void)
|
enum codec_status codec_main(void)
|
||||||
{
|
{
|
||||||
|
@ -146,7 +197,7 @@ next_track:
|
||||||
newpos = ci->id3->first_frame_offset;
|
newpos = ci->id3->first_frame_offset;
|
||||||
samples_to_skip = start_skip;
|
samples_to_skip = start_skip;
|
||||||
} else {
|
} else {
|
||||||
newpos = ci->mp3_get_filepos(ci->seek_time-1);
|
newpos = get_file_pos(ci->seek_time-1);
|
||||||
samples_to_skip = 0;
|
samples_to_skip = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1042,71 +1042,6 @@ static void codec_advance_buffer_loc_callback(void *ptr)
|
||||||
codec_advance_buffer_callback(amount);
|
codec_advance_buffer_callback(amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copied from mpeg.c. Should be moved somewhere else. */
|
|
||||||
static int codec_get_file_pos(void)
|
|
||||||
{
|
|
||||||
int pos = -1;
|
|
||||||
struct mp3entry *id3 = audio_current_track();
|
|
||||||
|
|
||||||
if (id3->vbr)
|
|
||||||
{
|
|
||||||
if (id3->has_toc)
|
|
||||||
{
|
|
||||||
/* Use the TOC to find the new position */
|
|
||||||
unsigned int percent, remainder;
|
|
||||||
int curtoc, nexttoc, plen;
|
|
||||||
|
|
||||||
percent = (id3->elapsed*100)/id3->length;
|
|
||||||
if (percent > 99)
|
|
||||||
percent = 99;
|
|
||||||
|
|
||||||
curtoc = id3->toc[percent];
|
|
||||||
|
|
||||||
if (percent < 99)
|
|
||||||
nexttoc = id3->toc[percent+1];
|
|
||||||
else
|
|
||||||
nexttoc = 256;
|
|
||||||
|
|
||||||
pos = (id3->filesize/256)*curtoc;
|
|
||||||
|
|
||||||
/* Use the remainder to get a more accurate position */
|
|
||||||
remainder = (id3->elapsed*100)%id3->length;
|
|
||||||
remainder = (remainder*100)/id3->length;
|
|
||||||
plen = (nexttoc - curtoc)*(id3->filesize/256);
|
|
||||||
pos += (plen/100)*remainder;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* No TOC exists, estimate the new position */
|
|
||||||
pos = (id3->filesize / (id3->length / 1000)) *
|
|
||||||
(id3->elapsed / 1000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (id3->bitrate)
|
|
||||||
pos = id3->elapsed * (id3->bitrate / 8);
|
|
||||||
else
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
pos += id3->first_frame_offset;
|
|
||||||
|
|
||||||
/* Don't seek right to the end of the file so that we can
|
|
||||||
transition properly to the next song */
|
|
||||||
if (pos >= (int)(id3->filesize - id3->id3v1len))
|
|
||||||
pos = id3->filesize - id3->id3v1len - 1;
|
|
||||||
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
static off_t codec_mp3_get_filepos_callback(int newtime)
|
|
||||||
{
|
|
||||||
off_t newpos;
|
|
||||||
|
|
||||||
curtrack_id3.elapsed = newtime;
|
|
||||||
newpos = codec_get_file_pos();
|
|
||||||
|
|
||||||
return newpos;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void codec_seek_complete_callback(void)
|
static void codec_seek_complete_callback(void)
|
||||||
{
|
{
|
||||||
logf("seek_complete");
|
logf("seek_complete");
|
||||||
|
@ -2577,7 +2512,6 @@ void audio_init(void)
|
||||||
ci.advance_buffer = codec_advance_buffer_callback;
|
ci.advance_buffer = codec_advance_buffer_callback;
|
||||||
ci.advance_buffer_loc = codec_advance_buffer_loc_callback;
|
ci.advance_buffer_loc = codec_advance_buffer_loc_callback;
|
||||||
ci.request_next_track = codec_request_next_track_callback;
|
ci.request_next_track = codec_request_next_track_callback;
|
||||||
ci.mp3_get_filepos = codec_mp3_get_filepos_callback;
|
|
||||||
ci.seek_buffer = codec_seek_buffer_callback;
|
ci.seek_buffer = codec_seek_buffer_callback;
|
||||||
ci.seek_complete = codec_seek_complete_callback;
|
ci.seek_complete = codec_seek_complete_callback;
|
||||||
ci.set_elapsed = codec_set_elapsed_callback;
|
ci.set_elapsed = codec_set_elapsed_callback;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue