about summary refs log tree commit homepage
diff options
authorEric Wong <e@80x24.org>2014-12-27 11:54:25 +0000
committerEric Wong <e@80x24.org>2014-12-27 11:58:26 +0000
commit949dbe07c02919f8f17d7880bc69c3ee683daca4 (patch)
parent6c025858196b348c83ddd50e9233eb85c86c71d6 (diff)
This becomes useful for systems without inotify when we're editing
YAML (or whatever) files frequently and want changes to be reflected
right away during playback.  This is a weaker version of the plain
"restart" command, which restarts the entire playback chain.
2 files changed, 16 insertions, 2 deletions
diff --git a/Documentation/dtas-player_protocol.txt b/Documentation/dtas-player_protocol.txt
index b8f8264..ff8f7ae 100644
--- a/Documentation/dtas-player_protocol.txt
+++ b/Documentation/dtas-player_protocol.txt
@@ -169,7 +169,9 @@ Commands here should be alphabetized according to `LC_ALL=C sort'
 * restart - restarts all processes in the current pipeline.  Playback
   will be momentarily interrupted while this change occurs.  This is
   necessary if one of the commands (e.g. sox or ecasound) or loaded
-  libraries (e.g. a LADSPA plugin) is upgraded.
+  libraries (e.g. a LADSPA plugin) is upgraded.  Use "source restart"
+  instead to only restart the source chain, leaving the sinks
+  untouched.
 * rg RGARGS - configure ReplayGain support
   All FLOAT values may be adjusted via '+=' or '-=' instead of simple
@@ -233,6 +235,14 @@ Commands here should be alphabetized according to `LC_ALL=C sort'
         1. input type (flac/opus/mp3/etc)
         2. transport protocol (local FS/http/ftp/sftp/etc)
+* source ls - dump the names of sources sorted by tryorder
+* source restart - restart the current source command
+  This can be useful if the source file is changed during playback
+  and the current player process is holding onto an unlinked inode.
+  This is advantageous over a full "restart" as there is no audible
+  gap on most systems.
 * state dump [FILENAME]
   Immediately dump the state of the player.  If a FILENAME is specified,
   the state is written to that file.  Otherwise, the default state file
diff --git a/lib/dtas/player/client_handler.rb b/lib/dtas/player/client_handler.rb
index 37357f7..35f85c2 100644
--- a/lib/dtas/player/client_handler.rb
+++ b/lib/dtas/player/client_handler.rb
@@ -463,7 +463,11 @@ module DTAS::Player::ClientHandler # :nodoc:
   def source_handler(io, msg)
     map = @source_map
     op = msg.shift
-    if op == "ls"
+    case op
+    when "restart"
+      __current_requeue
+      return io.emit("OK")
+    when "ls"
       s = map.keys.sort { |a,b| map[a].tryorder <=> map[b].tryorder }
       return io.emit(s.join(' '))