From 8f83078d7220a352fe623bbebffede990f0dfb87 Mon Sep 17 00:00:00 2001 From: Milan Plzik Date: Wed, 11 Sep 2013 00:33:18 +0200 Subject: [PATCH] renderer: Fix seeking behavior when using REL_TIME Signed-off-by: Milan Plzik https://bugzilla.gnome.org/show_bug.cgi?id=686628 --- src/librygel-renderer/rygel-av-transport.vala | 16 +++++++++++++++- src/librygel-renderer/rygel-time-utils.vala | 26 +++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/librygel-renderer/rygel-av-transport.vala b/src/librygel-renderer/rygel-av-transport.vala index 085be2c..6744142 100644 --- a/src/librygel-renderer/rygel-av-transport.vala +++ b/src/librygel-renderer/rygel-av-transport.vala @@ -592,7 +592,6 @@ internal class Rygel.AVTransport : Service { out target); switch (unit) { case "ABS_TIME": - case "REL_TIME": debug ("Seeking to %s.", target); if (!this.player.seek (TimeUtils.time_from_string (target))) { @@ -604,6 +603,21 @@ internal class Rygel.AVTransport : Service { action.return (); return; + case "REL_TIME": + debug ("Relative seek to %s.", target); + + var seek_target = this.player.position + + TimeUtils.time_from_string (target); + + if (!this.player.seek (seek_target)) { + action.return_error (710, _("Seek mode not supported")); + + return; + } + + action.return (); + + return; case "TRACK_NR": debug ("Setting track to %s.", target); var track = int.parse (target); diff --git a/src/librygel-renderer/rygel-time-utils.vala b/src/librygel-renderer/rygel-time-utils.vala index aeffc0f..b7865f3 100644 --- a/src/librygel-renderer/rygel-time-utils.vala +++ b/src/librygel-renderer/rygel-time-utils.vala @@ -26,20 +26,40 @@ internal abstract class Rygel.TimeUtils { public static int64 time_from_string (string str) { uint64 hours, minutes, seconds; + string time_str = str; + int sign = 1; - str.scanf ("%llu:%2llu:%2llu%*s", out hours, out minutes, out seconds); + switch (str[0]) { + case '-': + sign = -1; + time_str = str.substring(1); + break; + case '+': + time_str = str.substring(1); + break; + default: + break; + } - return (int64)(hours * 3600 + minutes * 60 + seconds) * TimeSpan.SECOND; + time_str.scanf ("%llu:%2llu:%2llu%*s", out hours, out minutes, out seconds); + + return sign*(int64)(hours * 3600 + minutes * 60 + seconds) * TimeSpan.SECOND; } public static string time_to_string (int64 time) { uint64 hours, minutes, seconds; + string sign = ""; + + if (time < 0) { + sign = "-"; + time = - time; + }; hours = time / TimeSpan.SECOND / 3600; seconds = time / TimeSpan.SECOND % 3600; minutes = seconds / 60; seconds = seconds % 60; - return "%llu:%.2llu:%.2llu".printf (hours, minutes, seconds); + return "%s%llu:%.2llu:%.2llu".printf (sign, hours, minutes, seconds); } } -- 2.7.4