Submit parts of FS#12189 regarding codec API. Replaces access to global settings with a dedicated function to determine if the current track shall be looped. Used by several synthesizer codecs.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30391 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Andree Buschmann 2011-08-30 19:40:09 +00:00
parent e66ad3e8a8
commit e88d24a840
13 changed files with 38 additions and 29 deletions

View file

@ -30,6 +30,7 @@
#include "buffering.h"
#include "dsp.h"
#include "metadata.h"
#include "settings.h"
/* Define LOGF_ENABLE to enable logf output in this file */
/*#define LOGF_ENABLE*/
@ -405,6 +406,11 @@ static enum codec_command_action
}
}
static bool codec_loop_track_callback(void)
{
return global_settings.repeat_mode == REPEAT_ONE;
}
/* Initialize codec API */
void codec_init_codec_api(void)
{
@ -421,6 +427,7 @@ void codec_init_codec_api(void)
ci.set_offset = audio_codec_update_offset;
ci.configure = codec_configure_callback;
ci.get_command = codec_get_command_callback;
ci.loop_track = codec_loop_track_callback;
}

View file

@ -50,6 +50,7 @@
#include "sound.h"
#include "splash.h"
#include "general.h"
#include "rbpaths.h"
#define LOGF_ENABLE
#include "logf.h"
@ -97,6 +98,7 @@ struct codec_api ci = {
NULL, /* set_offset */
NULL, /* configure */
NULL, /* get_command */
NULL, /* loop_track */
/* kernel/ system */
#if defined(CPU_ARM) && CONFIG_PLATFORM & PLATFORM_NATIVE
@ -127,7 +129,6 @@ struct codec_api ci = {
memmove,
memcmp,
memchr,
strcasestr,
#if defined(DEBUG) || defined(SIMULATOR)
debugf,
#endif
@ -136,7 +137,6 @@ struct codec_api ci = {
#endif
(qsort_func)qsort,
&global_settings,
#ifdef RB_PROFILE
profile_thread,

View file

@ -44,7 +44,6 @@
#endif
#include "dsp.h"
#endif
#include "settings.h"
#include "gcc_extensions.h"
#include "load_code.h"
@ -75,12 +74,12 @@
#define CODEC_ENC_MAGIC 0x52454E43 /* RENC */
/* increase this every time the api struct changes */
#define CODEC_API_VERSION 42
#define CODEC_API_VERSION 43
/* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any
new function which are "waiting" at the end of the function table) */
#define CODEC_MIN_API_VERSION 42
#define CODEC_MIN_API_VERSION 43
/* reasons for calling codec main entrypoint */
enum codec_entry_call_reason {
@ -145,6 +144,8 @@ struct codec_api {
void (*configure)(int setting, intptr_t value);
/* Obtain command action on what to do next */
enum codec_command_action (*get_command)(intptr_t *param);
/* Determine whether the track should be looped, if applicable. */
bool (*loop_track)(void);
/* kernel/ system */
#if defined(CPU_ARM) && CONFIG_PLATFORM & PLATFORM_NATIVE
@ -180,7 +181,6 @@ struct codec_api {
void* (*memmove)(void *out, const void *in, size_t n);
int (*memcmp)(const void *s1, const void *s2, size_t n);
void *(*memchr)(const void *s1, int c, size_t n);
char *(*strcasestr) (const char* phaystack, const char* pneedle);
#if defined(DEBUG) || defined(SIMULATOR)
void (*debugf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
@ -193,9 +193,6 @@ struct codec_api {
void (*qsort)(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
/* The ADX codec accesses global_settings to test for REPEAT_ONE mode */
struct user_settings* global_settings;
#ifdef RB_PROFILE
void (*profile_thread)(void);
void (*profstop)(void);

View file

@ -239,7 +239,7 @@ enum codec_status codec_run(void)
if (bufoff > end_adr-18*channels && looping) {
DEBUGF("ADX: loop!\n");
/* check for endless looping */
if (ci->global_settings->repeat_mode==REPEAT_ONE) {
if (ci->loop_track()) {
loop_count=0;
fade_count = -1; /* disable fade */
} else {

View file

@ -17,8 +17,8 @@ static struct Ay_Emu ay_emu;
static void set_codec_track(int t, int multitrack) {
Ay_start_track(&ay_emu, t);
/* for REPEAT_ONE we disable track limits */
if (ci->global_settings->repeat_mode != REPEAT_ONE) {
/* for loop mode we disable track limits */
if (!ci->loop_track()) {
Track_set_fade(&ay_emu, Track_get_length( &ay_emu, t ) - 4000, 4000);
}
if (multitrack) ci->set_elapsed(t*1000); /* t is track no to display */
@ -111,7 +111,7 @@ next_track:
ci->seek_complete();
/* Set fade again */
if (ci->global_settings->repeat_mode != REPEAT_ONE) {
if (!ci->loop_track()) {
Track_set_fade(&ay_emu, Track_get_length( &ay_emu, track ) - 4000, 4000);
}
}

View file

@ -17,8 +17,8 @@ static struct Gbs_Emu gbs_emu;
static void set_codec_track(int t) {
Gbs_start_track(&gbs_emu, t);
/* for REPEAT_ONE we disable track limits */
if (ci->global_settings->repeat_mode != REPEAT_ONE) {
/* for loop mode we disable track limits */
if (!ci->loop_track()) {
Track_set_fade(&gbs_emu, Track_get_length( &gbs_emu, t ), 4000);
}
ci->set_elapsed(t*1000); /* t is track no to display */

View file

@ -17,8 +17,8 @@ static struct Hes_Emu hes_emu;
static void set_codec_track(int t) {
Hes_start_track(&hes_emu, t);
/* for REPEAT_ONE we disable track limits */
if (ci->global_settings->repeat_mode != REPEAT_ONE) {
/* for loop mode we disable track limits */
if (!ci->loop_track()) {
Track_set_fade(&hes_emu, Track_get_length( &hes_emu, t ), 4000);
}
ci->set_elapsed(t*1000); /* t is track no to display */

View file

@ -18,7 +18,7 @@ static void set_codec_track(int t) {
Kss_start_track(&kss_emu, t);
/* for REPEAT_ONE we disable track limits */
if (ci->global_settings->repeat_mode != REPEAT_ONE) {
if (!ci->loop_track()) {
Track_set_fade(&kss_emu, Track_get_length( &kss_emu, t ), 4000);
}
ci->set_elapsed(t*1000); /* t is track no to display */

View file

@ -20,7 +20,7 @@ static void set_codec_track(int t, int multitrack) {
Nsf_start_track(&nsf_emu, t);
/* for REPEAT_ONE we disable track limits */
if (ci->global_settings->repeat_mode != REPEAT_ONE) {
if (!ci->loop_track()) {
Track_set_fade(&nsf_emu, Track_length( &nsf_emu, t ) - 4000, 4000);
}
if (multitrack) ci->set_elapsed(t*1000); /* t is track no to display */
@ -109,7 +109,7 @@ next_track:
ci->seek_complete();
/* Set fade again */
if (ci->global_settings->repeat_mode != REPEAT_ONE) {
if (!ci->loop_track()) {
Track_set_fade(&nsf_emu, Track_length( &nsf_emu, track ), 4000);
}
}

View file

@ -23,7 +23,7 @@ static void set_codec_track(int t) {
Sgc_start_track(&sgc_emu, t);
/* for REPEAT_ONE we disable track limits */
if (ci->global_settings->repeat_mode != REPEAT_ONE) {
if (!ci->loop_track()) {
Track_set_fade(&sgc_emu, Track_get_length( &sgc_emu, t ), 4000);
}
ci->set_elapsed(t*1000); /* t is track no to display */

View file

@ -477,7 +477,7 @@ static int play_track( void )
sampleswritten += WAV_CHUNK_SIZE;
/* is track timed? */
if (ci->global_settings->repeat_mode!=REPEAT_ONE && ci->id3->length) {
if (!ci->loop_track() && ci->id3->length) {
unsigned long curtime = sampleswritten*1000LL/SAMPLE_RATE;
unsigned long lasttimesample = (sampleswritten-WAV_CHUNK_SIZE);
@ -513,10 +513,10 @@ static int play_track( void )
spc_play_send_samples(samples);
if (ci->global_settings->repeat_mode!=REPEAT_ONE)
ci->set_elapsed(sampleswritten*1000LL/SAMPLE_RATE);
else
if (ci->loop_track())
ci->set_elapsed(0);
else
ci->set_elapsed(sampleswritten*1000LL/SAMPLE_RATE);
}
EXIT_TIMER(total);
@ -571,7 +571,7 @@ enum codec_status codec_run(void)
LoadID666(buffer+0x2e);
if (ci->global_settings->repeat_mode!=REPEAT_ONE && ID666.length==0) {
if (!ci->loop_track() && ID666.length==0) {
ID666.length=3*60*1000; /* 3 minutes */
ID666.fade=5*1000; /* 5 seconds */
}

View file

@ -105,7 +105,7 @@ enum codec_status codec_run(void)
Vgm_start_track(&vgm_emu);
/* for REPEAT_ONE we disable track limits */
if (ci->global_settings->repeat_mode != REPEAT_ONE) {
if (!ci->loop_track()) {
Track_set_fade(&vgm_emu, ci->id3->length - 4000, 4000);
}

View file

@ -505,6 +505,12 @@ static enum codec_command_action get_command(intptr_t *param)
(void)param;
}
/* Some codecs call this to determine whether they should loop. */
static bool loop_track(void)
{
return false;
}
static void set_offset(size_t value)
{
ci.id3->offset = value;
@ -561,6 +567,7 @@ static void init_ci(void)
ci.set_offset = set_offset;
ci.configure = configure;
ci.get_command = get_command;
ci.loop_track = loop_track;
/* --- "Core" functions --- */
@ -578,7 +585,6 @@ static void init_ci(void)
ci.memmove = rb->memmove;
ci.memcmp = rb->memcmp;
ci.memchr = rb->memchr;
ci.strcasestr = rb->strcasestr;
#if defined(DEBUG) || defined(SIMULATOR)
ci.debugf = rb->debugf;
#endif
@ -587,7 +593,6 @@ static void init_ci(void)
#endif
ci.qsort = rb->qsort;
ci.global_settings = rb->global_settings;
#ifdef RB_PROFILE
ci.profile_thread = rb->profile_thread;