summaryrefslogtreecommitdiffstats
path: root/apps/plugins/properties.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/properties.c')
-rw-r--r--apps/plugins/properties.c236
1 files changed, 72 insertions, 164 deletions
diff --git a/apps/plugins/properties.c b/apps/plugins/properties.c
index fa3517726a..e5f00e307b 100644
--- a/apps/plugins/properties.c
+++ b/apps/plugins/properties.c
@@ -20,9 +20,19 @@
****************************************************************************/
#include "plugin.h"
+#if !defined(ARRAY_SIZE)
+ #define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))
+#endif
+
+enum props_types {
+ PROPS_FILE = 0,
+ PROPS_ID3,
+ PROPS_DIR
+};
+static int props_type = PROPS_FILE;
-bool its_a_dir = false;
+static struct mp3entry id3;
char str_filename[MAX_PATH];
char str_dirname[MAX_PATH];
@@ -32,27 +42,12 @@ char str_filecount[64];
char str_date[64];
char str_time[64];
-char str_title[MAX_PATH];
-char str_composer[MAX_PATH];
-char str_artist[MAX_PATH];
-char str_albumartist[MAX_PATH];
-char str_album[MAX_PATH];
-char str_genre[MAX_PATH];
-char str_comment[MAX_PATH];
-char str_year[MAX_PATH];
-char str_discnum[MAX_PATH];
-char str_tracknum[MAX_PATH];
-char str_duration[32];
-char str_bitrate[32];
-char str_frequency[32];
-
unsigned nseconds;
unsigned long nsize;
int32_t size_unit;
struct tm tm;
-int num_properties;
-
+#define NUM_FILE_PROPERTIES 5
static const unsigned char* const props_file[] =
{
ID2P(LANG_PROPERTIES_PATH), str_dirname,
@@ -60,20 +55,9 @@ static const unsigned char* const props_file[] =
ID2P(LANG_PROPERTIES_SIZE), str_size,
ID2P(LANG_PROPERTIES_DATE), str_date,
ID2P(LANG_PROPERTIES_TIME), str_time,
- ID2P(LANG_PROPERTIES_COMPOSER), str_composer,
- ID2P(LANG_PROPERTIES_ARTIST), str_artist,
- ID2P(LANG_PROPERTIES_ALBUMARTIST), str_albumartist,
- ID2P(LANG_PROPERTIES_TITLE), str_title,
- ID2P(LANG_PROPERTIES_ALBUM), str_album,
- ID2P(LANG_PROPERTIES_GENRE), str_genre,
- ID2P(LANG_PROPERTIES_COMMENT), str_comment,
- ID2P(LANG_PROPERTIES_YEAR), str_year,
- ID2P(LANG_PROPERTIES_DISCNUM), str_discnum,
- ID2P(LANG_PROPERTIES_TRACKNUM), str_tracknum,
- ID2P(LANG_PROPERTIES_DURATION), str_duration,
- ID2P(LANG_PROPERTIES_BITRATE), str_bitrate,
- ID2P(LANG_PROPERTIES_FREQUENCY), str_frequency,
};
+
+#define NUM_DIR_PROPERTIES 4
static const unsigned char* const props_dir[] =
{
ID2P(LANG_PROPERTIES_PATH), str_dirname,
@@ -107,7 +91,6 @@ static bool file_properties(const char* selected_file)
bool found = false;
DIR* dir;
struct dirent* entry;
- static struct mp3entry id3;
dir = rb->opendir(str_dirname);
if (dir)
@@ -128,81 +111,14 @@ static bool file_properties(const char* selected_file)
rb->snprintf(str_time, sizeof str_time, "%02d:%02d:%02d",
tm.tm_hour, tm.tm_min, tm.tm_sec);
- num_properties = 5;
-
int fd = rb->open(selected_file, O_RDONLY);
- if (fd >= 0 &&
- rb->get_metadata(&id3, fd, selected_file))
+ if (fd >= 0)
{
- long dur = id3.length / 1000; /* seconds */
- rb->snprintf(str_composer, sizeof str_composer,
- "%s", id3.composer ? id3.composer : "");
- rb->snprintf(str_artist, sizeof str_artist,
- "%s", id3.artist ? id3.artist : "");
- rb->snprintf(str_albumartist, sizeof str_albumartist,
- "%s", id3.albumartist ? id3.albumartist : "");
- rb->snprintf(str_title, sizeof str_title,
- "%s", id3.title ? id3.title : "");
- rb->snprintf(str_album, sizeof str_album,
- "%s", id3.album ? id3.album : "");
- rb->snprintf(str_genre, sizeof str_genre,
- "%s", id3.genre_string ? id3.genre_string : "");
- rb->snprintf(str_comment, sizeof str_comment,
- "%s", id3.comment ? id3.comment : "");
-
- if (id3.year_string)
- rb->snprintf(str_year, sizeof str_year,
- "%s", id3.year_string);
- else if (id3.year)
- rb->snprintf(str_year, sizeof str_year,
- "%d", id3.year);
- else
- rb->snprintf(str_year, sizeof str_year,
- "%s", "");
-
- if (id3.disc_string)
- rb->snprintf(str_discnum, sizeof str_discnum,
- "%s", id3.disc_string);
- else if (id3.discnum)
- rb->snprintf(str_discnum, sizeof str_discnum,
- "%d", id3.discnum);
- else
- rb->snprintf(str_discnum, sizeof str_discnum,
- "%s", "");
-
- if (id3.track_string)
- rb->snprintf(str_tracknum, sizeof str_tracknum,
- "%s", id3.track_string);
- else if(id3.tracknum)
- rb->snprintf(str_tracknum, sizeof str_tracknum,
- "%d", id3.tracknum);
- else
- rb->snprintf(str_tracknum, sizeof str_tracknum,
- "%s", "");
-
- rb->snprintf(str_bitrate, sizeof str_bitrate,
- "%d kbps", id3.bitrate ? : 0);
- rb->snprintf(str_frequency, sizeof str_frequency,
- "%ld Hz", id3.frequency ? : 0);
- num_properties += 12;
-
- if (dur > 0)
- {
- nseconds = dur;
- if (dur < 3600)
- rb->snprintf(str_duration, sizeof str_duration,
- "%d:%02d", (int)(dur / 60),
- (int)(dur % 60));
- else
- rb->snprintf(str_duration, sizeof str_duration,
- "%d:%02d:%02d",
- (int)(dur / 3600),
- (int)(dur % 3600 / 60),
- (int)(dur % 60));
- num_properties++;
- }
+ if (rb->get_metadata(&id3, fd, selected_file))
+ props_type = PROPS_ID3;
+
+ rb->close(fd);
}
- rb->close(fd);
found = true;
break;
}
@@ -265,7 +181,7 @@ static bool _dir_properties(DPS *dps)
rb->lcd_putsf(0,3,"Files: %d", dps->fc);
log = human_size_log(dps->bc);
rb->lcd_putsf(0,4,"Size: %lu %cB", (unsigned long)(dps->bc >> (10*log)),
- rb->str(units[log]));
+ rb->str(units[log]));
rb->lcd_update();
}
@@ -314,7 +230,6 @@ static bool dir_properties(const char* selected_file, DPS *dps)
nsize = (long) (dps->bc >> (log*10));
size_unit = units[log];
rb->snprintf(str_size, sizeof str_size, "%ld %s", nsize, rb->str(size_unit));
- num_properties = 4;
return true;
}
@@ -328,35 +243,20 @@ static const char * get_props(int selected_item, void* data,
char *buffer, size_t buffer_len)
{
(void)data;
- if(its_a_dir)
- {
- if(selected_item >= (int)(sizeof(props_dir) / sizeof(props_dir[0])))
- {
- rb->strlcpy(buffer, "ERROR", buffer_len);
- }
- else
- {
- rb->strlcpy(buffer, p2str(props_dir[selected_item]), buffer_len);
- }
- }
- else
- {
- if(selected_item >= (int)(sizeof(props_file) / sizeof(props_file[0])))
- {
- rb->strlcpy(buffer, "ERROR", buffer_len);
- }
- else
- {
- rb->strlcpy(buffer, p2str(props_file[selected_item]), buffer_len);
- }
- }
+ if (PROPS_DIR == props_type)
+ rb->strlcpy(buffer, selected_item >= (int)(ARRAY_SIZE(props_dir)) ? "ERROR" :
+ (char *) p2str(props_dir[selected_item]), buffer_len);
+ else if (PROPS_FILE == props_type)
+ rb->strlcpy(buffer, selected_item >= (int)(ARRAY_SIZE(props_file)) ? "ERROR" :
+ (char *) p2str(props_file[selected_item]), buffer_len);
+
return buffer;
}
static int speak_property_selection(int selected_item, void *data)
{
DPS *dps = data;
- int32_t id = P2ID((its_a_dir ? props_dir : props_file)[selected_item]);
+ int32_t id = P2ID((props_type == PROPS_DIR ? props_dir : props_file)[selected_item]);
rb->talk_id(id, false);
switch (id)
{
@@ -394,9 +294,6 @@ static int speak_property_selection(int selected_item, void *data)
case LANG_PROPERTIES_TIME:
rb->talk_time(&tm, true);
break;
- case LANG_PROPERTIES_DURATION:
- rb->talk_value_decimal(nseconds, UNIT_TIME, 0, true);
- break;
case LANG_PROPERTIES_SUBDIRS:
rb->talk_number(dps->dc, true);
break;
@@ -422,10 +319,10 @@ enum plugin_status plugin_start(const void* parameter)
#endif
static DPS dps = {
- .len = MAX_PATH,
- .dc = 0,
- .fc = 0,
- .bc = 0,
+ .len = MAX_PATH,
+ .dc = 0,
+ .fc = 0,
+ .bc = 0,
};
/* determine if it's a file or a directory */
@@ -446,7 +343,7 @@ enum plugin_status plugin_start(const void* parameter)
if(!rb->strcmp(entry->d_name, str_filename))
{
struct dirinfo info = rb->dir_get_info(dir, entry);
- its_a_dir = info.attribute & ATTR_DIRECTORY ? true : false;
+ props_type = info.attribute & ATTR_DIRECTORY ? PROPS_DIR : PROPS_FILE;
found = true;
break;
}
@@ -464,7 +361,7 @@ enum plugin_status plugin_start(const void* parameter)
}
/* get the info depending on its_a_dir */
- if(!(its_a_dir ? dir_properties(file, &dps) : file_properties(file)))
+ if(!(props_type == PROPS_DIR ? dir_properties(file, &dps) : file_properties(file)))
{
/* something went wrong (to do: tell user what it was (nesting,...) */
rb->splash(0, ID2P(LANG_PROPERTIES_FAIL));
@@ -475,40 +372,51 @@ enum plugin_status plugin_start(const void* parameter)
FOR_NB_SCREENS(i)
rb->viewportmanager_theme_enable(i, true, NULL);
- rb->gui_synclist_init(&properties_lists, &get_props, &dps, false, 2, NULL);
- rb->gui_synclist_set_title(&properties_lists, rb->str(its_a_dir ? LANG_PROPERTIES_DIRECTORY_PROPERTIES : LANG_PROPERTIES_FILE_PROPERTIES), NOICON);
- rb->gui_synclist_set_icon_callback(&properties_lists, NULL);
- if (rb->global_settings->talk_menu)
- rb->gui_synclist_set_voice_callback(&properties_lists, speak_property_selection);
- rb->gui_synclist_set_nb_items(&properties_lists, num_properties * 2);
- rb->gui_synclist_limit_scroll(&properties_lists, true);
- rb->gui_synclist_select_item(&properties_lists, 0);
- rb->gui_synclist_draw(&properties_lists);
- rb->gui_synclist_speak_item(&properties_lists);
-
- while(!quit)
+ if (props_type == PROPS_ID3)
+ usb = rb->browse_id3(&id3, 0, 0);
+ else
{
- button = rb->get_action(CONTEXT_LIST, HZ);
- /* HZ so the status bar redraws corectly */
- if (rb->gui_synclist_do_button(&properties_lists,&button,LIST_WRAP_UNLESS_HELD))
- continue;
- switch(button)
+ rb->gui_synclist_init(&properties_lists, &get_props, &dps, false, 2, NULL);
+ rb->gui_synclist_set_title(&properties_lists,
+ rb->str(props_type == PROPS_DIR ?
+ LANG_PROPERTIES_DIRECTORY_PROPERTIES :
+ LANG_PROPERTIES_FILE_PROPERTIES),
+ NOICON);
+ rb->gui_synclist_set_icon_callback(&properties_lists, NULL);
+ if (rb->global_settings->talk_menu)
+ rb->gui_synclist_set_voice_callback(&properties_lists, speak_property_selection);
+ rb->gui_synclist_set_nb_items(&properties_lists,
+ 2 * (props_type == PROPS_FILE ? NUM_FILE_PROPERTIES :
+ NUM_DIR_PROPERTIES));
+ rb->gui_synclist_limit_scroll(&properties_lists, true);
+ rb->gui_synclist_select_item(&properties_lists, 0);
+ rb->gui_synclist_draw(&properties_lists);
+ rb->gui_synclist_speak_item(&properties_lists);
+
+ while(!quit)
{
- case ACTION_STD_CANCEL:
- quit = true;
- break;
- default:
- if (rb->default_event_handler(button) == SYS_USB_CONNECTED)
- {
+ button = rb->get_action(CONTEXT_LIST, HZ);
+ /* HZ so the status bar redraws corectly */
+ if (rb->gui_synclist_do_button(&properties_lists,&button,LIST_WRAP_UNLESS_HELD))
+ continue;
+ switch(button)
+ {
+ case ACTION_STD_CANCEL:
quit = true;
- usb = true;
- }
- break;
+ break;
+ default:
+ if (rb->default_event_handler(button) == SYS_USB_CONNECTED)
+ {
+ quit = true;
+ usb = true;
+ }
+ break;
+ }
}
}
FOR_NB_SCREENS(i)
rb->viewportmanager_theme_undo(i, false);
- return usb? PLUGIN_USB_CONNECTED: PLUGIN_OK;
+ return usb ? PLUGIN_USB_CONNECTED : PLUGIN_OK;
}