From d703389780f5c7a627bff3f6daf6d72e4547a9db Mon Sep 17 00:00:00 2001 From: Linus Nielsen Feltzing Date: Tue, 19 Nov 2002 21:07:44 +0000 Subject: [PATCH] More recording stability, plus some feedback git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2860 a1c6a512-1295-4272-9138-f99709370657 --- apps/recorder/recording.c | 50 +++++++++++++++++++++++++++++++++------ firmware/mpeg.c | 40 ++++++++++++++++++++++++------- firmware/mpeg.h | 1 + 3 files changed, 76 insertions(+), 15 deletions(-) diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c index 50d5982a62..491907666f 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 3226e250ac..dfd2785356 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 d4e9c486fd..34c898dbe4 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);