everything related to duct tape audio suite (dtas)
 help / color / mirror / Atom feed
* [PATCH] player: cleanup command dispatch
@ 2015-10-04 23:13 Eric Wong
  0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2015-10-04 23:13 UTC (permalink / raw)
  To: dtas-all

We can generate many command calls easily and dynamically, so
avoid the code and cognitive overhead for the majority of commands.
---
 lib/dtas/player.rb                 | 62 ++++++++++++--------------------------
 lib/dtas/player/client_handler.rb  | 32 ++++++++++++--------
 test/test_player_client_handler.rb | 24 +++++++--------
 3 files changed, 51 insertions(+), 67 deletions(-)

diff --git a/lib/dtas/player.rb b/lib/dtas/player.rb
index a1e2040..554a53f 100644
--- a/lib/dtas/player.rb
+++ b/lib/dtas/player.rb
@@ -190,7 +190,7 @@ class DTAS::Player # :nodoc:
     io.emit("OK")
   end
 
-  def do_enq_head(io, msg)
+  def dpc_enq_head(io, msg)
     # check @queue[0] in case we have no sinks
     if need_to_queue
       @queue.unshift(msg)
@@ -207,55 +207,33 @@ class DTAS::Player # :nodoc:
     case command
     when "enq"
       enq_handler(io, msg[0])
-    when "enq-head"
-      do_enq_head(io, msg)
     when "enq-cmd"
       enq_handler(io, { "command" => msg[0]})
     when "pause", "play", "play_pause"
       play_pause_handler(io, command)
-    when "seek"
-      do_seek(io, msg[0])
-    when "clear"
-      @queue.clear
-      wall("clear")
-      io.emit("OK")
-    when "rg"
-      rg_handler(io, msg)
-    when "cue"
-      cue_handler(io, msg)
-    when "skip"
-      skip_handler(io, msg)
-    when "sink"
-      sink_handler(io, msg)
-    when "current"
-      current_handler(io, msg)
-    when "watch"
-      @watchers[io] = true
-      io.emit("OK")
-    when "format"
-      format_handler(io, msg)
-    when "env"
-      env_handler(io, msg)
-    when "restart"
-      restart_pipeline
-      io.emit("OK")
-    when "source"
-      source_handler(io, msg)
-    when "state"
-      state_file_handler(io, msg)
-    when "cd"
-      chdir_handler(io, msg)
     when "pwd"
       io.emit(Dir.pwd)
-    when "tl"
-      tl_handler(io, msg)
-    when "trim"
-      trim_handler(io, msg)
-    when "queue"
-      msg[0] == "cat" and io.emit(@queue.to_yaml)
+    else
+      m = "dpc_#{command.tr('-', '_')}"
+      __send__(m, io, msg) if respond_to?(m)
     end
   end
 
+  def dpc_clear(io, msg)
+    @queue.clear
+    wall('clear')
+    io.emit('OK')
+  end
+
+  def dpc_queue(io, msg)
+    'cat' == msg[0] and io.emit(@queue.to_yaml)
+  end
+
+  def dpc_watch(io, _)
+    @watchers[io] = true
+    io.emit('OK')
+  end
+
   def event_loop_iter
     @srv.run_once do |io, msg| # readability handler, request/response
       case io
@@ -309,7 +287,7 @@ class DTAS::Player # :nodoc:
     return unless sink.active
 
     if (@current || @queue[0]) && !@paused
-      # we get here if source/sinks are all killed in restart_pipeline
+      # we get here if source/sinks are all killed in dpc_restart
       __sink_activate(sink)
       next_source(_next) unless @current
     end
diff --git a/lib/dtas/player/client_handler.rb b/lib/dtas/player/client_handler.rb
index b04872b..fab60f3 100644
--- a/lib/dtas/player/client_handler.rb
+++ b/lib/dtas/player/client_handler.rb
@@ -117,7 +117,7 @@ module DTAS::Player::ClientHandler # :nodoc:
   end
 
   # returns a wait_ctl arg
-  def sink_handler(io, msg)
+  def dpc_sink(io, msg)
     name = msg[1]
     case msg[0]
     when "ls"
@@ -240,7 +240,7 @@ module DTAS::Player::ClientHandler # :nodoc:
     out_samples(in_samples, @current.format, @format)
   end
 
-  def rg_handler(io, msg)
+  def dpc_rg(io, msg)
     return io.emit(@rg.to_hsh.to_yaml) if msg.empty?
     before = @rg.to_hsh
     msg.each do |kv|
@@ -277,7 +277,7 @@ module DTAS::Player::ClientHandler # :nodoc:
 
   # show current info about what's playing
   # returns non-blocking iterator retval
-  def current_handler(io, msg)
+  def dpc_current(io, msg)
     tmp = {}
     if @current
       tmp["current"] = s = @current.to_hsh
@@ -321,7 +321,7 @@ module DTAS::Player::ClientHandler # :nodoc:
     @srv.wait_ctl(buf, :wait_readable)
   end
 
-  def skip_handler(io, msg)
+  def dpc_skip(io, msg)
     __current_drop
     wall("skip")
     io.emit("OK")
@@ -371,7 +371,8 @@ module DTAS::Player::ClientHandler # :nodoc:
     end
   end
 
-  def do_seek(io, offset)
+  def dpc_seek(io, msg)
+    offset = msg[0]
     if @current
       if @current.respond_to?(:infile)
         begin
@@ -408,7 +409,12 @@ module DTAS::Player::ClientHandler # :nodoc:
     stop_sinks
   end
 
-  def format_handler(io, msg)
+  def dpc_restart(io, _)
+    restart_pipeline
+    io.emit('OK')
+  end
+
+  def dpc_format(io, msg)
     new_fmt = @format.dup
     msg.each do |kv|
       k, v = kv.split(/=/, 2)
@@ -443,7 +449,7 @@ module DTAS::Player::ClientHandler # :nodoc:
     io.emit("OK")
   end
 
-  def env_handler(io, msg)
+  def dpc_env(io, msg)
     if msg.empty?
       # this may fail for large envs due to SEQPACKET size restrictions
       # do we care?
@@ -465,7 +471,7 @@ module DTAS::Player::ClientHandler # :nodoc:
     io.emit("OK")
   end
 
-  def source_handler(io, msg)
+  def dpc_source(io, msg)
     map = @source_map
     op = msg.shift
     case op
@@ -509,7 +515,7 @@ module DTAS::Player::ClientHandler # :nodoc:
     end
   end
 
-  def chdir_handler(io, msg)
+  def dpc_cd(io, msg)
     msg.size == 1 or return io.emit("ERR usage: cd DIRNAME")
     begin
       Dir.chdir(msg[0])
@@ -520,7 +526,7 @@ module DTAS::Player::ClientHandler # :nodoc:
     io.emit("OK")
   end
 
-  def state_file_handler(io, msg)
+  def dpc_state(io, msg)
     case msg.shift
     when "dump"
       dest = msg.shift
@@ -546,7 +552,7 @@ module DTAS::Player::ClientHandler # :nodoc:
     __current_drop
   end
 
-  def tl_handler(io, msg)
+  def dpc_tl(io, msg)
     case msg.shift
     when "add"
       path = msg.shift
@@ -663,7 +669,7 @@ module DTAS::Player::ClientHandler # :nodoc:
     io.emit("OK")
   end
 
-  def cue_handler(io, msg)
+  def dpc_cue(io, msg)
     cur = @current
     if cur.respond_to?(:cuebreakpoints)
       bp = cur.cuebreakpoints
@@ -684,7 +690,7 @@ module DTAS::Player::ClientHandler # :nodoc:
     end
   end
 
-  def trim_handler(io, msg)
+  def dpc_trim(io, msg)
     case msg.size
     when 0
       io.emit({ 'trim' => @trim }.to_yaml)
diff --git a/test/test_player_client_handler.rb b/test/test_player_client_handler.rb
index 1f349b9..a100ad1 100644
--- a/test/test_player_client_handler.rb
+++ b/test/test_player_client_handler.rb
@@ -19,23 +19,23 @@ class TestPlayerClientHandler < Testcase
   def test_delete
     @sinks["default"] = DTAS::Sink.new
     @targets = []
-    sink_handler(@io, %w(rm default))
+    dpc_sink(@io, %w(rm default))
     assert @sinks.empty?
     assert_equal %w(OK), @io.to_a
   end
 
   def test_delete_noexist
-    sink_handler(@io, %w(rm default))
+    dpc_sink(@io, %w(rm default))
     assert @sinks.empty?
     assert_equal ["ERR default not found"], @io.to_a
   end
 
   def test_env
-    sink_handler(@io, %w(ed default env.FOO=bar))
+    dpc_sink(@io, %w(ed default env.FOO=bar))
     assert_equal "bar", @sinks["default"].env["FOO"]
-    sink_handler(@io, %w(ed default env.FOO=))
+    dpc_sink(@io, %w(ed default env.FOO=))
     assert_equal "", @sinks["default"].env["FOO"]
-    sink_handler(@io, %w(ed default env#FOO))
+    dpc_sink(@io, %w(ed default env#FOO))
     assert_nil @sinks["default"].env["FOO"]
   end
 
@@ -47,12 +47,12 @@ class TestPlayerClientHandler < Testcase
       --disable-format --disable-resample --disable-channels \
       -t raw -c $SINK_CHANNELS -f S${SINK_BITS}_3LE -r $SINK_RATE
     '
-    sink_handler(@io, %W(ed foo command=#{command}))
+    dpc_sink(@io, %W(ed foo command=#{command}))
     assert_equal command, @sinks["foo"].command
     assert_empty @sinks["foo"].env
-    sink_handler(@io, %W(ed foo env.SINK_BITS=24))
-    sink_handler(@io, %W(ed foo env.SINK_CHANNELS=2))
-    sink_handler(@io, %W(ed foo env.SINK_RATE=48000))
+    dpc_sink(@io, %W(ed foo env.SINK_BITS=24))
+    dpc_sink(@io, %W(ed foo env.SINK_CHANNELS=2))
+    dpc_sink(@io, %W(ed foo env.SINK_RATE=48000))
     expect = {
       "SINK_BITS" => "24",
       "SINK_CHANNELS" => "2",
@@ -68,7 +68,7 @@ class TestPlayerClientHandler < Testcase
     sink.name = "default"
     sink.command += "dither -s"
     @sinks["default"] = sink
-    sink_handler(@io, %W(cat default))
+    dpc_sink(@io, %W(cat default))
     assert_equal 1, @io.size
     hsh = YAML.load(@io[0])
     assert_kind_of Hash, hsh
@@ -79,12 +79,12 @@ class TestPlayerClientHandler < Testcase
   def test_ls
     expect = %w(a b c d)
     expect.each { |s| @sinks[s] = true }
-    sink_handler(@io, %W(ls))
+    dpc_sink(@io, %W(ls))
     assert_equal expect, Shellwords.split(@io[0])
   end
 
   def test_env_dump
-    env_handler(@io, [])
+    dpc_env(@io, [])
     res = @io[0]
     result = {}
     Shellwords.split(res).each do |kv|
-- 
EW



^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2015-10-04 23:14 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-04 23:13 [PATCH] player: cleanup command dispatch Eric Wong

everything related to duct tape audio suite (dtas)

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://80x24.org/dtas-all
	git clone --mirror http://ou63pmih66umazou.onion/dtas-all

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V1 dtas-all dtas-all/ https://80x24.org/dtas-all \
		dtas-all@nongnu.org
	public-inbox-index dtas-all

Example config snippet for mirrors.
Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.audio.dtas
	nntp://ou63pmih66umazou.onion/inbox.comp.audio.dtas
 note: .onion URLs require Tor: https://www.torproject.org/

code repositories for the project(s) associated with this inbox:

	dtas.git

AGPL code for this site: git clone https://public-inbox.org/public-inbox.git