From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS22989 208.118.235.0/24 X-Spam-Status: No, score=-2.0 required=3.0 tests=AWL,BAYES_00,URIBL_BLOCKED shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: dtas-all@80x24.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id 03D34633849 for ; Sun, 4 Oct 2015 23:14:03 +0000 (UTC) Received: from localhost ([::1]:43854 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZisTi-0002vd-EG for dtas-all@80x24.org; Sun, 04 Oct 2015 19:14:02 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51975) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZisTf-0002vO-66 for dtas-all@nongnu.org; Sun, 04 Oct 2015 19:14:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZisTb-0007IR-2X for dtas-all@nongnu.org; Sun, 04 Oct 2015 19:13:59 -0400 Received: from dcvr.yhbt.net ([64.71.152.64]:32881) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZisTa-0007IE-Ql for dtas-all@nongnu.org; Sun, 04 Oct 2015 19:13:55 -0400 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 23611633849 for ; Sun, 4 Oct 2015 23:13:52 +0000 (UTC) From: Eric Wong To: Subject: [PATCH] player: cleanup command dispatch Date: Sun, 4 Oct 2015 23:13:51 +0000 Message-Id: <20151004231351.3025-1-e@80x24.org> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 64.71.152.64 X-BeenThere: dtas-all@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dtas-all-bounces+dtas-all=80x24.org@nongnu.org Sender: dtas-all-bounces+dtas-all=80x24.org@nongnu.org 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