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:
parent
e66ad3e8a8
commit
e88d24a840
13 changed files with 38 additions and 29 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue