summaryrefslogtreecommitdiff
path: root/firmware/test
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-05-16 21:11:21 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-05-16 21:11:21 +0000
commit2f54401455ab5b27e134d6739e1ef4e5edcc4dbc (patch)
tree1966bdc5d8b3e6e6072f939d81a5f8fd6b0f8c38 /firmware/test
parenta2b049006067e47880fae51ff637d5c8021d1683 (diff)
downloadrockbox-2f54401455ab5b27e134d6739e1ef4e5edcc4dbc.zip
rockbox-2f54401455ab5b27e134d6739e1ef4e5edcc4dbc.tar.gz
rockbox-2f54401455ab5b27e134d6739e1ef4e5edcc4dbc.tar.bz2
rockbox-2f54401455ab5b27e134d6739e1ef4e5edcc4dbc.tar.xz
Added tone and volume control
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@605 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/test')
-rw-r--r--firmware/test/i2c/main.c144
1 files changed, 119 insertions, 25 deletions
diff --git a/firmware/test/i2c/main.c b/firmware/test/i2c/main.c
index 43d3ef3..34d3dc6 100644
--- a/firmware/test/i2c/main.c
+++ b/firmware/test/i2c/main.c
@@ -16,9 +16,13 @@
* KIND, either express or implied.
*
****************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
#include <stdbool.h>
+#include <string.h>
#include "i2c.h"
#include "mas.h"
+#include "dac.h"
#include "sh7034.h"
#include "system.h"
#include "debug.h"
@@ -44,6 +48,46 @@
#define MP3_LOW_WATER 0x30000
#define MP3_CHUNK_SIZE 0x20000
+unsigned int bass_table[] =
+{
+ 0,
+ 0x800, /* 1dB */
+ 0x10000, /* 2dB */
+ 0x17c00, /* 3dB */
+ 0x1f800, /* 4dB */
+ 0x27000, /* 5dB */
+ 0x2e400, /* 6dB */
+ 0x35800, /* 7dB */
+ 0x3c000, /* 8dB */
+ 0x42800, /* 9dB */
+ 0x48800, /* 10dB */
+ 0x4e400, /* 11dB */
+ 0x53800, /* 12dB */
+ 0x58800, /* 13dB */
+ 0x5d400, /* 14dB */
+ 0x61800 /* 15dB */
+};
+
+unsigned int treble_table[] =
+{
+ 0,
+ 0x5400, /* 1dB */
+ 0xac00, /* 2dB */
+ 0x10400, /* 3dB */
+ 0x16000, /* 4dB */
+ 0x1c000, /* 5dB */
+ 0x22400, /* 6dB */
+ 0x28400, /* 7dB */
+ 0x2ec00, /* 8dB */
+ 0x35400, /* 9dB */
+ 0x3c000, /* 10dB */
+ 0x42c00, /* 11dB */
+ 0x49c00, /* 12dB */
+ 0x51800, /* 13dB */
+ 0x58400, /* 14dB */
+ 0x5f800 /* 15dB */
+};
+
unsigned char fliptable[] =
{
0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
@@ -87,6 +131,9 @@ extern unsigned int stack[];
unsigned char *mp3buf = (unsigned char *)stack;
+char *tracks[100];
+int num_tracks;
+
int mp3buf_write;
int mp3buf_read;
int last_dma_chunk_size;
@@ -189,7 +236,7 @@ void dma_tick(void)
void bitswap(unsigned char *data, int length)
{
- unsigned int i;
+ int i;
for(i = 0;i < length;i++)
{
data[i] = fliptable[data[i]];
@@ -203,6 +250,9 @@ int main(void)
int i=0;
DIR *d;
struct dirent *dent;
+ char *tmp;
+ int volume, bass, treble;
+ unsigned short frame_count;
/* Clear it all! */
SSR1 &= ~(SCI_RDRF | SCI_ORER | SCI_PER | SCI_FER);
@@ -271,16 +321,36 @@ int main(void)
i = fat_mount(part[0].start);
debugf("fat_mount() returned %d\n", i);
-
+
+ num_tracks = 0;
if((d = opendir("/")))
{
while((dent = readdir(d)))
{
debugf("%s\n", dent->d_name);
+ i = strlen(dent->d_name);
+ tmp = dent->d_name + i - 4;
+ debugf("%s\n", tmp);
+ if(!stricmp(tmp, ".mp3"))
+ {
+ tmp = malloc(i+1);
+ if(tmp)
+ {
+ debugf("Adding track %s\n", dent->d_name);
+ snprintf(tmp, i+1, "/%s", dent->d_name);
+ tracks[num_tracks++] = tmp;
+ }
+ else
+ {
+ panicf("Out of memory\n");
+ }
+ }
}
closedir(d);
}
+ debugf("Number of tracks: %d\n");
+
queue_init(&mpeg_queue);
create_thread(mpeg_thread, stack - 0x2000, 0x4000);
@@ -290,10 +360,25 @@ int main(void)
debugf("let's play...\n");
queue_post(&mpeg_queue, MPEG_PLAY, 0);
+
+ volume = 0x2c;
+
+ if(dac_config(0x04) < 0)
+ debugf("DAC write failed\n");
+
+ if(dac_volume(volume) < 0)
+ debugf("DAC write failed\n");
+
+ bass = 12;
+ treble = 8;
+
+ mas_writereg(MAS_REG_KPRESCALE, 0xe9400);
+ mas_writereg(MAS_REG_KBASS, bass_table[bass]);
+ mas_writereg(MAS_REG_KTREBLE, treble_table[treble]);
while(1)
{
- sleep(HZ*1000);
+ sleep(HZ*4);
}
}
@@ -382,21 +467,24 @@ void IMIA1(void)
TSR1 &= ~0x01;
}
-char *tracks[] =
+int track_index = 0;
+char *peek_next_track(int index)
{
- "/machinae_supremacy_-_arcade.mp3"
-};
+ if(track_index < num_tracks)
+ return tracks[track_index+index];
+ else
+ return NULL;
+}
-char *peek_next_track(int index)
+void next_track(void)
{
- return tracks[index];
+ track_index++;
}
int mpeg_file = -1;
int new_file(void)
{
- int len;
char *trackname;
trackname = peek_next_track(0);
@@ -408,16 +496,6 @@ int new_file(void)
debugf("Couldn't open file\n");
return -1;
}
-
- /* First read in a few seconds worth of MP3 data */
- len = read(mpeg_file, mp3buf + mp3buf_write, MP3_CHUNK_SIZE);
-
- ata_spindown(-1);
-
- bitswap(mp3buf + mp3buf_write, len);
-
- mp3buf_write = len;
-
return 0;
}
@@ -427,7 +505,9 @@ void mpeg_thread(void)
int len;
int free_space_left;
int amount_to_read;
+ bool play_pending;
+ play_pending = false;
playing = false;
while(1)
@@ -438,6 +518,7 @@ void mpeg_thread(void)
{
case MPEG_PLAY:
/* Stop the current stream */
+ play_pending = false;
playing = false;
stop_dma();
@@ -449,10 +530,9 @@ void mpeg_thread(void)
filling = true;
queue_post(&mpeg_queue, MPEG_NEED_DATA, 0);
- playing = true;
-
- init_dma();
- start_dma();
+ /* Tell the file loading code that we want to start playing
+ as soon as we have some data */
+ play_pending = true;
break;
case MPEG_STOP:
@@ -475,7 +555,9 @@ void mpeg_thread(void)
case MPEG_NEED_DATA:
free_space_left = mp3buf_read - mp3buf_write;
- if(free_space_left < 0)
+
+ /* We interpret 0 as "empty buffer" */
+ if(free_space_left <= 0)
free_space_left = MP3BUF_LEN + free_space_left;
if(free_space_left <= MP3_CHUNK_SIZE)
@@ -509,6 +591,17 @@ void mpeg_thread(void)
/* Tell ourselves that we want more data */
queue_post(&mpeg_queue, MPEG_NEED_DATA, 0);
+
+ /* And while we're at it, see if we have startet playing
+ yet. If not, do it. */
+ if(play_pending)
+ {
+ play_pending = false;
+ playing = true;
+
+ init_dma();
+ start_dma();
+ }
}
else
{
@@ -517,7 +610,8 @@ void mpeg_thread(void)
/* Make sure that the write pointer is at a word
boundary */
mp3buf_write &= 0xfffffffe;
-
+
+ next_track();
if(new_file() < 0)
{
/* No more data to play */