From b8ff5f8971616f4b25c02cc79d9644d7df70d5c2 Mon Sep 17 00:00:00 2001 From: Linus Nielsen Feltzing Date: Thu, 5 Dec 2002 13:09:51 +0000 Subject: [PATCH] Added MP3 buffer margin setting git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2939 a1c6a512-1295-4272-9138-f99709370657 --- apps/debug_menu.c | 5 +++-- apps/lang/english.lang | 5 +++++ apps/settings.c | 10 ++++++++-- apps/settings.h | 1 + apps/settings_menu.c | 8 ++++++++ firmware/mpeg.c | 9 ++++++++- firmware/mpeg.h | 1 + 7 files changed, 34 insertions(+), 5 deletions(-) diff --git a/apps/debug_menu.c b/apps/debug_menu.c index e55aa12111..76c8662d92 100644 --- a/apps/debug_menu.c +++ b/apps/debug_menu.c @@ -174,10 +174,11 @@ bool dbg_mpeg_thread(void) percent = d.unplayed_space * 100 / d.mp3buflen; progressbar(0, 6*8, 112, 4, percent, Grow_Right); - percent = MPEG_LOW_WATER * 100 / d.mp3buflen; + percent = d.low_watermark_level * 100 / d.mp3buflen; progressbar(0, 6*8+4, 112, 4, percent, Grow_Right); - snprintf(buf, sizeof(buf), "lowest: %x", d.lowest_watermark_level); + snprintf(buf, sizeof(buf), "wm: %x - %x", + d.low_watermark_level, d.lowest_watermark_level); lcd_puts(0, 7, buf); lcd_update(); diff --git a/apps/lang/english.lang b/apps/lang/english.lang index af1d812743..6f44947460 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -1171,3 +1171,8 @@ id: LANG_SLEEP_TIMER desc: sleep timer setting eng: "Sleep timer" new: + +id: LANG_MP3BUFFER_MARGIN +desc: MP3 buffer margin time +eng: "MP3 buffer margin" +new: diff --git a/apps/settings.c b/apps/settings.c index cd838b9627..2c97e20ba1 100644 --- a/apps/settings.c +++ b/apps/settings.c @@ -105,7 +105,7 @@ offset abs 0x22 0x36 0x23 0x37 0x24 0x38 -0x25 0x39 +0x25 0x39 0x26 0x40 0x27 0x41 0x28 0x42 @@ -344,7 +344,9 @@ int settings_save( void ) ((global_settings.rec_frequency & 7) << 5)); config_block[0x23] = (unsigned char)global_settings.rec_left_gain; config_block[0x24] = (unsigned char)global_settings.rec_right_gain; - config_block[0x25] = (unsigned char)global_settings.disk_poweroff & 1; + config_block[0x25] = (unsigned char) + ((global_settings.disk_poweroff & 1) | + ((global_settings.buffer_margin & 7) << 1)); { static long lasttime = 0; @@ -618,7 +620,10 @@ void settings_load(void) global_settings.rec_right_gain = config_block[0x24] & 0x0f; if (config_block[0x25] != 0xFF) + { global_settings.disk_poweroff = config_block[0x25] & 1; + global_settings.buffer_margin = (config_block[0x25] >> 1) & 7; + } if (config_block[0x27] != 0xff) global_settings.runtime = @@ -819,6 +824,7 @@ void settings_reset(void) { global_settings.resume_offset = -1; global_settings.disk_spindown = 5; global_settings.disk_poweroff = false; + global_settings.buffer_margin = 0; global_settings.browse_current = false; global_settings.play_selected = true; global_settings.peak_meter_release = 8; diff --git a/apps/settings.h b/apps/settings.h index 6d3678f44c..012131e528 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -112,6 +112,7 @@ struct user_settings int ff_rewind_accel; /* FF/Rewind acceleration (in seconds per doubling) */ int disk_spindown; /* time until disk spindown, in seconds (0=off) */ bool disk_poweroff; /* whether to cut disk power after spindown or not */ + int buffer_margin; /* MP3 buffer watermark margin, in seconds */ int peak_meter_release; /* units per read out */ int peak_meter_hold; /* hold time for peak meter in 1/100 s */ diff --git a/apps/settings_menu.c b/apps/settings_menu.c index a7b95ba755..4342e9b2d5 100644 --- a/apps/settings_menu.c +++ b/apps/settings_menu.c @@ -496,6 +496,13 @@ static bool poweroff(void) } #endif +static bool buffer_margin(void) +{ + return set_int(str(LANG_MP3BUFFER_MARGIN), "s", + &global_settings.buffer_margin, + mpeg_set_buffer_margin, 1, 0, 7 ); +} + static bool ff_rewind_min_step(void) { char* names[] = { "1s", "2s", "3s", "4s", @@ -535,6 +542,7 @@ static bool playback_settings_menu(void) { str(LANG_RESUME), resume }, { str(LANG_FFRW_STEP), ff_rewind_min_step }, { str(LANG_FFRW_ACCEL), ff_rewind_accel }, + { str(LANG_MP3BUFFER_MARGIN), buffer_margin }, }; bool old_shuffle = global_settings.playlist_shuffle; diff --git a/firmware/mpeg.c b/firmware/mpeg.c index af13137928..a9116ff51a 100644 --- a/firmware/mpeg.c +++ b/firmware/mpeg.c @@ -470,6 +470,7 @@ static bool filling; /* We are filling the buffer with data from disk */ static bool dma_underrun; /* True when the DMA has stopped because of slow disk reading (read error, shaking) */ static int low_watermark; /* Dynamic low watermark level */ +static int low_watermark_margin; /* Extra time in seconds for watermark */ static int lowest_watermark_level; /* Debug value to observe the buffer usage */ #ifdef HAVE_MAS3587F @@ -492,7 +493,8 @@ static void recalculate_watermark(int bitrate) { if(ata_spinup_time) { - low_watermark = ata_spinup_time * 3 / HZ * bitrate*1000 / 8; + low_watermark = (low_watermark_margin + ata_spinup_time * 3 / HZ) * + bitrate*1000 / 8; } else { @@ -500,6 +502,11 @@ static void recalculate_watermark(int bitrate) } } +void mpeg_set_buffer_margin(int seconds) +{ + low_watermark_margin = seconds; +} + void mpeg_get_debugdata(struct mpeg_debug *dbgdata) { dbgdata->mp3buflen = mp3buflen; diff --git a/firmware/mpeg.h b/firmware/mpeg.h index 3e813494f0..5b3c32819a 100644 --- a/firmware/mpeg.h +++ b/firmware/mpeg.h @@ -85,6 +85,7 @@ unsigned long mpeg_num_recorded_frames(void); unsigned long mpeg_num_recorded_bytes(void); #endif void mpeg_get_debugdata(struct mpeg_debug *dbgdata); +void mpeg_set_buffer_margin(int seconds); #define SOUND_VOLUME 0 #define SOUND_BASS 1