summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiika Pekkarinen <miipekk@ihme.org>2006-04-05 18:46:38 +0000
committerMiika Pekkarinen <miipekk@ihme.org>2006-04-05 18:46:38 +0000
commit35d213aec3718a76e1ac161cc0db10b5b5609456 (patch)
treecde2e5737a98ab3f27481ba5df82dcb307b3650e
parent1de1f5b141d5fdc0427877425928c77a9006e027 (diff)
downloadrockbox-35d213aec3718a76e1ac161cc0db10b5b5609456.tar.gz
rockbox-35d213aec3718a76e1ac161cc0db10b5b5609456.zip
Tagcache engine: Better handling for track numbers and genre strings.
Browser: Don't jam if search string was not supplied. Don't show incorrect track numbers. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9523 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/tagcache.c36
-rw-r--r--apps/tagtree.c15
2 files changed, 30 insertions, 21 deletions
diff --git a/apps/tagcache.c b/apps/tagcache.c
index 25728fa6f1..1a47b10ba8 100644
--- a/apps/tagcache.c
+++ b/apps/tagcache.c
@@ -66,7 +66,7 @@ static const int numeric_tags[] = { tag_year, tag_tracknumber, tag_length, tag_b
66#define TAGCACHE_FILE_INDEX ROCKBOX_DIR "/tagcache_%d.tcd" 66#define TAGCACHE_FILE_INDEX ROCKBOX_DIR "/tagcache_%d.tcd"
67 67
68/* Tag Cache Header version 'TCHxx' */ 68/* Tag Cache Header version 'TCHxx' */
69#define TAGCACHE_MAGIC 0x54434801 69#define TAGCACHE_MAGIC 0x54434802
70 70
71/* Tag database structures. */ 71/* Tag database structures. */
72 72
@@ -815,7 +815,7 @@ static inline void write_item(const char *item)
815inline void check_if_empty(char **tag) 815inline void check_if_empty(char **tag)
816{ 816{
817 if (tag == NULL || *tag == NULL || *tag[0] == '\0') 817 if (tag == NULL || *tag == NULL || *tag[0] == '\0')
818 *tag = "Unknown"; 818 *tag = "<Untagged>";
819} 819}
820 820
821#define CRC_BUF_LEN 8 821#define CRC_BUF_LEN 8
@@ -831,6 +831,7 @@ static void add_tagcache(const char *path)
831 bool ret; 831 bool ret;
832 int fd; 832 int fd;
833 char tracknumfix[3]; 833 char tracknumfix[3];
834 char *genrestr;
834 //uint32_t crcbuf[CRC_BUF_LEN]; 835 //uint32_t crcbuf[CRC_BUF_LEN];
835 836
836 if (cachefd < 0) 837 if (cachefd < 0)
@@ -870,17 +871,19 @@ static void add_tagcache(const char *path)
870 if (!ret) 871 if (!ret)
871 return ; 872 return ;
872 873
874 genrestr = id3_get_genre(&track.id3);
875
873 check_if_empty(&track.id3.title); 876 check_if_empty(&track.id3.title);
874 check_if_empty(&track.id3.artist); 877 check_if_empty(&track.id3.artist);
875 check_if_empty(&track.id3.album); 878 check_if_empty(&track.id3.album);
876 check_if_empty(&track.id3.genre_string); 879 check_if_empty(&genrestr);
877 check_if_empty(&track.id3.composer); 880 check_if_empty(&track.id3.composer);
878 881
879 entry.tag_length[tag_filename] = strlen(path) + 1; 882 entry.tag_length[tag_filename] = strlen(path) + 1;
880 entry.tag_length[tag_title] = strlen(track.id3.title) + 1; 883 entry.tag_length[tag_title] = strlen(track.id3.title) + 1;
881 entry.tag_length[tag_artist] = strlen(track.id3.artist) + 1; 884 entry.tag_length[tag_artist] = strlen(track.id3.artist) + 1;
882 entry.tag_length[tag_album] = strlen(track.id3.album) + 1; 885 entry.tag_length[tag_album] = strlen(track.id3.album) + 1;
883 entry.tag_length[tag_genre] = strlen(track.id3.genre_string) + 1; 886 entry.tag_length[tag_genre] = strlen(genrestr) + 1;
884 entry.tag_length[tag_composer] = strlen(track.id3.composer) + 1; 887 entry.tag_length[tag_composer] = strlen(track.id3.composer) + 1;
885 888
886 entry.tag_offset[tag_filename] = 0; 889 entry.tag_offset[tag_filename] = 0;
@@ -899,21 +902,22 @@ static void add_tagcache(const char *path)
899 902
900 if (entry.tag_offset[tag_tracknumber] <= 0) 903 if (entry.tag_offset[tag_tracknumber] <= 0)
901 { 904 {
902 int start, i; 905 const char *p = strrchr(path, '.');
903 906
904 for (start = 0; path[start] != '\0'; start++) 907 if (p == NULL)
905 if (isdigit(path[start])) 908 p = &path[strlen(path)-1];
906 break ;
907 909
908 for (i = 0; i < (int)sizeof(tracknumfix)-1 910 while (*p != '/')
909 && path[start+i] != '\0'; i++)
910 { 911 {
911 if (isdigit(path[start+i])) 912 if (isdigit(*p) && isdigit(*(p-1)))
912 tracknumfix[i] = path[start+i]; 913 {
913 else 914 tracknumfix[1] = *p--;
914 break ; 915 tracknumfix[0] = *p;
916 break;
917 }
918 p--;
915 } 919 }
916 920
917 if (tracknumfix[0] != '\0') 921 if (tracknumfix[0] != '\0')
918 entry.tag_offset[tag_tracknumber] = atoi(tracknumfix); 922 entry.tag_offset[tag_tracknumber] = atoi(tracknumfix);
919 else 923 else
@@ -925,7 +929,7 @@ static void add_tagcache(const char *path)
925 write_item(track.id3.title); 929 write_item(track.id3.title);
926 write_item(track.id3.artist); 930 write_item(track.id3.artist);
927 write_item(track.id3.album); 931 write_item(track.id3.album);
928 write_item(track.id3.genre_string); 932 write_item(genrestr);
929 write_item(track.id3.composer); 933 write_item(track.id3.composer);
930 total_entry_count++; 934 total_entry_count++;
931} 935}
diff --git a/apps/tagtree.c b/apps/tagtree.c
index 7cae86a953..db35ee0d0c 100644
--- a/apps/tagtree.c
+++ b/apps/tagtree.c
@@ -426,12 +426,16 @@ int tagtree_load(struct tree_context* c)
426 dptr->newtable = tcs.result_seek; 426 dptr->newtable = tcs.result_seek;
427 if (!tcs.ramsearch || csi->tagorder[extra] == tag_title) 427 if (!tcs.ramsearch || csi->tagorder[extra] == tag_title)
428 { 428 {
429 int tracknum = -1;
430
429 dptr->name = &c->name_buffer[namebufused]; 431 dptr->name = &c->name_buffer[namebufused];
430 if (csi->tagorder[extra] == tag_title) 432 if (csi->tagorder[extra] == tag_title)
433 tracknum = tagcache_get_numeric(&tcs, tag_tracknumber);
434
435 if (tracknum > 0)
431 { 436 {
432 snprintf(dptr->name, c->name_buffer_size - namebufused, "%02d. %s", 437 snprintf(dptr->name, c->name_buffer_size - namebufused, "%02d. %s",
433 tagcache_get_numeric(&tcs, tag_tracknumber), 438 tracknum, tcs.result);
434 tcs.result);
435 namebufused += strlen(dptr->name) + 1; 439 namebufused += strlen(dptr->name) + 1;
436 if (namebufused >= c->name_buffer_size) 440 if (namebufused >= c->name_buffer_size)
437 { 441 {
@@ -518,8 +522,8 @@ int tagtree_enter(struct tree_context* c)
518 522
519 switch (c->currtable) { 523 switch (c->currtable) {
520 case root: 524 case root:
521 c->currtable = newextra;
522 c->currextra = newextra; 525 c->currextra = newextra;
526
523 if (newextra == navibrowse) 527 if (newextra == navibrowse)
524 { 528 {
525 int i, j; 529 int i, j;
@@ -539,7 +543,7 @@ int tagtree_enter(struct tree_context* c)
539 if (rc == -1 || !searchstring[0]) 543 if (rc == -1 || !searchstring[0])
540 { 544 {
541 c->dirlevel--; 545 c->dirlevel--;
542 break; 546 return 0;
543 } 547 }
544 548
545 if (csi->clause[i][j].numeric) 549 if (csi->clause[i][j].numeric)
@@ -549,8 +553,9 @@ int tagtree_enter(struct tree_context* c)
549 sizeof(csi->clause[i][j].str)-1); 553 sizeof(csi->clause[i][j].str)-1);
550 } 554 }
551 } 555 }
552
553 } 556 }
557
558 c->currtable = newextra;
554 break; 559 break;
555 560
556 case navibrowse: 561 case navibrowse: