From a038bca74580359a883dc8d526feb7104a677d8c Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 25 Dec 2009 22:59:13 +0100 Subject: song: added support for selecting a time range Added attributes start_ms, end_ms. This allows us to address a portion of a song file (important for CUE support). There is no support yet for storing these attributes in the state file. --- src/song.c | 6 +++++- src/song.h | 12 ++++++++++++ src/song_print.c | 13 +++++++++++++ test/dump_playlist.c | 8 ++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/song.c b/src/song.c index bc6cb11c4..64f476b7e 100644 --- a/src/song.c +++ b/src/song.c @@ -42,6 +42,7 @@ song_alloc(const char *uri, struct directory *parent) memcpy(song->uri, uri, uri_length + 1); song->parent = parent; song->mtime = 0; + song->start_ms = song->end_ms = 0; return song; } @@ -84,8 +85,11 @@ song_get_uri(const struct song *song) double song_get_duration(const struct song *song) { + if (song->end_ms > 0) + return (song->end_ms - song->start_ms) / 1000.0; + if (song->tag == NULL) return 0; - return song->tag->time; + return song->tag->time - song->start_ms / 1000.0; } diff --git a/src/song.h b/src/song.h index 832f3d700..2bebee64e 100644 --- a/src/song.h +++ b/src/song.h @@ -31,6 +31,18 @@ struct song { struct tag *tag; struct directory *parent; time_t mtime; + + /** + * Start of this sub-song within the file in milliseconds. + */ + unsigned start_ms; + + /** + * End of this sub-song within the file in milliseconds. + * Unused if zero. + */ + unsigned end_ms; + char uri[sizeof(int)]; }; diff --git a/src/song_print.c b/src/song_print.c index 3e6252ed6..3ba653d1c 100644 --- a/src/song_print.c +++ b/src/song_print.c @@ -51,6 +51,19 @@ song_print_info(struct client *client, struct song *song) { song_print_uri(client, song); + if (song->start_ms > 0 || song->end_ms > 0) { + if (song->end_ms > 0) + client_printf(client, "Range: %u.%03u-%u.%03u\n", + song->start_ms / 1000, + song->start_ms % 1000, + song->end_ms / 1000, + song->end_ms % 1000); + else + client_printf(client, "Range: %u.%03u-\n", + song->start_ms / 1000, + song->start_ms % 1000); + } + if (song->mtime > 0) { #ifndef G_OS_WIN32 struct tm tm; diff --git a/test/dump_playlist.c b/test/dump_playlist.c index bf31400fe..1a569dfcb 100644 --- a/test/dump_playlist.c +++ b/test/dump_playlist.c @@ -128,6 +128,14 @@ int main(int argc, char **argv) while ((song = playlist_plugin_read(playlist)) != NULL) { g_print("%s\n", song->uri); + + if (song->start_ms > 0 || song->end_ms > 0) + g_print("range: %u:%02u..%u:%02u\n", + song->start_ms / 60000, + (song->start_ms / 1000) % 60, + song->end_ms / 60000, + (song->end_ms / 1000) % 60); + if (song->tag != NULL) tag_save(stdout, song->tag); -- cgit v1.2.3