summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/codecs/codecs.make4
-rw-r--r--apps/codecs/libspc/spc_codec.h20
-rw-r--r--apps/codecs/libspc/spc_dsp.c21
-rw-r--r--apps/codecs/mod.c8
-rw-r--r--apps/codecs/mp3_enc.c18
5 files changed, 38 insertions, 33 deletions
diff --git a/apps/codecs/codecs.make b/apps/codecs/codecs.make
index 87ed5f2b40..f169ade798 100644
--- a/apps/codecs/codecs.make
+++ b/apps/codecs/codecs.make
@@ -41,8 +41,8 @@ include $(APPSDIR)/codecs/librm/librm.make
41include $(APPSDIR)/codecs/libatrac/libatrac.make 41include $(APPSDIR)/codecs/libatrac/libatrac.make
42 42
43# compile flags for codecs 43# compile flags for codecs
44CODECFLAGS = $(CFLAGS) -I$(APPSDIR)/codecs -I$(APPSDIR)/codecs/lib \ 44CODECFLAGS = $(filter-out -fno-strict-aliasing,$(CFLAGS)) -fstrict-aliasing \
45 -DCODEC 45 -I$(APPSDIR)/codecs -I$(APPSDIR)/codecs/lib -DCODEC
46 46
47ifndef SIMVER 47ifndef SIMVER
48 CODEC_LDS := $(APPSDIR)/plugins/plugin.lds # codecs and plugins use same file 48 CODEC_LDS := $(APPSDIR)/plugins/plugin.lds # codecs and plugins use same file
diff --git a/apps/codecs/libspc/spc_codec.h b/apps/codecs/libspc/spc_codec.h
index 923645b4aa..cf72f90af4 100644
--- a/apps/codecs/libspc/spc_codec.h
+++ b/apps/codecs/libspc/spc_codec.h
@@ -137,16 +137,15 @@ static inline void set_le16( void* p, unsigned n )
137} 137}
138 138
139#define GET_LE16( addr ) get_le16( addr ) 139#define GET_LE16( addr ) get_le16( addr )
140#define GET_LE16A( addr ) get_le16( addr )
140#define SET_LE16( addr, data ) set_le16( addr, data ) 141#define SET_LE16( addr, data ) set_le16( addr, data )
141#define INT16A( addr ) (*(uint16_t*) (addr)) 142#define INT16A( addr ) (*(uint16_t*) (addr))
142#define INT16SA( addr ) (*(int16_t*) (addr)) 143#define INT16SA( addr ) (*(int16_t*) (addr))
143 144
144#ifdef ROCKBOX_LITTLE_ENDIAN 145#ifdef ROCKBOX_LITTLE_ENDIAN
145 #define GET_LE16A( addr ) (*(uint16_t*) (addr))
146 #define GET_LE16SA( addr ) (*( int16_t*) (addr)) 146 #define GET_LE16SA( addr ) (*( int16_t*) (addr))
147 #define SET_LE16A( addr, data ) (void) (*(uint16_t*) (addr) = (data)) 147 #define SET_LE16A( addr, data ) (void) (*(uint16_t*) (addr) = (data))
148#else 148#else
149 #define GET_LE16A( addr ) get_le16 ( addr )
150 #define GET_LE16SA( addr ) get_le16s( addr ) 149 #define GET_LE16SA( addr ) get_le16s( addr )
151 #define SET_LE16A( addr, data ) set_le16 ( addr, data ) 150 #define SET_LE16A( addr, data ) set_le16 ( addr, data )
152#endif 151#endif
@@ -166,13 +165,22 @@ struct cpu_regs_t
166 uint8_t sp; 165 uint8_t sp;
167}; 166};
168 167
168struct src_dir
169{
170 uint16_t start;
171 uint16_t loop;
172};
173
169struct cpu_ram_t 174struct cpu_ram_t
170{ 175{
171 union { 176 union {
172 uint8_t padding1 [0x100]; 177 uint8_t padding1 [0x100];
173 uint16_t align; 178 uint16_t align;
174 } padding1 [1]; 179 } padding1 [1];
175 uint8_t ram [0x10000]; 180 union {
181 uint8_t ram [0x10000];
182 struct src_dir sd [0x10000/sizeof(struct src_dir)];
183 };
176 uint8_t padding2 [0x100]; 184 uint8_t padding2 [0x100];
177}; 185};
178 186
@@ -339,12 +347,6 @@ struct Spc_Dsp
339#endif 347#endif
340}; 348};
341 349
342struct src_dir
343{
344 char start [2];
345 char loop [2];
346};
347
348void DSP_run_( struct Spc_Dsp* this, long count, int32_t* out_buf ) ICODE_ATTR; 350void DSP_run_( struct Spc_Dsp* this, long count, int32_t* out_buf ) ICODE_ATTR;
349void DSP_reset( struct Spc_Dsp* this ); 351void DSP_reset( struct Spc_Dsp* this );
350 352
diff --git a/apps/codecs/libspc/spc_dsp.c b/apps/codecs/libspc/spc_dsp.c
index d1facf89a2..9ebd3e6353 100644
--- a/apps/codecs/libspc/spc_dsp.c
+++ b/apps/codecs/libspc/spc_dsp.c
@@ -77,12 +77,13 @@ static void decode_brr( struct Spc_Dsp* this, unsigned start_addr,
77 /* setup same variables as where decode_brr() is called from */ 77 /* setup same variables as where decode_brr() is called from */
78 #undef RAM 78 #undef RAM
79 #define RAM ram.ram 79 #define RAM ram.ram
80
80 struct src_dir const* const sd = 81 struct src_dir const* const sd =
81 (struct src_dir*) &RAM [this->r.g.wave_page * 0x100]; 82 &ram.sd[this->r.g.wave_page * 0x100/sizeof(struct src_dir)];
82 struct cache_entry_t* const wave_entry = 83 struct cache_entry_t* const wave_entry =
83 &this->wave_entry [raw_voice->waveform]; 84 &this->wave_entry [raw_voice->waveform];
84 85
85 /* the following block can be put in place of the call to 86 /* the following block can be put in place of the call to
86 decode_brr() below 87 decode_brr() below
87 */ 88 */
88 { 89 {
@@ -106,7 +107,7 @@ static void decode_brr( struct Spc_Dsp* this, unsigned start_addr,
106 wave_entry->start_addr = start_addr; 107 wave_entry->start_addr = start_addr;
107 108
108 uint8_t const* const loop_ptr = 109 uint8_t const* const loop_ptr =
109 RAM + GET_LE16A( sd [raw_voice->waveform].loop ); 110 RAM + letoh16(sd[raw_voice->waveform].loop);
110 short* loop_start = 0; 111 short* loop_start = 0;
111 112
112 short* out = BRRcache + start_addr * 2; 113 short* out = BRRcache + start_addr * 2;
@@ -251,7 +252,7 @@ static void key_on(struct Spc_Dsp* const this, struct voice_t* const voice,
251 voice->envx = 0; 252 voice->envx = 0;
252 voice->env_mode = state_attack; 253 voice->env_mode = state_attack;
253 voice->env_timer = env_rate_init; /* TODO: inaccurate? */ 254 voice->env_timer = env_rate_init; /* TODO: inaccurate? */
254 unsigned start_addr = GET_LE16A(sd [raw_voice->waveform].start); 255 unsigned start_addr = letoh16(sd[raw_voice->waveform].start);
255 #if !SPC_BRRCACHE 256 #if !SPC_BRRCACHE
256 { 257 {
257 voice->addr = RAM + start_addr; 258 voice->addr = RAM + start_addr;
@@ -331,9 +332,9 @@ void DSP_run_( struct Spc_Dsp* this, long count, int32_t* out_buf )
331 } 332 }
332 while ( (vbit >>= 1) != 0 ); 333 while ( (vbit >>= 1) != 0 );
333 } 334 }
334 335
335 struct src_dir const* const sd = 336 struct src_dir const* const sd =
336 (struct src_dir*) &RAM [this->r.g.wave_page * 0x100]; 337 &ram.sd[this->r.g.wave_page * 0x100/sizeof(struct src_dir)];
337 338
338 #ifdef ROCKBOX_BIG_ENDIAN 339 #ifdef ROCKBOX_BIG_ENDIAN
339 /* Convert endiannesses before entering loops - these 340 /* Convert endiannesses before entering loops - these
@@ -358,7 +359,7 @@ void DSP_run_( struct Spc_Dsp* this, long count, int32_t* out_buf )
358 const int echo_start = this->r.g.echo_page * 0x100; 359 const int echo_start = this->r.g.echo_page * 0x100;
359 #endif /* CPU_COLDFIRE */ 360 #endif /* CPU_COLDFIRE */
360 #else 361 #else
361 #define VOICE_RATE(x) (INT16A(raw_voice->rate) & 0x3FFF) 362 #define VOICE_RATE(x) (GET_LE16(raw_voice->rate) & 0x3FFF)
362 #define IF_RBE(...) 363 #define IF_RBE(...)
363 #endif /* ROCKBOX_BIG_ENDIAN */ 364 #endif /* ROCKBOX_BIG_ENDIAN */
364 365
@@ -590,7 +591,7 @@ void DSP_run_( struct Spc_Dsp* this, long count, int32_t* out_buf )
590 /* action based on previous block's header */ 591 /* action based on previous block's header */
591 if ( voice->block_header & 1 ) 592 if ( voice->block_header & 1 )
592 { 593 {
593 addr = RAM + GET_LE16A( sd [raw_voice->waveform].loop ); 594 addr = RAM + letoh16(sd[raw_voice->waveform].loop);
594 this->r.g.wave_ended |= vbit; 595 this->r.g.wave_ended |= vbit;
595 if ( !(voice->block_header & 2) ) /* 1% of the time */ 596 if ( !(voice->block_header & 2) ) /* 1% of the time */
596 { 597 {
diff --git a/apps/codecs/mod.c b/apps/codecs/mod.c
index 523e1c7d0b..cbeaf0837f 100644
--- a/apps/codecs/mod.c
+++ b/apps/codecs/mod.c
@@ -1097,16 +1097,16 @@ static inline int clip(int i)
1097 else return(i); 1097 else return(i);
1098} 1098}
1099 1099
1100STATICIRAM void synthrender(void *renderbuffer, int samplecount) ICODE_ATTR; 1100STATICIRAM void synthrender(int32_t *renderbuffer, int samplecount) ICODE_ATTR;
1101void synthrender(void *renderbuffer, int samplecount) 1101void synthrender(int32_t *renderbuffer, int samplecount)
1102{ 1102{
1103 /* 125bpm equals to 50Hz (= 0.02s) 1103 /* 125bpm equals to 50Hz (= 0.02s)
1104 * => one tick = mixingrate/50, 1104 * => one tick = mixingrate/50,
1105 * samples passing in one tick: 1105 * samples passing in one tick:
1106 * mixingrate/(bpm/2.5) = 2.5*mixingrate/bpm */ 1106 * mixingrate/(bpm/2.5) = 2.5*mixingrate/bpm */
1107 1107
1108 int *p_left = (int *) renderbuffer; /* int in rockbox */ 1108 int32_t *p_left = renderbuffer; /* int in rockbox */
1109 int *p_right = p_left+1; 1109 int32_t *p_right = p_left+1;
1110 signed short s; 1110 signed short s;
1111 int qf_distance, qf_distance2; 1111 int qf_distance, qf_distance2;
1112 1112
diff --git a/apps/codecs/mp3_enc.c b/apps/codecs/mp3_enc.c
index 82a8620027..18774ef456 100644
--- a/apps/codecs/mp3_enc.c
+++ b/apps/codecs/mp3_enc.c
@@ -2090,33 +2090,35 @@ STATICIRAM void to_mono_mm(void)
2090 /* |llllllllllllllll|rrrrrrrrrrrrrrrr| => 2090 /* |llllllllllllllll|rrrrrrrrrrrrrrrr| =>
2091 * |mmmmmmmmmmmmmmmm|mmmmmmmmmmmmmmmm| 2091 * |mmmmmmmmmmmmmmmm|mmmmmmmmmmmmmmmm|
2092 */ 2092 */
2093 uint32_t *samp = (uint32_t *)&mfbuf[2*512]; 2093 uint16_t *samp = &mfbuf[2*512];
2094 uint32_t *samp_end = samp + samp_per_frame; 2094 uint16_t *samp_end = samp + 2*samp_per_frame;
2095 2095
2096 inline void to_mono(uint32_t **samp) 2096 inline void to_mono(uint16_t **samp)
2097 { 2097 {
2098 int32_t lr = **samp; 2098 int16_t l = **samp;
2099 int16_t r = **(samp+1);
2099 int32_t m; 2100 int32_t m;
2100 2101
2101 switch(cfg.rec_mono_mode) 2102 switch(cfg.rec_mono_mode)
2102 { 2103 {
2103 case 1: 2104 case 1:
2104 /* mono = L */ 2105 /* mono = L */
2105 m = lr >> 16; 2106 m = l;
2106 break; 2107 break;
2107 case 2: 2108 case 2:
2108 /* mono = R */ 2109 /* mono = R */
2109 m = (int16_t)lr; 2110 m = r;
2110 break; 2111 break;
2111 case 0: 2112 case 0:
2112 default: 2113 default:
2113 /* mono = (L+R)/2 */ 2114 /* mono = (L+R)/2 */
2114 m = (int16_t)lr + (lr >> 16) + err; 2115 m = r + r + err;
2115 err = m & 1; 2116 err = m & 1;
2116 m >>= 1; 2117 m >>= 1;
2117 break; 2118 break;
2118 } 2119 }
2119 *(*samp)++ = (m << 16) | (uint16_t)m; 2120 *(*samp)++ = (uint16_t)m;
2121 *(*samp)++ = (uint16_t)m;
2120 } /* to_mono */ 2122 } /* to_mono */
2121 2123
2122 do 2124 do