From 2f54401455ab5b27e134d6739e1ef4e5edcc4dbc Mon Sep 17 00:00:00 2001 From: Linus Nielsen Feltzing Date: Thu, 16 May 2002 21:11:21 +0000 Subject: Added tone and volume control git-svn-id: svn://svn.rockbox.org/rockbox/trunk@605 a1c6a512-1295-4272-9138-f99709370657 --- firmware/test/i2c/main.c | 144 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 119 insertions(+), 25 deletions(-) (limited to 'firmware/test/i2c/main.c') diff --git a/firmware/test/i2c/main.c b/firmware/test/i2c/main.c index 43d3ef31d3..34d3dc68e2 100644 --- a/firmware/test/i2c/main.c +++ b/firmware/test/i2c/main.c @@ -16,9 +16,13 @@ * KIND, either express or implied. * ****************************************************************************/ +#include +#include #include +#include #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 */ -- cgit v1.2.3