summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-11-20 22:23:20 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-11-20 22:23:20 +0000
commit77d9c7cf8408fd4981588fd0f1ef6a2c52159079 (patch)
treed09b759305436ae451e4d6c3efcf6c649e4abae9
parentd5bb9a4e703c1044bcf83b163a41c56353d9178b (diff)
downloadrockbox-77d9c7cf8408fd4981588fd0f1ef6a2c52159079.zip
rockbox-77d9c7cf8408fd4981588fd0f1ef6a2c52159079.tar.gz
rockbox-77d9c7cf8408fd4981588fd0f1ef6a2c52159079.tar.bz2
rockbox-77d9c7cf8408fd4981588fd0f1ef6a2c52159079.tar.xz
More MAS voodoo resulting in more stable, maybe even working, recording
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2867 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/mpeg.c56
-rw-r--r--firmware/mpeg.h1
2 files changed, 45 insertions, 12 deletions
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index b834e5d..feb12ca 100644
--- a/firmware/mpeg.c
+++ b/firmware/mpeg.c
@@ -350,10 +350,10 @@ static bool playing = false;
#else
static int last_dma_tick = 0;
-#ifdef HAVE_MAS3507D
-
static unsigned long mas_version_code;
+#ifdef HAVE_MAS3507D
+
static unsigned int bass_table[] =
{
0x9e400, /* -15dB */
@@ -621,6 +621,7 @@ static void stop_dma(void)
long timing_info_index = 0;
long timing_info[1024];
bool inverted_pr;
+unsigned long num_rec_bytes;
#endif
static void dma_tick(void)
@@ -661,7 +662,6 @@ static void dma_tick(void)
PADR &= ~0x800;
/* It must take at least 5 cycles before the data is read */
-
mp3buf[mp3buf_write] = *(unsigned char *)0x4000000;
if(inverted_pr)
@@ -670,6 +670,7 @@ static void dma_tick(void)
PADR |= 0x800;
/* It must take at least 4 cycles before the next loop */
+ num_rec_bytes++;
mp3buf_write++;
if(mp3buf_write >= mp3buflen)
@@ -1623,6 +1624,7 @@ static void mpeg_thread(void)
demand_irq_enable(false);
if(mpeg_file >= 0)
close(mpeg_file);
+ mpeg_file = -1;
#if 0
{
@@ -1784,6 +1786,7 @@ static void init_recording(void)
/* Stop the current stream */
play_pending = false;
playing = false;
+ is_playing = false;
stop_dma();
reset_mp3_buffer();
@@ -1791,6 +1794,7 @@ static void init_recording(void)
if(mpeg_file >= 0)
close(mpeg_file);
+ mpeg_file = -1;
/* Init the recording variables */
recording = false;
@@ -1801,8 +1805,19 @@ static void init_recording(void)
mas_writemem(MAS_BANK_D0,0x7f6,&val,1);
do
{
- mas_readmem(MAS_BANK_D0, 0x7f6, &val, 1);
+ mas_readmem(MAS_BANK_D0, 0x7f7, &val, 1);
} while(val);
+
+ /* Perform black magic as described by the data sheet */
+ if((mas_version_code & 0xff) == 2)
+ {
+ DEBUGF("Performing MAS black magic for B2 version\n");
+ mas_writereg(0xa3, 0x98);
+ mas_writereg(0x94, 0xfffff);
+ val = 0;
+ mas_writemem(MAS_BANK_D1, 0, &val, 1);
+ mas_writereg(0xa3, 0x90);
+ }
/* Enable the Left A/D Converter */
mas_codec_writereg(0x0, 0xcccd);
@@ -1816,18 +1831,18 @@ static void init_recording(void)
/* No mute */
val = 0;
- mas_writemem(MAS_BANK_D0,0x7f9,&val,1);
+ mas_writemem(MAS_BANK_D0, 0x7f9, &val, 1);
/* Set Demand mode and validate all settings */
val = 0x25;
- mas_writemem(MAS_BANK_D0,0x7f1,&val,1);
+ mas_writemem(MAS_BANK_D0, 0x7f1, &val, 1);
/* Start the encoder application */
val = 0x40;
- mas_writemem(MAS_BANK_D0,0x7f6,&val,1);
+ mas_writemem(MAS_BANK_D0, 0x7f6, &val, 1);
do
{
- mas_readmem(MAS_BANK_D0, 0x7f6, &val, 1);
+ mas_readmem(MAS_BANK_D0, 0x7f7, &val, 1);
} while(!(val & 0x40));
mpeg_mode = MPEG_ENCODER;
@@ -1839,14 +1854,12 @@ static void init_playback(void)
{
unsigned long val;
- mpeg_mode = MPEG_DECODER;
-
/* Stop the current application */
val = 0;
mas_writemem(MAS_BANK_D0,0x7f6,&val,1);
do
{
- mas_readmem(MAS_BANK_D0, 0x7f6, &val, 1);
+ mas_readmem(MAS_BANK_D0, 0x7f7, &val, 1);
} while(val);
/* Enable the D/A Converter */
@@ -1867,6 +1880,12 @@ static void init_playback(void)
/* Start the Layer2/3 decoder applications */
val = 0x0c;
mas_writemem(MAS_BANK_D0,0x7f6,&val,1);
+ do
+ {
+ mas_readmem(MAS_BANK_D0, 0x7f7, &val, 1);
+ } while((val & 0x0c) != 0x0c);
+
+ mpeg_mode = MPEG_DECODER;
DEBUGF("MAS Decoding application started\n");
}
@@ -1875,7 +1894,8 @@ void mpeg_record(char *filename)
{
/* Read the current frame */
mas_readmem(MAS_BANK_D0, 0xfd0, &record_start_frame, 1);
-
+
+ num_rec_bytes = 0;
is_recording = true;
queue_post(&mpeg_queue, MPEG_RECORD, (void*)filename);
}
@@ -1902,6 +1922,14 @@ unsigned long mpeg_num_recorded_frames(void)
return 0;
}
}
+
+unsigned long mpeg_num_recorded_bytes(void)
+{
+ if(is_recording)
+ return num_rec_bytes;
+ else
+ return 0;
+}
#endif
void mpeg_play(int offset)
@@ -2502,6 +2530,10 @@ void mpeg_init(int volume, int bass, int treble, int balance, int loudness, int
if(rc < 0)
panicf("mas_ctrl_r: %d", rc);
+ mas_version_code = mas_readver();
+ DEBUGF("MAS3587 derivate %d, version B%d\n",
+ (mas_version_code & 0xff00) >> 8, mas_version_code & 0xff);
+
init_playback();
mpeg_sound_channel_config(MPEG_SOUND_STEREO);
diff --git a/firmware/mpeg.h b/firmware/mpeg.h
index 34c898d..cba5299 100644
--- a/firmware/mpeg.h
+++ b/firmware/mpeg.h
@@ -81,6 +81,7 @@ void mpeg_set_recording_options(int frequency, int quality,
int source, int channel_mode);
void mpeg_set_recording_gain(int left, int right, int mic);
unsigned long mpeg_num_recorded_frames(void);
+unsigned long mpeg_num_recorded_bytes(void);
#endif
void mpeg_get_debugdata(struct mpeg_debug *dbgdata);