songvec: sort songs by album name first, then disc/track number

When the songs of two albums are in the same directory, all songs of
an album should be right next to each others.
This commit is contained in:
Max Kellermann 2009-10-31 17:36:56 +01:00
parent d099a7e464
commit 1ae4e4dcd3
2 changed files with 31 additions and 1 deletions

1
NEWS
View File

@ -46,6 +46,7 @@ ver 0.16 (20??/??/??)
* update: * update:
- automatically update the database with Linux inotify - automatically update the database with Linux inotify
- support .mpdignore files in the music directory - support .mpdignore files in the music directory
- sort songs by album name first, then disc/track number
* log unused/unknown block parameters * log unused/unknown block parameters
* removed the deprecated "error_file" option * removed the deprecated "error_file" option
* save state when stopped * save state when stopped

View File

@ -37,6 +37,30 @@ tag_get_value_checked(const struct tag *tag, enum tag_type type)
: NULL; : NULL;
} }
static int
compare_utf8_string(const char *a, const char *b)
{
if (a == NULL)
return b == NULL ? 0 : -1;
if (b == NULL)
return 1;
return g_utf8_collate(a, b);
}
/**
* Compare two string tag values, ignoring case. Either one may be
* NULL.
*/
static int
compare_string_tag_item(const struct tag *a, const struct tag *b,
enum tag_type type)
{
return compare_utf8_string(tag_get_value_checked(a, type),
tag_get_value_checked(b, type));
}
/** /**
* Compare two tag values which should contain an integer value * Compare two tag values which should contain an integer value
* (e.g. disc or track number). Either one may be NULL. * (e.g. disc or track number). Either one may be NULL.
@ -70,7 +94,12 @@ static int songvec_cmp(const void *s1, const void *s2)
const struct song *b = ((const struct song * const *)s2)[0]; const struct song *b = ((const struct song * const *)s2)[0];
int ret; int ret;
/* first sort by disc */ /* first sort by album */
ret = compare_string_tag_item(a->tag, b->tag, TAG_ALBUM);
if (ret != 0)
return ret;
/* then sort by disc */
ret = compare_tag_item(a->tag, b->tag, TAG_DISC); ret = compare_tag_item(a->tag, b->tag, TAG_DISC);
if (ret != 0) if (ret != 0)
return ret; return ret;