everything related to duct tape audio suite (dtas)
 help / color / mirror / code / Atom feed
From: Eric Wong <e@80x24.org>
To: <dtas-all@nongnu.org>
Subject: [PATCH] player: cleanup command dispatch
Date: Sun,  4 Oct 2015 23:13:51 +0000	[thread overview]
Message-ID: <20151004231351.3025-1-e@80x24.org> (raw)

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



                 reply	other threads:[~2015-10-04 23:14 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://80x24.org/dtas/README

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20151004231351.3025-1-e@80x24.org \
    --to=e@80x24.org \
    --cc=dtas-all@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/dtas.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).