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).