summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorAndree Buschmann <AndreeBuschmann@t-online.de>2011-08-30 19:40:09 +0000
committerAndree Buschmann <AndreeBuschmann@t-online.de>2011-08-30 19:40:09 +0000
commite88d24a8407ee3fca32cf08399ce895c49c80fc0 (patch)
treec1f5b054ae0a80ab4b72f33547742577d34c48ec /apps
parente66ad3e8a86a19b9ef9480bc52766e61955f341d (diff)
downloadrockbox-e88d24a8407ee3fca32cf08399ce895c49c80fc0.tar.gz
rockbox-e88d24a8407ee3fca32cf08399ce895c49c80fc0.zip
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
Diffstat (limited to 'apps')
-rw-r--r--apps/codec_thread.c7
-rw-r--r--apps/codecs.c4
-rw-r--r--apps/codecs.h11
-rw-r--r--apps/codecs/adx.c2
-rw-r--r--apps/codecs/ay.c6
-rw-r--r--apps/codecs/gbs.c4
-rw-r--r--apps/codecs/hes.c4
-rw-r--r--apps/codecs/kss.c2
-rw-r--r--apps/codecs/nsf.c4
-rw-r--r--apps/codecs/sgc.c2
-rw-r--r--apps/codecs/spc.c10
-rw-r--r--apps/codecs/vgm.c2
-rw-r--r--apps/plugins/test_codec.c9
13 files changed, 38 insertions, 29 deletions
diff --git a/apps/codec_thread.c b/apps/codec_thread.c
index 199bb0e742..90cf07be9f 100644
--- a/apps/codec_thread.c
+++ b/apps/codec_thread.c
@@ -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;
}
diff --git a/apps/codecs.c b/apps/codecs.c
index cd4a9d50eb..93542e35ce 100644
--- a/apps/codecs.c
+++ b/apps/codecs.c
@@ -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,
diff --git a/apps/codecs.h b/apps/codecs.h
index dca655da2f..527c59ac9c 100644
--- a/apps/codecs.h
+++ b/apps/codecs.h
@@ -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);
diff --git a/apps/codecs/adx.c b/apps/codecs/adx.c
index 8144d5f468..cc7f0320be 100644
--- a/apps/codecs/adx.c
+++ b/apps/codecs/adx.c
@@ -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 {
diff --git a/apps/codecs/ay.c b/apps/codecs/ay.c
index 48261fbfb4..914ffa9803 100644
--- a/apps/codecs/ay.c
+++ b/apps/codecs/ay.c
@@ -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);
}
}
diff --git a/apps/codecs/gbs.c b/apps/codecs/gbs.c
index 5d3154911b..c9c3420683 100644
--- a/apps/codecs/gbs.c
+++ b/apps/codecs/gbs.c
@@ -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 */
diff --git a/apps/codecs/hes.c b/apps/codecs/hes.c
index 8c216ed060..c84134c01b 100644
--- a/apps/codecs/hes.c
+++ b/apps/codecs/hes.c
@@ -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 */
diff --git a/apps/codecs/kss.c b/apps/codecs/kss.c
index 62dd05551e..f519b3c706 100644
--- a/apps/codecs/kss.c
+++ b/apps/codecs/kss.c
@@ -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 */
diff --git a/apps/codecs/nsf.c b/apps/codecs/nsf.c
index 8899501e05..533972e110 100644
--- a/apps/codecs/nsf.c
+++ b/apps/codecs/nsf.c
@@ -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);
}
}
diff --git a/apps/codecs/sgc.c b/apps/codecs/sgc.c
index 2f1f3f88bc..993c606c7e 100644
--- a/apps/codecs/sgc.c
+++ b/apps/codecs/sgc.c
@@ -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 */
diff --git a/apps/codecs/spc.c b/apps/codecs/spc.c
index 3b007471a9..94ac9ffadc 100644
--- a/apps/codecs/spc.c
+++ b/apps/codecs/spc.c
@@ -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 */
}
diff --git a/apps/codecs/vgm.c b/apps/codecs/vgm.c
index 9c8619c7b8..9e4f88779c 100644
--- a/apps/codecs/vgm.c
+++ b/apps/codecs/vgm.c
@@ -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);
}
diff --git a/apps/plugins/test_codec.c b/apps/plugins/test_codec.c
index b1525ca30a..6b6ba00840 100644
--- a/apps/plugins/test_codec.c
+++ b/apps/plugins/test_codec.c
@@ -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;