Rockbox.org home
release
dev builds
extras
themes manual
wiki
device status forums
mailing lists
IRC bugs
patches
dev guide



Rockbox mail archive

Subject: Re: roadmap to blind Rockboxing (need an audio amateur/speaker)
From: James DuRant (jamesdurant_at_sc.rr.com)
Date: 2004-02-27


Hi, I don't know how to post this to patches, but I've been using this
patch since september and loving it. It's from the original talkbox,
but zagor edited for me to compile a while back and also added a HUGE
function. Currently, when "Play thumbnails when hovering over a
directory" is set, the directory read is whatever is under the cursor
when the earlier directory is read. Hardeeps added a "Hover Delay"
which only plays the directory name after stopping over the directory.
It adds alot to the feature and was wondering if anyone could
incorporate this feature when adding it to CVS. Thanks so much, James

Here's what hardeep sent me:
I've attached a patch that delays playing the thumbnail for ~1.5s from
the last time the cursor was scrolled when in hover mode. I only did
minimal testing on it so I'm sure there are some cases where it doesn't
work properly.

Index: rockbox/apps/playlist.c
===================================================================
RCS file: /cvsroot/rockbox/apps/playlist.c,v
retrieving revision 1.81
diff -u -r1.81 playlist.c
--- rockbox/apps/playlist.c 11 Aug 2003 16:32:56 -0000 1.81
+++ rockbox/apps/playlist.c 20 Sep 2003 18:29:09 -0000
@@ -471,6 +471,9 @@
         {
             int insert_pos;

+ if (!strcmp(files[i].name, THUMBNAIL_NAME))
+ continue;
+
             snprintf(buf, sizeof(buf), "%s/%s", dirname, files[i].name);

             insert_pos = add_track_to_playlist(buf, *position, queue, -1);
Index: rockbox/apps/screens.c
===================================================================
RCS file: /cvsroot/rockbox/apps/screens.c,v
retrieving revision 1.33
diff -u -r1.33 screens.c
--- rockbox/apps/screens.c 20 Jul 2003 00:12:21 -0000 1.33
+++ rockbox/apps/screens.c 20 Sep 2003 18:29:09 -0000
@@ -37,6 +37,13 @@
#include "powermgmt.h"
#include "adc.h"

+#ifdef HAVE_RECORDER_KEYPAD
+#include "recording.h"
+#include "tree.h"
+#endif
+
+static bool confirm_record_thumbnail(void);
+
#ifdef HAVE_LCD_BITMAP
#define BMPHEIGHT_usb_logo 32
#define BMPWIDTH_usb_logo 100
@@ -431,6 +438,16 @@

         lcd_clear_display();

+
+#ifdef HAVE_MAS3587F
+
+ if (strcmp(getcwd(NULL, -1), "/") != 0) {
+ lcd_putsxy(8, 0, "Record Thumbnail");
+ lcd_bitmap(bitmap_icons_7x8[Icon_UpArrow],
+ LCD_WIDTH/2 - 3, LCD_HEIGHT/2 - h*2, 7, 8, true);
+ }
+#endif
+
         /* Shuffle mode */
         lcd_putsxy(0, LCD_HEIGHT/2 - h*2, str(LANG_SHUFFLE));
         lcd_putsxy(0, LCD_HEIGHT/2 - h, str(LANG_F2_MODE));
@@ -507,6 +524,20 @@
                 used = true;
                 break;

+#ifdef HAVE_MAS3587F
+ case BUTTON_UP:
+ case BUTTON_F2 | BUTTON_UP:
+ if (strcmp(getcwd(NULL, -1), "/") != 0)
+ {
+ if (confirm_record_thumbnail())
+ {
+ record_thumbnail();
+ }
+ }
+ used = true;
+ break;
+#endif
+
             case BUTTON_DOWN:
             case BUTTON_F2 | BUTTON_DOWN:
                 global_settings.dirfilter++;
@@ -631,6 +662,44 @@

     return false;
}
+
+static bool confirm_record_thumbnail(void)
+{
+ bool yesno;
+ bool done;
+
+ if (strcmp(getcwd(NULL, -1), "/") == 0)
+ return false;
+
+ lcd_clear_display();
+
+ lcd_putsxy(0, LCD_HEIGHT/2 - 30, "Record Thumbnail");
+ lcd_putsxy(0, LCD_HEIGHT/2 - 20, "in directory?:");
+ lcd_putsxy(0, LCD_HEIGHT/2 - 5, getcwd(NULL, -1));
+ lcd_putsxy(4, LCD_HEIGHT/2 + 10, "PLAY - Confirm");
+ lcd_putsxy(5, LCD_HEIGHT/2 + 20, " F2 - Cancel");
+ lcd_update();
+
+ done=false;
+ yesno=false;
+
+ while(!done) {
+ switch (button_get(true)) {
+ case BUTTON_PLAY:
+ yesno=true;
+ done = true;
+ break;
+
+ case BUTTON_F2:
+ yesno=false;
+ done = true;
+ break;
+ }
+ }
+
+ return yesno;
+}
+
#endif

#ifdef HAVE_LCD_BITMAP
@@ -802,4 +871,3 @@
             sleep(ticks);
     }
}
-
Index: rockbox/apps/settings.c
===================================================================
RCS file: /cvsroot/rockbox/apps/settings.c,v
retrieving revision 1.170
diff -u -r1.170 settings.c
--- rockbox/apps/settings.c 4 Sep 2003 22:49:33 -0000 1.170
+++ rockbox/apps/settings.c 20 Sep 2003 18:29:10 -0000
@@ -131,8 +131,9 @@
0xA9 (char)jump scroll delay (only for player)
0xAA Max number of files in playlist (1000-20000)
0xAC Max number of files in dir (50-10000)
-0xAE fade on pause/unpause/stop setting (bit 0)
- caption backlight (bit 1)
+0xAE fade on pause/unpause/stop setting (bit 0),
+ caption backlight (bit 1), play thumbnails (bit 2),
+ thumbnail mode (bit 3)
0xB0 peak meter clip hold timeout (bit 0-4), peak meter performance (bit 7)
0xB1 peak meter release step size, peak_meter_dbfs (bit 7)
0xB2 peak meter min either in -db or in percent
@@ -402,7 +403,9 @@
         (global_settings.max_files_in_dir >> 8) & 0xff;
     config_block[0xae] = (unsigned char)
         ((global_settings.fade_on_stop & 1) |
- ((global_settings.caption_backlight & 1) << 1));
+ ((global_settings.caption_backlight & 1) << 1) |
+ ((global_settings.play_thumbnails & 1) << 2) |
+ ((global_settings.thumbnail_mode & 1) << 3));
     config_block[0xb0] = (unsigned
char)global_settings.peak_meter_clip_hold |
         (global_settings.peak_meter_performance ? 0x80 : 0);
     config_block[0xb1] = global_settings.peak_meter_release |
@@ -684,6 +687,8 @@
         if (config_block[0xae] != 0xff) {
             global_settings.fade_on_stop = config_block[0xae] & 1;
             global_settings.caption_backlight = (config_block[0xae] >>
1) & 1;
+ global_settings.play_thumbnails = (config_block[0xae] >> 2)
& 1;
+ global_settings.thumbnail_mode = (config_block[0xae] >> 3) & 1;
         }

         if(config_block[0xb0] != 0xff) {
@@ -1075,6 +1080,13 @@
             set_cfg_option(&global_settings.recursive_dir_insert, value,
                 options, 3);
         }
+ else if (!strcasecmp(name, "play thumbnails"))
+ set_cfg_bool(&global_settings.play_thumbnails, value);
+ else if (!strcasecmp(name, "thumbnail mode")) {
+ static char* options[] = {"enter","hover"};
+ set_cfg_option(&global_settings.thumbnail_mode, value,
+ options, 2);
+ }
     }

     close(fd);
@@ -1372,6 +1384,18 @@
                 options[global_settings.recursive_dir_insert]);
     }

+ {
+ static char* options[] = {"off", "on"};
+ fprintf(fd, "play thumbnails: %s\r\n",
+ options[global_settings.play_thumbnails]);
+ }
+
+ {
+ static char* options[] = {"enter", "hover"};
+ fprintf(fd, "thumbnail mode: %s\r\n",
+ options[global_settings.thumbnail_mode]);
+ }
+
     close(fd);

     lcd_clear_display();
@@ -1460,6 +1484,8 @@
     global_settings.max_files_in_playlist = 10000;
     global_settings.show_icons = true;
     global_settings.recursive_dir_insert = RECURSE_OFF;
+ global_settings.play_thumbnails = 0;
+ global_settings.thumbnail_mode = 0;
}

bool set_bool(char* string, bool* variable )
Index: rockbox/apps/settings.h
===================================================================
RCS file: /cvsroot/rockbox/apps/settings.h,v
retrieving revision 1.88
diff -u -r1.88 settings.h
--- rockbox/apps/settings.h 15 Jul 2003 02:34:10 -0000 1.88
+++ rockbox/apps/settings.h 20 Sep 2003 18:29:10 -0000
@@ -168,6 +168,11 @@
     int max_files_in_playlist; /* Max entries in playlist */
     bool show_icons; /* 0=hide 1=show */
     int recursive_dir_insert; /* should directories be inserted
recursively */
+ bool play_thumbnails; /* Enable/disable playing of directory name
+ thumbnails */
+ int thumbnail_mode; /* When to play directory thumbnails:
+ 0=when entering a directory
+ 1=when cursor is over a directory */
};

enum optiontype { INT, BOOL };
Index: rockbox/apps/settings_menu.c
===================================================================
RCS file: /cvsroot/rockbox/apps/settings_menu.c,v
retrieving revision 1.120
diff -u -r1.120 settings_menu.c
--- rockbox/apps/settings_menu.c 21 Jul 2003 00:33:07 -0000 1.120
+++ rockbox/apps/settings_menu.c 20 Sep 2003 18:29:10 -0000
@@ -695,6 +695,20 @@
}
#endif

+
+static bool play_thumbnails(void)
+{
+ return set_bool( "Play Thumbnails", &global_settings.play_thumbnails );
+}
+
+static bool thumbnail_mode(void)
+{
+ char* names[] = { "enter", "hover"};
+
+ return set_option("Thumbnail Mode",
&global_settings.thumbnail_mode, INT,
+ names, 2, NULL );
+}
+
static bool playback_settings_menu(void)
{
     int m;
@@ -790,6 +804,8 @@
         { str(LANG_CASE_MENU), sort_case },
         { str(LANG_FILTER), dir_filter },
         { str(LANG_FOLLOW), browse_current },
+ { "Play Thumbnails", play_thumbnails },
+ { "Thumbnail Mode", thumbnail_mode },
     };

     m = menu_init( items, sizeof items / sizeof(struct menu_items) );
Index: rockbox/apps/tree.c
===================================================================
RCS file: /cvsroot/rockbox/apps/tree.c,v
retrieving revision 1.205
diff -u -r1.205 tree.c
--- rockbox/apps/tree.c 6 Aug 2003 17:30:40 -0000 1.205
+++ rockbox/apps/tree.c 20 Sep 2003 18:29:11 -0000
@@ -151,6 +151,8 @@
#define TREE_MENU BUTTON_MENU
#endif /* HAVE_RECORDER_KEYPAD */

+#define HOVER_DELAY 1.5
+
static int build_playlist(int start_index)
{
     int i;
@@ -158,7 +160,8 @@

     for(i = 0;i < filesindir;i++)
     {
- if(dircache[i].attr & TREE_ATTR_MPA)
+ if(dircache[i].attr & TREE_ATTR_MPA &&
+ (strcmp(dircache[i].name, THUMBNAIL_NAME) != 0))
         {
             DEBUGF("Adding %s\n", dircache[i].name);
             if (playlist_add(dircache[i].name) < 0)
@@ -175,6 +178,34 @@
     return start_index;
}

+static int play_dirname(int start_index)
+{
+ int fd;
+ char dirname_mp3_filename[MAX_PATH+1];
+
+ snprintf(dirname_mp3_filename, sizeof(dirname_mp3_filename),
"%s/%s/%s",
+ currdir, dircache[start_index].name, THUMBNAIL_NAME);
+
+ DEBUGF("Checking for %s\n", dirname_mp3_filename);
+
+ fd = open(dirname_mp3_filename, O_RDONLY);
+ if (fd < 0)
+ {
+ DEBUGF("Failed to find: %s\n", dirname_mp3_filename);
+ return -1;
+ }
+
+ close(fd);
+
+ DEBUGF("Found: %s\n", dirname_mp3_filename);
+
+ playlist_create(NULL, NULL);
+ playlist_insert_track(dirname_mp3_filename, 0, true);
+ playlist_start(0,0);
+
+ return 1;
+}
+
static int compare(const void* p1, const void* p2)
{
     struct entry* e1 = (struct entry*)p1;
@@ -825,6 +856,9 @@
     bool update_all = false; /* set this to true when the whole file list
                                 has been refreshed on screen */

+ int last_thumbnail_played=-1;
+ long last_scroll = -1;
+
#ifdef HAVE_LCD_BITMAP
     int fw, fh;
     lcd_getstringsize("A", &fw, &fh);
@@ -898,6 +932,7 @@
                         strcpy(lastfile, buf);

                     restore = true;
+ last_scroll = current_tick;
                 }
                 break;

@@ -932,6 +967,15 @@
                     snprintf(buf,sizeof(buf),"/%s",file->name);

                 if (file->attr & ATTR_DIRECTORY) {
+ if (global_settings.play_thumbnails &&
+ global_settings.thumbnail_mode == 0 &&
+ !(mpeg_status() & MPEG_STATUS_PLAY))
+ {
+ /* play_dirname */
+ DEBUGF("Playing directory thumbnail: %s", currdir);
+ play_dirname(dircursor+dirstart);
+ }
+
                     memcpy(currdir,buf,sizeof(currdir));
                     if ( dirlevel < MAX_DIR_LEVELS ) {
                         dirpos[dirlevel] = dirstart;
@@ -940,6 +984,7 @@
                     dirlevel++;
                     dircursor=0;
                     dirstart=0;
+ last_scroll = current_tick;
                 }
                 else {
                     int seed = current_tick;
@@ -1122,6 +1167,7 @@
                         }
                     }
                     need_update = true;
+ last_scroll = current_tick;
                 }
                 break;

@@ -1157,6 +1203,7 @@
                         }
                     }
                     need_update = true;
+ last_scroll = current_tick;
                 }
                 break;

@@ -1173,6 +1220,7 @@
                 {
                     /* start scroll */
                     restore = true;
+ last_scroll = current_tick;
                 }
                 else
                 {
@@ -1219,6 +1267,22 @@
                 break;

             case BUTTON_NONE:
+ if (file->attr & ATTR_DIRECTORY) {
+ /* play directory thumbnail */
+ if (global_settings.play_thumbnails &&
+ global_settings.thumbnail_mode == 1 &&
+ last_thumbnail_played != dircursor+dirstart &&
+ !(mpeg_status() & MPEG_STATUS_PLAY) &&
+ last_scroll > 0 &&
+
TIME_AFTER(current_tick,(last_scroll+HZ*HOVER_DELAY)))
+ {
+ DEBUGF("Playing directory thumbnail: %s", currdir);
+ play_dirname(dircursor+dirstart);
+ last_thumbnail_played = dircursor+dirstart;
+ last_scroll = -1;
+ }
+ }
+
                 status_draw(false);
                 break;
         }
Index: rockbox/apps/tree.h
===================================================================
RCS file: /cvsroot/rockbox/apps/tree.h,v
retrieving revision 1.8
diff -u -r1.8 tree.h
--- rockbox/apps/tree.h 27 Jul 2003 22:08:42 -0000 1.8
+++ rockbox/apps/tree.h 20 Sep 2003 18:29:11 -0000
@@ -39,6 +39,8 @@
#define TREE_ATTR_UCL 0x4000 /* rockbox flash image */
#define TREE_ATTR_MASK 0xffd0 /* which bits tree.c uses (above + DIR) */

+#define THUMBNAIL_NAME ".dirname.mp3"
+
void tree_init(void);
void browse_root(void);
void set_current_file(char *path);
Index: rockbox/apps/recorder/recording.c
===================================================================
RCS file: /cvsroot/rockbox/apps/recorder/recording.c,v
retrieving revision 1.35
diff -u -r1.35 recording.c
--- rockbox/apps/recorder/recording.c 20 Sep 2003 18:02:05 -0000 1.35
+++ rockbox/apps/recorder/recording.c 20 Sep 2003 18:29:11 -0000
@@ -41,6 +41,7 @@
#include "timefuncs.h"
#include "debug.h"
#include "misc.h"
+#include "tree.h"

bool f2_rec_screen(void);
bool f3_rec_screen(void);
@@ -55,6 +56,9 @@
extern unsigned long record_start_frame; /* Frame number where
                                             recording started */

+static bool use_alt_filename;
+static char alt_filename[MAX_PATH+1];
+
#define SOURCE_MIC 0
#define SOURCE_LINE 1
#define SOURCE_SPDIF 2
@@ -216,7 +220,16 @@
                 if(!mpeg_status())
                 {
                     have_recorded = true;
- mpeg_record(create_filename());
+
+ if (!use_alt_filename)
+ {
+ mpeg_record(create_filename());
+ }
+ else
+ {
+ mpeg_record(alt_filename);
+ }
+
                     status_set_playmode(STATUS_RECORD);
                     update_countdown = 1; /* Update immediately */
                     last_seconds = 0;
@@ -713,4 +726,26 @@
     lcd_setfont(FONT_UI);

     return false;
+}
+
+bool record_thumbnail(void)
+{
+ int fd;
+
+ use_alt_filename = true;
+ snprintf(alt_filename, sizeof(alt_filename), "%s/%s",
+ getcwd(NULL, -1), THUMBNAIL_NAME);
+
+ fd = open(alt_filename, O_RDONLY);
+
+ if (fd >= 0)
+ {
+ close(fd);
+ remove(alt_filename);
+ }
+
+ recording_screen();
+ use_alt_filename = false;
+
+ return true;
}
Index: rockbox/apps/recorder/recording.h
===================================================================
RCS file: /cvsroot/rockbox/apps/recorder/recording.h,v
retrieving revision 1.1
diff -u -r1.1 recording.h
--- rockbox/apps/recorder/recording.h 10 Nov 2002 16:42:31 -0000 1.1
+++ rockbox/apps/recorder/recording.h 20 Sep 2003 18:29:11 -0000
@@ -20,5 +20,6 @@
#define RECORDING_H

bool recording_screen(void);
+bool record_thumbnail(void);

#endif

_______________________________________________
http://cool.haxx.se/mailman/listinfo/rockbox



Page was last modified "Jan 10 2012" The Rockbox Crew
aaa