aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/song.c6
-rw-r--r--src/song.h12
-rw-r--r--src/song_print.c13
3 files changed, 30 insertions, 1 deletions
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;