1
0
Fork 0
forked from len0rd/rockbox

Added tone and volume control

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@605 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Linus Nielsen Feltzing 2002-05-16 21:11:21 +00:00
parent a2b0490060
commit 2f54401455

View file

@ -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[] =
{
"/machinae_supremacy_-_arcade.mp3"
};
int track_index = 0;
char *peek_next_track(int index)
{
return tracks[index];
if(track_index < num_tracks)
return tracks[track_index+index];
else
return NULL;
}
void next_track(void)
{
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 */