summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 @@
30#include "buffering.h" 30#include "buffering.h"
31#include "dsp.h" 31#include "dsp.h"
32#include "metadata.h" 32#include "metadata.h"
33#include "settings.h"
33 34
34/* Define LOGF_ENABLE to enable logf output in this file */ 35/* Define LOGF_ENABLE to enable logf output in this file */
35/*#define LOGF_ENABLE*/ 36/*#define LOGF_ENABLE*/
@@ -405,6 +406,11 @@ static enum codec_command_action
405 } 406 }
406} 407}
407 408
409static bool codec_loop_track_callback(void)
410{
411 return global_settings.repeat_mode == REPEAT_ONE;
412}
413
408/* Initialize codec API */ 414/* Initialize codec API */
409void codec_init_codec_api(void) 415void codec_init_codec_api(void)
410{ 416{
@@ -421,6 +427,7 @@ void codec_init_codec_api(void)
421 ci.set_offset = audio_codec_update_offset; 427 ci.set_offset = audio_codec_update_offset;
422 ci.configure = codec_configure_callback; 428 ci.configure = codec_configure_callback;
423 ci.get_command = codec_get_command_callback; 429 ci.get_command = codec_get_command_callback;
430 ci.loop_track = codec_loop_track_callback;
424} 431}
425 432
426 433
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 @@
50#include "sound.h" 50#include "sound.h"
51#include "splash.h" 51#include "splash.h"
52#include "general.h" 52#include "general.h"
53#include "rbpaths.h"
53 54
54#define LOGF_ENABLE 55#define LOGF_ENABLE
55#include "logf.h" 56#include "logf.h"
@@ -97,6 +98,7 @@ struct codec_api ci = {
97 NULL, /* set_offset */ 98 NULL, /* set_offset */
98 NULL, /* configure */ 99 NULL, /* configure */
99 NULL, /* get_command */ 100 NULL, /* get_command */
101 NULL, /* loop_track */
100 102
101 /* kernel/ system */ 103 /* kernel/ system */
102#if defined(CPU_ARM) && CONFIG_PLATFORM & PLATFORM_NATIVE 104#if defined(CPU_ARM) && CONFIG_PLATFORM & PLATFORM_NATIVE
@@ -127,7 +129,6 @@ struct codec_api ci = {
127 memmove, 129 memmove,
128 memcmp, 130 memcmp,
129 memchr, 131 memchr,
130 strcasestr,
131#if defined(DEBUG) || defined(SIMULATOR) 132#if defined(DEBUG) || defined(SIMULATOR)
132 debugf, 133 debugf,
133#endif 134#endif
@@ -136,7 +137,6 @@ struct codec_api ci = {
136#endif 137#endif
137 138
138 (qsort_func)qsort, 139 (qsort_func)qsort,
139 &global_settings,
140 140
141#ifdef RB_PROFILE 141#ifdef RB_PROFILE
142 profile_thread, 142 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 @@
44#endif 44#endif
45#include "dsp.h" 45#include "dsp.h"
46#endif 46#endif
47#include "settings.h"
48 47
49#include "gcc_extensions.h" 48#include "gcc_extensions.h"
50#include "load_code.h" 49#include "load_code.h"
@@ -75,12 +74,12 @@
75#define CODEC_ENC_MAGIC 0x52454E43 /* RENC */ 74#define CODEC_ENC_MAGIC 0x52454E43 /* RENC */
76 75
77/* increase this every time the api struct changes */ 76/* increase this every time the api struct changes */
78#define CODEC_API_VERSION 42 77#define CODEC_API_VERSION 43
79 78
80/* update this to latest version if a change to the api struct breaks 79/* update this to latest version if a change to the api struct breaks
81 backwards compatibility (and please take the opportunity to sort in any 80 backwards compatibility (and please take the opportunity to sort in any
82 new function which are "waiting" at the end of the function table) */ 81 new function which are "waiting" at the end of the function table) */
83#define CODEC_MIN_API_VERSION 42 82#define CODEC_MIN_API_VERSION 43
84 83
85/* reasons for calling codec main entrypoint */ 84/* reasons for calling codec main entrypoint */
86enum codec_entry_call_reason { 85enum codec_entry_call_reason {
@@ -145,6 +144,8 @@ struct codec_api {
145 void (*configure)(int setting, intptr_t value); 144 void (*configure)(int setting, intptr_t value);
146 /* Obtain command action on what to do next */ 145 /* Obtain command action on what to do next */
147 enum codec_command_action (*get_command)(intptr_t *param); 146 enum codec_command_action (*get_command)(intptr_t *param);
147 /* Determine whether the track should be looped, if applicable. */
148 bool (*loop_track)(void);
148 149
149 /* kernel/ system */ 150 /* kernel/ system */
150#if defined(CPU_ARM) && CONFIG_PLATFORM & PLATFORM_NATIVE 151#if defined(CPU_ARM) && CONFIG_PLATFORM & PLATFORM_NATIVE
@@ -180,7 +181,6 @@ struct codec_api {
180 void* (*memmove)(void *out, const void *in, size_t n); 181 void* (*memmove)(void *out, const void *in, size_t n);
181 int (*memcmp)(const void *s1, const void *s2, size_t n); 182 int (*memcmp)(const void *s1, const void *s2, size_t n);
182 void *(*memchr)(const void *s1, int c, size_t n); 183 void *(*memchr)(const void *s1, int c, size_t n);
183 char *(*strcasestr) (const char* phaystack, const char* pneedle);
184 184
185#if defined(DEBUG) || defined(SIMULATOR) 185#if defined(DEBUG) || defined(SIMULATOR)
186 void (*debugf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2); 186 void (*debugf)(const char *fmt, ...) ATTRIBUTE_PRINTF(1, 2);
@@ -193,9 +193,6 @@ struct codec_api {
193 void (*qsort)(void *base, size_t nmemb, size_t size, 193 void (*qsort)(void *base, size_t nmemb, size_t size,
194 int(*compar)(const void *, const void *)); 194 int(*compar)(const void *, const void *));
195 195
196 /* The ADX codec accesses global_settings to test for REPEAT_ONE mode */
197 struct user_settings* global_settings;
198
199#ifdef RB_PROFILE 196#ifdef RB_PROFILE
200 void (*profile_thread)(void); 197 void (*profile_thread)(void);
201 void (*profstop)(void); 198 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)
239 if (bufoff > end_adr-18*channels && looping) { 239 if (bufoff > end_adr-18*channels && looping) {
240 DEBUGF("ADX: loop!\n"); 240 DEBUGF("ADX: loop!\n");
241 /* check for endless looping */ 241 /* check for endless looping */
242 if (ci->global_settings->repeat_mode==REPEAT_ONE) { 242 if (ci->loop_track()) {
243 loop_count=0; 243 loop_count=0;
244 fade_count = -1; /* disable fade */ 244 fade_count = -1; /* disable fade */
245 } else { 245 } 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;
17static void set_codec_track(int t, int multitrack) { 17static void set_codec_track(int t, int multitrack) {
18 Ay_start_track(&ay_emu, t); 18 Ay_start_track(&ay_emu, t);
19 19
20 /* for REPEAT_ONE we disable track limits */ 20 /* for loop mode we disable track limits */
21 if (ci->global_settings->repeat_mode != REPEAT_ONE) { 21 if (!ci->loop_track()) {
22 Track_set_fade(&ay_emu, Track_get_length( &ay_emu, t ) - 4000, 4000); 22 Track_set_fade(&ay_emu, Track_get_length( &ay_emu, t ) - 4000, 4000);
23 } 23 }
24 if (multitrack) ci->set_elapsed(t*1000); /* t is track no to display */ 24 if (multitrack) ci->set_elapsed(t*1000); /* t is track no to display */
@@ -111,7 +111,7 @@ next_track:
111 ci->seek_complete(); 111 ci->seek_complete();
112 112
113 /* Set fade again */ 113 /* Set fade again */
114 if (ci->global_settings->repeat_mode != REPEAT_ONE) { 114 if (!ci->loop_track()) {
115 Track_set_fade(&ay_emu, Track_get_length( &ay_emu, track ) - 4000, 4000); 115 Track_set_fade(&ay_emu, Track_get_length( &ay_emu, track ) - 4000, 4000);
116 } 116 }
117 } 117 }
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;
17static void set_codec_track(int t) { 17static void set_codec_track(int t) {
18 Gbs_start_track(&gbs_emu, t); 18 Gbs_start_track(&gbs_emu, t);
19 19
20 /* for REPEAT_ONE we disable track limits */ 20 /* for loop mode we disable track limits */
21 if (ci->global_settings->repeat_mode != REPEAT_ONE) { 21 if (!ci->loop_track()) {
22 Track_set_fade(&gbs_emu, Track_get_length( &gbs_emu, t ), 4000); 22 Track_set_fade(&gbs_emu, Track_get_length( &gbs_emu, t ), 4000);
23 } 23 }
24 ci->set_elapsed(t*1000); /* t is track no to display */ 24 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;
17static void set_codec_track(int t) { 17static void set_codec_track(int t) {
18 Hes_start_track(&hes_emu, t); 18 Hes_start_track(&hes_emu, t);
19 19
20 /* for REPEAT_ONE we disable track limits */ 20 /* for loop mode we disable track limits */
21 if (ci->global_settings->repeat_mode != REPEAT_ONE) { 21 if (!ci->loop_track()) {
22 Track_set_fade(&hes_emu, Track_get_length( &hes_emu, t ), 4000); 22 Track_set_fade(&hes_emu, Track_get_length( &hes_emu, t ), 4000);
23 } 23 }
24 ci->set_elapsed(t*1000); /* t is track no to display */ 24 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) {
18 Kss_start_track(&kss_emu, t); 18 Kss_start_track(&kss_emu, t);
19 19
20 /* for REPEAT_ONE we disable track limits */ 20 /* for REPEAT_ONE we disable track limits */
21 if (ci->global_settings->repeat_mode != REPEAT_ONE) { 21 if (!ci->loop_track()) {
22 Track_set_fade(&kss_emu, Track_get_length( &kss_emu, t ), 4000); 22 Track_set_fade(&kss_emu, Track_get_length( &kss_emu, t ), 4000);
23 } 23 }
24 ci->set_elapsed(t*1000); /* t is track no to display */ 24 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) {
20 Nsf_start_track(&nsf_emu, t); 20 Nsf_start_track(&nsf_emu, t);
21 21
22 /* for REPEAT_ONE we disable track limits */ 22 /* for REPEAT_ONE we disable track limits */
23 if (ci->global_settings->repeat_mode != REPEAT_ONE) { 23 if (!ci->loop_track()) {
24 Track_set_fade(&nsf_emu, Track_length( &nsf_emu, t ) - 4000, 4000); 24 Track_set_fade(&nsf_emu, Track_length( &nsf_emu, t ) - 4000, 4000);
25 } 25 }
26 if (multitrack) ci->set_elapsed(t*1000); /* t is track no to display */ 26 if (multitrack) ci->set_elapsed(t*1000); /* t is track no to display */
@@ -109,7 +109,7 @@ next_track:
109 ci->seek_complete(); 109 ci->seek_complete();
110 110
111 /* Set fade again */ 111 /* Set fade again */
112 if (ci->global_settings->repeat_mode != REPEAT_ONE) { 112 if (!ci->loop_track()) {
113 Track_set_fade(&nsf_emu, Track_length( &nsf_emu, track ), 4000); 113 Track_set_fade(&nsf_emu, Track_length( &nsf_emu, track ), 4000);
114 } 114 }
115 } 115 }
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) {
23 Sgc_start_track(&sgc_emu, t); 23 Sgc_start_track(&sgc_emu, t);
24 24
25 /* for REPEAT_ONE we disable track limits */ 25 /* for REPEAT_ONE we disable track limits */
26 if (ci->global_settings->repeat_mode != REPEAT_ONE) { 26 if (!ci->loop_track()) {
27 Track_set_fade(&sgc_emu, Track_get_length( &sgc_emu, t ), 4000); 27 Track_set_fade(&sgc_emu, Track_get_length( &sgc_emu, t ), 4000);
28 } 28 }
29 ci->set_elapsed(t*1000); /* t is track no to display */ 29 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 )
477 sampleswritten += WAV_CHUNK_SIZE; 477 sampleswritten += WAV_CHUNK_SIZE;
478 478
479 /* is track timed? */ 479 /* is track timed? */
480 if (ci->global_settings->repeat_mode!=REPEAT_ONE && ci->id3->length) { 480 if (!ci->loop_track() && ci->id3->length) {
481 unsigned long curtime = sampleswritten*1000LL/SAMPLE_RATE; 481 unsigned long curtime = sampleswritten*1000LL/SAMPLE_RATE;
482 unsigned long lasttimesample = (sampleswritten-WAV_CHUNK_SIZE); 482 unsigned long lasttimesample = (sampleswritten-WAV_CHUNK_SIZE);
483 483
@@ -513,10 +513,10 @@ static int play_track( void )
513 513
514 spc_play_send_samples(samples); 514 spc_play_send_samples(samples);
515 515
516 if (ci->global_settings->repeat_mode!=REPEAT_ONE) 516 if (ci->loop_track())
517 ci->set_elapsed(sampleswritten*1000LL/SAMPLE_RATE);
518 else
519 ci->set_elapsed(0); 517 ci->set_elapsed(0);
518 else
519 ci->set_elapsed(sampleswritten*1000LL/SAMPLE_RATE);
520 } 520 }
521 521
522 EXIT_TIMER(total); 522 EXIT_TIMER(total);
@@ -571,7 +571,7 @@ enum codec_status codec_run(void)
571 571
572 LoadID666(buffer+0x2e); 572 LoadID666(buffer+0x2e);
573 573
574 if (ci->global_settings->repeat_mode!=REPEAT_ONE && ID666.length==0) { 574 if (!ci->loop_track() && ID666.length==0) {
575 ID666.length=3*60*1000; /* 3 minutes */ 575 ID666.length=3*60*1000; /* 3 minutes */
576 ID666.fade=5*1000; /* 5 seconds */ 576 ID666.fade=5*1000; /* 5 seconds */
577 } 577 }
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)
105 Vgm_start_track(&vgm_emu); 105 Vgm_start_track(&vgm_emu);
106 106
107 /* for REPEAT_ONE we disable track limits */ 107 /* for REPEAT_ONE we disable track limits */
108 if (ci->global_settings->repeat_mode != REPEAT_ONE) { 108 if (!ci->loop_track()) {
109 Track_set_fade(&vgm_emu, ci->id3->length - 4000, 4000); 109 Track_set_fade(&vgm_emu, ci->id3->length - 4000, 4000);
110 } 110 }
111 111
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)
505 (void)param; 505 (void)param;
506} 506}
507 507
508/* Some codecs call this to determine whether they should loop. */
509static bool loop_track(void)
510{
511 return false;
512}
513
508static void set_offset(size_t value) 514static void set_offset(size_t value)
509{ 515{
510 ci.id3->offset = value; 516 ci.id3->offset = value;
@@ -561,6 +567,7 @@ static void init_ci(void)
561 ci.set_offset = set_offset; 567 ci.set_offset = set_offset;
562 ci.configure = configure; 568 ci.configure = configure;
563 ci.get_command = get_command; 569 ci.get_command = get_command;
570 ci.loop_track = loop_track;
564 571
565 /* --- "Core" functions --- */ 572 /* --- "Core" functions --- */
566 573
@@ -578,7 +585,6 @@ static void init_ci(void)
578 ci.memmove = rb->memmove; 585 ci.memmove = rb->memmove;
579 ci.memcmp = rb->memcmp; 586 ci.memcmp = rb->memcmp;
580 ci.memchr = rb->memchr; 587 ci.memchr = rb->memchr;
581 ci.strcasestr = rb->strcasestr;
582#if defined(DEBUG) || defined(SIMULATOR) 588#if defined(DEBUG) || defined(SIMULATOR)
583 ci.debugf = rb->debugf; 589 ci.debugf = rb->debugf;
584#endif 590#endif
@@ -587,7 +593,6 @@ static void init_ci(void)
587#endif 593#endif
588 594
589 ci.qsort = rb->qsort; 595 ci.qsort = rb->qsort;
590 ci.global_settings = rb->global_settings;
591 596
592#ifdef RB_PROFILE 597#ifdef RB_PROFILE
593 ci.profile_thread = rb->profile_thread; 598 ci.profile_thread = rb->profile_thread;