about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2013-09-09 08:05:18 +0000
committerEric Wong <normalperson@yhbt.net>2013-09-09 08:05:18 +0000
commitddb1f774839b7935968fe86a937dd305a9233d89 (patch)
tree3082cb8836e060d19d039dccdac89720ccae33e7
parent72bdee181ad5d95f1925d3abedd7f860101a75d3 (diff)
downloaddtas-ddb1f774839b7935968fe86a937dd305a9233d89.tar.gz
This should make implementing SetPosition in the MPRIS 2.0 spec
possible.
-rw-r--r--lib/dtas/player.rb4
-rw-r--r--lib/dtas/player/client_handler.rb3
-rw-r--r--lib/dtas/tracklist.rb12
-rw-r--r--test/test_tracklist.rb8
4 files changed, 15 insertions, 12 deletions
diff --git a/lib/dtas/player.rb b/lib/dtas/player.rb
index 5e78d8e..9ab45fc 100644
--- a/lib/dtas/player.rb
+++ b/lib/dtas/player.rb
@@ -353,9 +353,9 @@ class DTAS::Player # :nodoc:
 
     # don't get stuck in an infinite loop if @tl.repeat==true and we can't
     # decode anything (FS errors, sox uninstalled, etc...)
-    while path = @tl.advance_track(false)
+    while path_off = @tl.advance_track(false)
       @sources.each do |src|
-        rv = src.try(path) and return rv
+        rv = src.try(*path_off) and return rv
       end
     end
 
diff --git a/lib/dtas/player/client_handler.rb b/lib/dtas/player/client_handler.rb
index 33cae05..c7dd31d 100644
--- a/lib/dtas/player/client_handler.rb
+++ b/lib/dtas/player/client_handler.rb
@@ -571,7 +571,8 @@ module DTAS::Player::ClientHandler # :nodoc:
       io.emit(@tl.tracks.map! { |i| i.to_s }.join(' '))
     when "goto"
       track_id = msg.shift or return io.emit("ERR track_id not specified")
-      if @tl.go_to(track_id.to_i)
+      offset = msg.shift # may be nil
+      if @tl.go_to(track_id.to_i, offset)
         _tl_skip
         io.emit("OK")
       else
diff --git a/lib/dtas/tracklist.rb b/lib/dtas/tracklist.rb
index c3cd3ff..094c22d 100644
--- a/lib/dtas/tracklist.rb
+++ b/lib/dtas/tracklist.rb
@@ -32,11 +32,11 @@ class DTAS::Tracklist
   def initialize
     TL_DEFAULTS.each { |k,v| instance_variable_set("@#{k}", v) }
     @list = []
-    @goto_pos = nil
+    @goto_off = @goto_pos = nil
   end
 
   def reset
-    @goto_pos = nil
+    @goto_off = @goto_pos = nil
     @pos = TL_DEFAULTS["pos"]
   end
 
@@ -68,7 +68,8 @@ class DTAS::Tracklist
   def advance_track(repeat_ok = true)
     return if @list.empty?
     next_pos = @goto_pos || @pos + 1
-    @goto_pos = nil
+    next_off = @goto_off # nil by default
+    @goto_pos = @goto_off = nil
     if @list[next_pos]
       @pos = next_pos
     elsif @repeat && repeat_ok
@@ -76,7 +77,7 @@ class DTAS::Tracklist
     else
       return
     end
-    @list[next_pos]
+    [ @list[next_pos], next_off ]
   end
 
   def cur_track
@@ -106,9 +107,10 @@ class DTAS::Tracklist
     end
   end
 
-  def go_to(track_id)
+  def go_to(track_id, offset_hhmmss = nil)
     by_track_id = _track_id_map
     if idx = by_track_id[track_id]
+      @goto_off = offset_hhmmss
       return @list[@goto_pos = idx]
     end
     @goto_pos = nil
diff --git a/test/test_tracklist.rb b/test/test_tracklist.rb
index fb5cc3e..74dcea2 100644
--- a/test/test_tracklist.rb
+++ b/test/test_tracklist.rb
@@ -32,11 +32,11 @@ class TestTracklist < Testcase
     tl = DTAS::Tracklist.new
     tl.instance_variable_get(:@list).replace(%w(a b c d e f g))
     %w(a b c d e f g).each do |t|
-      assert_equal t, tl.advance_track
+      assert_equal t, tl.advance_track[0]
     end
     assert_nil tl.advance_track
     tl.repeat = true
-    assert_equal 'a', tl.advance_track
+    assert_equal 'a', tl.advance_track[0]
   end
 
   def _build_mapping(tl)
@@ -49,9 +49,9 @@ class TestTracklist < Testcase
     tl.instance_variable_get(:@list).replace(%w(a b c d e f g))
     mapping = _build_mapping(tl)
     assert_equal 'f', tl.go_to(mapping['f'])
-    assert_equal 'f', tl.advance_track
+    assert_equal 'f', tl.advance_track[0]
     assert_nil tl.go_to(1 << 128)
-    assert_equal 'g', tl.advance_track
+    assert_equal 'g', tl.advance_track[0]
   end
 
   def test_remove_track