summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorAndree Buschmann <AndreeBuschmann@t-online.de>2011-05-23 18:28:08 +0000
committerAndree Buschmann <AndreeBuschmann@t-online.de>2011-05-23 18:28:08 +0000
commit8767ba9a85761ad958e8e74af635ec1ba4eba8f3 (patch)
tree0d37acc7c3fbd19a6ed098baddaad5c1ab09428a /apps
parent645ffa9beb99df01b2698fd40264e1c97cae3cf2 (diff)
downloadrockbox-8767ba9a85761ad958e8e74af635ec1ba4eba8f3.tar.gz
rockbox-8767ba9a85761ad958e8e74af635ec1ba4eba8f3.tar.bz2
rockbox-8767ba9a85761ad958e8e74af635ec1ba4eba8f3.zip
Remove residual float operations from sid codec.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29919 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/codecs/sid.c36
1 files changed, 32 insertions, 4 deletions
diff --git a/apps/codecs/sid.c b/apps/codecs/sid.c
index a9ca457fb3..fed1e8acaa 100644
--- a/apps/codecs/sid.c
+++ b/apps/codecs/sid.c
@@ -67,6 +67,7 @@ CODEC_HEADER
#define CHUNK_SIZE (1024*2)
#define SID_BUFFER_SIZE 0x10000
+#define SAMPLE_RATE 44100
/* This codec supports SID Files:
*
@@ -157,8 +158,10 @@ struct sidflt {
int mixing_frequency IDATA_ATTR;
unsigned long freqmul IDATA_ATTR;
int filtmul IDATA_ATTR;
+#ifndef ROCKBOX
unsigned long attacks [16] IDATA_ATTR;
unsigned long releases[16] IDATA_ATTR;
+#endif
/* ------------------------------------------------------------ globals */
struct s6581 sid IDATA_ATTR;
@@ -187,6 +190,7 @@ static int internal_period, internal_order, internal_start, internal_end,
internal_add, internal_repeat_times, internal_repeat_start IDATA_ATTR;
/* ---------------------------------------------------------- constants */
+#ifndef ROCKBOX
static const float attackTimes[16] ICONST_ATTR =
{
0.0022528606, 0.0080099577, 0.0157696042, 0.0237795619,
@@ -200,7 +204,23 @@ static const float decayReleaseTimes[16] ICONST_ATTR =
0.169078356, 0.205199432, 0.240551975, 0.301266125, 0.750858245,
1.50171551, 2.40243682, 3.00189298, 9.00721405, 15.010998, 24.0182111
};
-
+#else
+#define DIV(X) ((int)(0x1000000 / (X * SAMPLE_RATE)))
+static const unsigned long attacks[16] ICONST_ATTR =
+{
+ DIV(0.0022528606), DIV(0.0080099577), DIV(0.0157696042), DIV(0.0237795619),
+ DIV(0.0372963655), DIV(0.0550684591), DIV(0.0668330845), DIV(0.0783473987),
+ DIV(0.0981219818), DIV(0.2445540210), DIV(0.4891080420), DIV(0.7824727420),
+ DIV(0.9777154610), DIV(2.9336470100), DIV(4.8890779300), DIV(7.8227249300)
+};
+static const unsigned long releases[16] ICONST_ATTR =
+{
+ DIV(0.00891777693), DIV(0.0245940510), DIV(0.0484185907), DIV(0.0730116639),
+ DIV(0.11451247500), DIV(0.1690783560), DIV(0.2051994320), DIV(0.2405519750),
+ DIV(0.30126612500), DIV(0.7508582450), DIV(1.5017155100), DIV(2.4024368200),
+ DIV(3.00189298000), DIV(9.0072140500), DIV(15.010998000), DIV(24.018211100)
+};
+#endif
static const int opcodes[256] ICONST_ATTR = {
_brk,ora,xxx,xxx,xxx,ora,asl,xxx,php,ora,asl,xxx,xxx,ora,asl,xxx,
bpl,ora,xxx,xxx,xxx,ora,asl,xxx,clc,ora,xxx,xxx,xxx,ora,asl,xxx,
@@ -246,10 +266,14 @@ static inline int quickfloat_ConvertFromInt(int i)
{
return (i<<16);
}
+#ifndef ROCKBOX
static inline int quickfloat_ConvertFromFloat(float f)
{
return (int)(f*(1<<16));
}
+#else
+#define quickfloat_ConvertFromFloat(X) (int)(X*(1<<16))
+#endif
static inline int quickfloat_Multiply(int a, int b)
{
return (a>>8)*(b>>8);
@@ -325,15 +349,19 @@ static inline int GenerateDigi(int sIn)
void synth_init(unsigned long mixfrq) ICODE_ATTR;
void synth_init(unsigned long mixfrq)
{
+#ifndef ROCKBOX
int i;
+#endif
mixing_frequency = mixfrq;
fracPos = 0;
freqmul = 15872000 / mixfrq;
filtmul = quickfloat_ConvertFromFloat(21.5332031f)/mixfrq;
+#ifndef ROCKBOX
for (i=0;i<16;i++) {
attacks [i]=(int) (0x1000000 / (attackTimes[i]*mixfrq));
releases[i]=(int) (0x1000000 / (decayReleaseTimes[i]*mixfrq));
}
+#endif
memset(&sid,0,sizeof(sid));
memset(osc,0,sizeof(osc));
memset(&filter,0,sizeof(filter));
@@ -1207,7 +1235,7 @@ enum codec_status codec_main(enum codec_entry_call_reason reason)
{
if (reason == CODEC_LOAD) {
/* Make use of 44.1khz */
- ci->configure(DSP_SWITCH_FREQUENCY, 44100);
+ ci->configure(DSP_SWITCH_FREQUENCY, SAMPLE_RATE);
/* Sample depth is 28 bit host endian */
ci->configure(DSP_SET_SAMPLE_DEPTH, 28);
/* Mono output */
@@ -1241,7 +1269,7 @@ enum codec_status codec_run(void)
return CODEC_ERROR;
}
- c64Init(44100);
+ c64Init(SAMPLE_RATE);
LoadSIDFromMemory(sidfile, &load_addr, &init_addr, &play_addr,
&subSongsMax, &subSong, &song_speed, (unsigned short)filesize);
sidPoke(24, 15); /* Turn on full volume */
@@ -1262,7 +1290,7 @@ enum codec_status codec_run(void)
/* New time is ready in param */
/* Start playing from scratch */
- c64Init(44100);
+ c64Init(SAMPLE_RATE);
LoadSIDFromMemory(sidfile, &load_addr, &init_addr, &play_addr,
&subSongsMax, &subSong, &song_speed, (unsigned short)filesize);
sidPoke(24, 15); /* Turn on full volume */