summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-11-19 21:07:44 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-11-19 21:07:44 +0000
commitd703389780f5c7a627bff3f6daf6d72e4547a9db (patch)
treefc7920b35b0219827c01d341eeea8d58244e0962
parent11055c04712a83000064888b253681e0d928b701 (diff)
downloadrockbox-d703389780f5c7a627bff3f6daf6d72e4547a9db.zip
rockbox-d703389780f5c7a627bff3f6daf6d72e4547a9db.tar.gz
rockbox-d703389780f5c7a627bff3f6daf6d72e4547a9db.tar.bz2
rockbox-d703389780f5c7a627bff3f6daf6d72e4547a9db.tar.xz
More recording stability, plus some feedback
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2860 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/recorder/recording.c50
-rw-r--r--firmware/mpeg.c40
-rw-r--r--firmware/mpeg.h1
3 files changed, 76 insertions, 15 deletions
diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c
index 50d5982..4919076 100644
--- a/apps/recorder/recording.c
+++ b/apps/recorder/recording.c
@@ -25,6 +25,7 @@
#include "system.h"
#include "lcd.h"
#include "mpeg.h"
+#include "mas.h"
#include "button.h"
#include "kernel.h"
#include "settings.h"
@@ -116,6 +117,18 @@ void adjust_cursor(void)
}
}
+#define BLINK_INTERVAL 2
+
+unsigned int frame_times[] =
+{
+ 2400, /* 48kHz */
+ 2612, /* 44.1kHz */
+ 3600, /* 32kHz */
+ 2400, /* 24kHz */
+ 2612, /* 22.05kHz */
+ 3200 /* 16kHz */
+};
+
bool recording_screen(void)
{
int button;
@@ -127,6 +140,10 @@ bool recording_screen(void)
int w, h;
int update_countdown = 1;
bool have_recorded = false;
+ bool blink_toggle = false;
+ unsigned long seconds;
+ unsigned long last_seconds = 0;
+ int hours, minutes;
cursor = 0;
mpeg_stop();
@@ -176,6 +193,7 @@ bool recording_screen(void)
mpeg_record("");
status_set_playmode(STATUS_RECORD);
update_countdown = 1; /* Update immediately */
+ last_seconds = 0;
}
break;
@@ -306,13 +324,31 @@ bool recording_screen(void)
{
timeout = current_tick + HZ/10;
+ seconds = mpeg_num_recorded_frames();
+ seconds *= frame_times[global_settings.rec_frequency];
+ seconds /= 100000;
+
update_countdown--;
- if(update_countdown == 0)
+ if(update_countdown == 0 || seconds > last_seconds)
{
- update_countdown = 10;
-
+ update_countdown = 5;
+ last_seconds = seconds;
+
lcd_clear_display();
- peak_meter_draw(0, 8 + h, LCD_WIDTH, h);
+
+ if(mpeg_status() & MPEG_STATUS_RECORD)
+ {
+ blink_toggle = blink_toggle?false:true;
+ if(blink_toggle)
+ lcd_puts(0, 0, "Recording");
+ }
+
+ hours = seconds / 3600;
+ minutes = (seconds - (hours * 3600)) / 60;
+ snprintf(buf, 32, "%02d:%02d:%02d",
+ hours, minutes, seconds%60);
+ lcd_puts(0, 1, buf);
+ peak_meter_draw(0, 8 + h*2, LCD_WIDTH, h);
/* Show mic gain if input source is Mic */
if(global_settings.rec_source == 0)
@@ -363,9 +399,9 @@ bool recording_screen(void)
}
else
{
- lcd_clearrect(0, 8 + h, LCD_WIDTH, h);
- peak_meter_draw(0, 8 + h, LCD_WIDTH, h);
- lcd_update_rect(0, 8 + h, LCD_WIDTH, h);
+ lcd_clearrect(0, 8 + h*2, LCD_WIDTH, h);
+ peak_meter_draw(0, 8 + h*2, LCD_WIDTH, h);
+ lcd_update_rect(0, 8 + h*2, LCD_WIDTH, h);
}
lcd_update();
}
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index 3226e25..dfd2785 100644
--- a/firmware/mpeg.c
+++ b/firmware/mpeg.c
@@ -473,6 +473,7 @@ static int lowest_watermark_level; /* Debug value to observe the buffer
bool recording; /* We are recording */
static bool is_recording; /* We are (attempting to) record */
bool stop_pending;
+unsigned long record_start_frame; /* Frame number where recording started */
#endif
static int mpeg_file;
@@ -646,7 +647,7 @@ static void dma_tick(void)
{
int i;
int num_bytes = 0;
- if(recording && (PBDR & 0x4000))
+ if(is_recording && (PBDR & 0x4000))
{
#ifdef DEBUG
timing_info[timing_info_index++] = current_tick;
@@ -1589,8 +1590,6 @@ static void mpeg_thread(void)
}
else
{
- int i;
-
yield();
if(!queue_empty(&mpeg_queue))
{
@@ -1625,13 +1624,19 @@ static void mpeg_thread(void)
if(mpeg_file >= 0)
close(mpeg_file);
- for(i = 0;i < 512;i++)
+#if 0
{
- DEBUGF("%d - %d us (%d bytes)\n", timing_info[i*2],
- (timing_info[i*2+1] & 0xffff) *
- 10000 / 13824,
- timing_info[i*2+1] >> 16);
+ int i;
+ for(i = 0;i < 512;i++)
+ {
+ DEBUGF("%d - %d us (%d bytes)\n",
+ timing_info[i*2],
+ (timing_info[i*2+1] & 0xffff) *
+ 10000 / 13824,
+ timing_info[i*2+1] >> 16);
+ }
}
+#endif
break;
case MPEG_SAVE_DATA:
@@ -1862,6 +1867,9 @@ static void init_playback(void)
void mpeg_record(char *filename)
{
+ /* Read the current frame */
+ mas_readmem(MAS_BANK_D0, 0xfd0, &record_start_frame, 1);
+
is_recording = true;
queue_post(&mpeg_queue, MPEG_RECORD, (void*)filename);
}
@@ -1872,6 +1880,22 @@ static void start_recording(void)
stop_pending = false;
}
+unsigned long mpeg_num_recorded_frames(void)
+{
+ unsigned long val;
+
+ if(is_recording)
+ {
+ /* Read the current frame */
+ mas_readmem(MAS_BANK_D0, 0xfd0, &val, 1);
+
+ return val - record_start_frame;
+ }
+ else
+ {
+ return 0;
+ }
+}
#endif
void mpeg_play(int offset)
diff --git a/firmware/mpeg.h b/firmware/mpeg.h
index d4e9c48..34c898d 100644
--- a/firmware/mpeg.h
+++ b/firmware/mpeg.h
@@ -80,6 +80,7 @@ void mpeg_record(char *filename);
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);
#endif
void mpeg_get_debugdata(struct mpeg_debug *dbgdata);