summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThom Johansen <thomj@rockbox.org>2005-09-07 00:24:27 +0000
committerThom Johansen <thomj@rockbox.org>2005-09-07 00:24:27 +0000
commit735208a541df024f1cd3b9624054b6ed9724ad1e (patch)
tree01b8b91e8f473207553e2c94a5f6f00a6f60f3b4
parent4cd06c41f62c217681ec91557e89dc4461bab6d3 (diff)
downloadrockbox-735208a541df024f1cd3b9624054b6ed9724ad1e.tar.gz
rockbox-735208a541df024f1cd3b9624054b6ed9724ad1e.zip
Adapted codecs and DSP system to having MACSR saved in thread context.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7485 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/codecs/Tremor/vorbisfile.c19
-rw-r--r--apps/codecs/codec.h1
-rw-r--r--apps/codecs/liba52/parse.c2
-rw-r--r--apps/codecs/libmad/imdct_mcf5249.S1
-rw-r--r--apps/codecs/libmad/layer3.c2
-rw-r--r--apps/codecs/libmad/synth.c7
-rw-r--r--apps/codecs/libmusepack/mpc_decoder.c4
-rw-r--r--apps/codecs/libmusepack/synth_filter.c3
-rw-r--r--apps/codecs/mpa.c3
-rw-r--r--apps/dsp.c15
-rw-r--r--firmware/export/system.h17
11 files changed, 44 insertions, 30 deletions
diff --git a/apps/codecs/Tremor/vorbisfile.c b/apps/codecs/Tremor/vorbisfile.c
index 92f42a313b..70c0cdb24e 100644
--- a/apps/codecs/Tremor/vorbisfile.c
+++ b/apps/codecs/Tremor/vorbisfile.c
@@ -762,6 +762,12 @@ int ov_clear(OggVorbis_File *vf){
762 762
763int ov_open_callbacks(void *f,OggVorbis_File *vf,char *initial,long ibytes, 763int ov_open_callbacks(void *f,OggVorbis_File *vf,char *initial,long ibytes,
764 ov_callbacks callbacks){ 764 ov_callbacks callbacks){
765 #if defined(CPU_COLDFIRE) && !defined(SIMULATOR)
766 /* this seems to be the closest we get to an init function, let's init emac
767 here. rounding is disabled because of MULT31_SHIFT15, which will be
768 inaccurate with rounding in its current incarnation */
769 coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_SATURATE);
770 #endif
765 int ret=_ov_open1(f,vf,initial,ibytes,callbacks); 771 int ret=_ov_open1(f,vf,initial,ibytes,callbacks);
766 if(ret)return ret; 772 if(ret)return ret;
767 return _ov_open2(vf); 773 return _ov_open2(vf);
@@ -1287,15 +1293,12 @@ int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos){
1287int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos){ 1293int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos){
1288 ogg_packet op={0,0,0,0,0,0}; 1294 ogg_packet op={0,0,0,0,0,0};
1289 ogg_page og={0,0,0,0}; 1295 ogg_page og={0,0,0,0};
1296
1290 int thisblock,lastblock=0; 1297 int thisblock,lastblock=0;
1291 int ret=ov_pcm_seek_page(vf,pos); 1298 int ret=ov_pcm_seek_page(vf,pos);
1292 if(ret<0)return(ret); 1299 if(ret<0)return(ret);
1293 _make_decode_ready(vf); 1300 _make_decode_ready(vf);
1294 1301
1295#if defined(CPU_COLDFIRE) && !defined(SIMULATOR)
1296 mcf5249_init_mac();
1297#endif
1298
1299 /* discard leading packets we don't need for the lapping of the 1302 /* discard leading packets we don't need for the lapping of the
1300 position we want; don't decode them */ 1303 position we want; don't decode them */
1301 1304
@@ -1553,10 +1556,6 @@ long ov_read(OggVorbis_File *vf,char *buffer,int bytes_req,int *bitstream){
1553 1556
1554 if(vf->ready_state<OPENED)return(OV_EINVAL); 1557 if(vf->ready_state<OPENED)return(OV_EINVAL);
1555 1558
1556#if defined(CPU_COLDFIRE) && !defined(SIMULATOR)
1557 mcf5249_init_mac();
1558#endif
1559
1560 while(1){ 1559 while(1){
1561 if(vf->ready_state==INITSET){ 1560 if(vf->ready_state==INITSET){
1562 samples=vorbis_synthesis_pcmout(&vf->vd,&pcm); 1561 samples=vorbis_synthesis_pcmout(&vf->vd,&pcm);
@@ -1622,10 +1621,6 @@ long ov_read_fixed(OggVorbis_File *vf,ogg_int32_t ***pcm_channels,int length,
1622 int *bitstream){ 1621 int *bitstream){
1623 if(vf->ready_state<OPENED)return(OV_EINVAL); 1622 if(vf->ready_state<OPENED)return(OV_EINVAL);
1624 1623
1625#if CONFIG_CPU == MCF5249
1626 mcf5249_init_mac();
1627#endif
1628
1629 while(1){ 1624 while(1){
1630 if(vf->ready_state==INITSET){ 1625 if(vf->ready_state==INITSET){
1631 ogg_int32_t **pcm; 1626 ogg_int32_t **pcm;
diff --git a/apps/codecs/codec.h b/apps/codecs/codec.h
index c00d2bda95..0da653cf04 100644
--- a/apps/codecs/codec.h
+++ b/apps/codecs/codec.h
@@ -20,6 +20,7 @@
20/* Global declarations to be used in rockbox software codecs */ 20/* Global declarations to be used in rockbox software codecs */
21 21
22#include "config.h" 22#include "config.h"
23#include "system.h"
23 24
24#include <sys/types.h> 25#include <sys/types.h>
25 26
diff --git a/apps/codecs/liba52/parse.c b/apps/codecs/liba52/parse.c
index d5b323c701..9e7ed47d56 100644
--- a/apps/codecs/liba52/parse.c
+++ b/apps/codecs/liba52/parse.c
@@ -59,7 +59,7 @@ a52_state_t * a52_init (uint32_t mm_accel)
59 int i; 59 int i;
60 60
61 #if defined(CPU_COLDFIRE) && !defined(SIMULATOR) 61 #if defined(CPU_COLDFIRE) && !defined(SIMULATOR)
62 asm volatile ("move.l #0x30, %macsr"); /* frac. mode with rounding */ 62 coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_ROUND | EMAC_SATURATE);
63 #endif 63 #endif
64 /* 64 /*
65 this needs to come back if we ever want two decoder instances 65 this needs to come back if we ever want two decoder instances
diff --git a/apps/codecs/libmad/imdct_mcf5249.S b/apps/codecs/libmad/imdct_mcf5249.S
index 62b33c3f07..1afd910fa8 100644
--- a/apps/codecs/libmad/imdct_mcf5249.S
+++ b/apps/codecs/libmad/imdct_mcf5249.S
@@ -32,7 +32,6 @@ III_imdct_s:
32 * get more low bits out of the accext01 register _before_ doing the 32 * get more low bits out of the accext01 register _before_ doing the
33 * movclrs. 33 * movclrs.
34 */ 34 */
35 move.l #0xb0, %macsr /* frac mode, saturation, rounding */
36 sub.l %a0, %a0 /* clear loop variable */ 35 sub.l %a0, %a0 /* clear loop variable */
37.imdctloop: /* outer loop label */ 36.imdctloop: /* outer loop label */
38 lea.l imdct_s, %a1 /* load pointer to imdct coefs in a1 */ 37 lea.l imdct_s, %a1 /* load pointer to imdct coefs in a1 */
diff --git a/apps/codecs/libmad/layer3.c b/apps/codecs/libmad/layer3.c
index b5fa2be6f5..6d528ea52c 100644
--- a/apps/codecs/libmad/layer3.c
+++ b/apps/codecs/libmad/layer3.c
@@ -1775,8 +1775,6 @@ void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36])
1775 mad_fixed_t t[16]; 1775 mad_fixed_t t[16];
1776 /* assumes FRACBITS = 28 */ 1776 /* assumes FRACBITS = 28 */
1777 asm volatile ( 1777 asm volatile (
1778 "move.l #0xb0, %%d0\n\t" /* frac. mode, saturate, round */
1779 "move.l %%d0, %%macsr\n\t"
1780 "move.l (4*4, %[X]), %%d0\n\t" 1778 "move.l (4*4, %[X]), %%d0\n\t"
1781 "move.l #0x0ec835e8, %%d1\n\t" 1779 "move.l #0x0ec835e8, %%d1\n\t"
1782 "mac.l %%d0, %%d1, (13*4, %[X]), %%d0, %%acc0\n\t" 1780 "mac.l %%d0, %%d1, (13*4, %[X]), %%d0, %%acc0\n\t"
diff --git a/apps/codecs/libmad/synth.c b/apps/codecs/libmad/synth.c
index bdec4258fb..4315e239e8 100644
--- a/apps/codecs/libmad/synth.c
+++ b/apps/codecs/libmad/synth.c
@@ -42,6 +42,11 @@ void mad_synth_init(struct mad_synth *synth)
42 synth->pcm.samplerate = 0; 42 synth->pcm.samplerate = 0;
43 synth->pcm.channels = 0; 43 synth->pcm.channels = 0;
44 synth->pcm.length = 0; 44 synth->pcm.length = 0;
45 #if defined(CPU_COLDFIRE) && !defined(SIMULATOR)
46 /* init the emac unit here, since this function should always be called
47 before using libmad */
48 coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_SATURATE | EMAC_ROUND);
49 #endif
45} 50}
46 51
47/* 52/*
@@ -582,8 +587,6 @@ void synth_full(struct mad_synth *synth, struct mad_frame const *frame,
582 mad_fixed_t const (*Dptr)[32]; 587 mad_fixed_t const (*Dptr)[32];
583 mad_fixed64hi_t hi; 588 mad_fixed64hi_t hi;
584 589
585 asm volatile("move.l #0x20, %macsr"); /* fractional mode */
586
587 for (ch = 0; ch < nch; ++ch) { 590 for (ch = 0; ch < nch; ++ch) {
588 sbsample = &frame->sbsample[ch]; 591 sbsample = &frame->sbsample[ch];
589 filter = &synth->filter[ch]; 592 filter = &synth->filter[ch];
diff --git a/apps/codecs/libmusepack/mpc_decoder.c b/apps/codecs/libmusepack/mpc_decoder.c
index 0c8b8b76a7..a37dc4583c 100644
--- a/apps/codecs/libmusepack/mpc_decoder.c
+++ b/apps/codecs/libmusepack/mpc_decoder.c
@@ -1173,6 +1173,10 @@ void mpc_decoder_setup(mpc_decoder *d, mpc_reader *r)
1173 mpc_decoder_initialisiere_quantisierungstabellen(d, 1.0f); 1173 mpc_decoder_initialisiere_quantisierungstabellen(d, 1.0f);
1174 mpc_decoder_init_huffman_sv6(d); 1174 mpc_decoder_init_huffman_sv6(d);
1175 mpc_decoder_init_huffman_sv7(d); 1175 mpc_decoder_init_huffman_sv7(d);
1176
1177 #if defined(CPU_COLDFIRE)&& !defined(SIMULATOR)
1178 coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_ROUND | EMAC_SATURATE);
1179 #endif
1176} 1180}
1177 1181
1178static void mpc_decoder_set_streaminfo(mpc_decoder *d, mpc_streaminfo *si) 1182static void mpc_decoder_set_streaminfo(mpc_decoder *d, mpc_streaminfo *si)
diff --git a/apps/codecs/libmusepack/synth_filter.c b/apps/codecs/libmusepack/synth_filter.c
index 7644551d16..51ffcce921 100644
--- a/apps/codecs/libmusepack/synth_filter.c
+++ b/apps/codecs/libmusepack/synth_filter.c
@@ -335,9 +335,6 @@ static void Synthese_Filter_float_internal(MPC_SAMPLE_FORMAT * OutData,MPC_SAMPL
335{ 335{
336 mpc_uint32_t n; 336 mpc_uint32_t n;
337 337
338 #if defined(CPU_COLDFIRE) && !defined(SIMULATOR)
339 asm volatile ("move.l #0x20, %macsr"); /* fractional emac mode */
340 #endif
341 for ( n = 0; n < 36; n++, Y += 32 ) { 338 for ( n = 0; n < 36; n++, Y += 32 ) {
342 V -= 64; 339 V -= 64;
343 Calculate_New_V ( Y, V ); 340 Calculate_New_V ( Y, V );
diff --git a/apps/codecs/mpa.c b/apps/codecs/mpa.c
index 7beecd9edb..9970d57240 100644
--- a/apps/codecs/mpa.c
+++ b/apps/codecs/mpa.c
@@ -114,9 +114,6 @@ enum codec_status codec_start(struct codec_api* api)
114 ci->memset(&Synth, 0, sizeof(struct mad_synth)); 114 ci->memset(&Synth, 0, sizeof(struct mad_synth));
115 ci->memset(&Timer, 0, sizeof(mad_timer_t)); 115 ci->memset(&Timer, 0, sizeof(mad_timer_t));
116 116
117#if defined(CPU_COLDFIRE) && !defined(SIMULATOR)
118 mcf5249_init_mac();
119#endif
120 mad_stream_init(&Stream); 117 mad_stream_init(&Stream);
121 mad_frame_init(&Frame); 118 mad_frame_init(&Frame);
122 mad_synth_init(&Synth); 119 mad_synth_init(&Synth);
diff --git a/apps/dsp.c b/apps/dsp.c
index 8064a881a3..23b7ea548d 100644
--- a/apps/dsp.c
+++ b/apps/dsp.c
@@ -43,7 +43,6 @@
43 43
44#if defined(CPU_COLDFIRE) && !defined(SIMULATOR) 44#if defined(CPU_COLDFIRE) && !defined(SIMULATOR)
45 45
46#define INIT() asm volatile ("move.l #0xb0, %macsr") /* frac, round, clip */
47/* Multiply two S.31 fractional integers and return the sign bit and the 46/* Multiply two S.31 fractional integers and return the sign bit and the
48 * 31 most significant bits of the result. 47 * 31 most significant bits of the result.
49 */ 48 */
@@ -89,7 +88,6 @@
89 88
90#else 89#else
91 90
92#define INIT()
93#define FRACMUL(x, y) (long) (((((long long) (x)) * ((long long) (y))) >> 31)) 91#define FRACMUL(x, y) (long) (((((long long) (x)) * ((long long) (y))) >> 31))
94#define FRACMUL_8(x, y) (long) (((((long long) (x)) * ((long long) (y))) >> 23)) 92#define FRACMUL_8(x, y) (long) (((((long long) (x)) * ((long long) (y))) >> 23))
95#define FRACMUL_8_LOOP(x, y, s) \ 93#define FRACMUL_8_LOOP(x, y, s) \
@@ -492,11 +490,17 @@ long dsp_process(char* dst, char* src[], long size)
492 long factor; 490 long factor;
493 int samples; 491 int samples;
494 492
493 #if defined(CPU_COLDFIRE) && !defined(SIMULATOR)
494 /* set emac unit for dsp processing, and save old macsr, we're running in
495 codec thread context at this point, so can't clobber it */
496 unsigned long old_macsr = coldfire_get_macsr();
497 coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_ROUND | EMAC_SATURATE);
498 #endif
499
495 dsp = &dsp_conf[current_codec]; 500 dsp = &dsp_conf[current_codec];
496 501
497 factor = (dsp->stereo_mode != STEREO_MONO) ? 2 : 1; 502 factor = (dsp->stereo_mode != STEREO_MONO) ? 2 : 1;
498 size /= dsp->sample_bytes * factor; 503 size /= dsp->sample_bytes * factor;
499 INIT();
500 dsp_set_replaygain(false); 504 dsp_set_replaygain(false);
501 505
502 while (size > 0) 506 while (size > 0)
@@ -510,7 +514,10 @@ long dsp_process(char* dst, char* src[], long size)
510 dst += samples * sizeof(short) * 2; 514 dst += samples * sizeof(short) * 2;
511 yield(); 515 yield();
512 } 516 }
513 517 #if defined(CPU_COLDFIRE) && !defined(SIMULATOR)
518 /* set old macsr again */
519 coldfire_set_macsr(old_macsr);
520 #endif
514 return written * sizeof(short) * 2; 521 return written * sizeof(short) * 2;
515} 522}
516 523
diff --git a/firmware/export/system.h b/firmware/export/system.h
index 895b3f7529..07b7094615 100644
--- a/firmware/export/system.h
+++ b/firmware/export/system.h
@@ -125,8 +125,21 @@ enum {
125 : /* %0 */ "d"(mask), \ 125 : /* %0 */ "d"(mask), \
126 /* %1 */ "a"(address)) 126 /* %1 */ "a"(address))
127 127
128static inline void mcf5249_init_mac(void) { 128#define EMAC_ROUND 0x10
129 asm volatile ("move.l #0x20, %macsr;"); /* frac, truncate, no saturation */ 129#define EMAC_FRACTIONAL 0x20
130#define EMAC_SATURATE 0x80
131
132static inline void coldfire_set_macsr(const unsigned long flags)
133{
134 asm volatile ("move.l %0, %%macsr" : : "r" (flags));
135}
136
137static inline unsigned long coldfire_get_macsr(void)
138{
139 unsigned long m;
140
141 asm volatile ("move.l %%macsr, %0" : "=r" (m));
142 return m;
130} 143}
131 144
132#endif 145#endif