dtas 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +7 -0
  2. data/.gemtest +0 -0
  3. data/.gitignore +9 -0
  4. data/.rsync_doc +3 -0
  5. data/COPYING +674 -0
  6. data/Documentation/.gitignore +3 -0
  7. data/Documentation/GNUmakefile +46 -0
  8. data/Documentation/dtas-console.txt +42 -0
  9. data/Documentation/dtas-ctl.txt +64 -0
  10. data/Documentation/dtas-cueedit.txt +24 -0
  11. data/Documentation/dtas-enq.txt +29 -0
  12. data/Documentation/dtas-msinkctl.txt +45 -0
  13. data/Documentation/dtas-player.txt +110 -0
  14. data/Documentation/dtas-player_effects.txt +45 -0
  15. data/Documentation/dtas-player_protocol.txt +181 -0
  16. data/Documentation/dtas-sinkedit.txt +41 -0
  17. data/Documentation/dtas-sourceedit.txt +33 -0
  18. data/Documentation/dtas-xdelay.txt +57 -0
  19. data/Documentation/troubleshooting.txt +13 -0
  20. data/GIT-VERSION-GEN +30 -0
  21. data/GNUmakefile +9 -0
  22. data/HACKING +12 -0
  23. data/INSTALL +53 -0
  24. data/README +103 -0
  25. data/Rakefile +97 -0
  26. data/TODO +4 -0
  27. data/bin/dtas-console +160 -0
  28. data/bin/dtas-ctl +10 -0
  29. data/bin/dtas-cueedit +78 -0
  30. data/bin/dtas-enq +13 -0
  31. data/bin/dtas-msinkctl +51 -0
  32. data/bin/dtas-player +34 -0
  33. data/bin/dtas-sinkedit +58 -0
  34. data/bin/dtas-sourceedit +48 -0
  35. data/bin/dtas-xdelay +85 -0
  36. data/dtas-linux.gemspec +18 -0
  37. data/dtas-mpris.gemspec +16 -0
  38. data/examples/dtas_state.yml +18 -0
  39. data/lib/dtas.rb +7 -0
  40. data/lib/dtas/buffer.rb +90 -0
  41. data/lib/dtas/buffer/read_write.rb +102 -0
  42. data/lib/dtas/buffer/splice.rb +142 -0
  43. data/lib/dtas/command.rb +43 -0
  44. data/lib/dtas/compat_onenine.rb +18 -0
  45. data/lib/dtas/disclaimer.rb +18 -0
  46. data/lib/dtas/format.rb +151 -0
  47. data/lib/dtas/pipe.rb +39 -0
  48. data/lib/dtas/player.rb +393 -0
  49. data/lib/dtas/player/client_handler.rb +463 -0
  50. data/lib/dtas/process.rb +87 -0
  51. data/lib/dtas/replaygain.rb +41 -0
  52. data/lib/dtas/rg_state.rb +99 -0
  53. data/lib/dtas/serialize.rb +9 -0
  54. data/lib/dtas/sigevent.rb +10 -0
  55. data/lib/dtas/sigevent/efd.rb +20 -0
  56. data/lib/dtas/sigevent/pipe.rb +28 -0
  57. data/lib/dtas/sink.rb +121 -0
  58. data/lib/dtas/source.rb +147 -0
  59. data/lib/dtas/source/command.rb +40 -0
  60. data/lib/dtas/source/common.rb +14 -0
  61. data/lib/dtas/source/mp3.rb +37 -0
  62. data/lib/dtas/state_file.rb +33 -0
  63. data/lib/dtas/unix_accepted.rb +76 -0
  64. data/lib/dtas/unix_client.rb +51 -0
  65. data/lib/dtas/unix_server.rb +110 -0
  66. data/lib/dtas/util.rb +15 -0
  67. data/lib/dtas/writable_iter.rb +22 -0
  68. data/perl/dtas-graph +129 -0
  69. data/pkg.mk +26 -0
  70. data/setup.rb +1586 -0
  71. data/test/covshow.rb +30 -0
  72. data/test/helper.rb +76 -0
  73. data/test/player_integration.rb +121 -0
  74. data/test/test_buffer.rb +216 -0
  75. data/test/test_format.rb +61 -0
  76. data/test/test_format_change.rb +49 -0
  77. data/test/test_player.rb +47 -0
  78. data/test/test_player_client_handler.rb +86 -0
  79. data/test/test_player_integration.rb +220 -0
  80. data/test/test_rg_integration.rb +117 -0
  81. data/test/test_rg_state.rb +32 -0
  82. data/test/test_sink.rb +32 -0
  83. data/test/test_sink_tee_integration.rb +34 -0
  84. data/test/test_source.rb +102 -0
  85. data/test/test_unixserver.rb +66 -0
  86. data/test/test_util.rb +15 -0
  87. metadata +208 -0
@@ -0,0 +1,32 @@
1
+ # -*- encoding: binary -*-
2
+ # Copyright (C) 2013, Eric Wong <normalperson@yhbt.net>
3
+ # License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
4
+ require './test/helper'
5
+ require 'dtas/rg_state'
6
+
7
+ class TestRGState < Minitest::Unit::TestCase
8
+
9
+ def test_rg_state
10
+ rg = DTAS::RGState.new
11
+ assert_equal({}, rg.to_hsh)
12
+ rg.preamp = 0.1
13
+ assert_equal({"preamp" => 0.1}, rg.to_hsh)
14
+ rg.preamp = 0
15
+ assert_equal({}, rg.to_hsh)
16
+ end
17
+
18
+ def test_load
19
+ rg = DTAS::RGState.load("preamp" => 0.666)
20
+ assert_equal({"preamp" => 0.666}, rg.to_hsh)
21
+ end
22
+
23
+ def test_mode_set
24
+ rg = DTAS::RGState.new
25
+ orig = rg.mode
26
+ assert_equal DTAS::RGState::RG_DEFAULT["mode"], orig
27
+ %w(album_gain track_gain album_peak track_peak).each do |t|
28
+ rg.mode = t
29
+ assert_equal t, rg.mode
30
+ end
31
+ end
32
+ end
data/test/test_sink.rb ADDED
@@ -0,0 +1,32 @@
1
+ # -*- encoding: binary -*-
2
+ # Copyright (C) 2013, Eric Wong <normalperson@yhbt.net>
3
+ # License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
4
+ require './test/helper'
5
+ require 'dtas/sink'
6
+ require 'yaml'
7
+
8
+ class TestSink < Minitest::Unit::TestCase
9
+ def test_serialize_reload
10
+ sink = DTAS::Sink.new
11
+ sink.name = "DAC"
12
+ hash = sink.to_hsh
13
+ assert_kind_of Hash, hash
14
+ refute_match(%r{ruby}i, hash.to_yaml, "ruby guts exposed: #{hash}")
15
+
16
+ s2 = DTAS::Sink.load(hash)
17
+ assert_equal sink.to_hsh, s2.to_hsh
18
+ assert_equal hash, s2.to_hsh
19
+ end
20
+
21
+ def test_name
22
+ sink = DTAS::Sink.new
23
+ sink.name = "dac1"
24
+ assert_equal({"name" => "dac1"}, sink.to_hsh)
25
+ end
26
+
27
+ def test_inactive_load
28
+ orig = { "active" => false }.freeze
29
+ tmp = orig.to_yaml
30
+ assert_equal orig, YAML.load(tmp)
31
+ end
32
+ end
@@ -0,0 +1,34 @@
1
+ # -*- encoding: binary -*-
2
+ # Copyright (C) 2013, Eric Wong <normalperson@yhbt.net>
3
+ # License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
4
+ require './test/player_integration'
5
+ class TestSinkTeeIntegration < Minitest::Unit::TestCase
6
+ include PlayerIntegration
7
+
8
+ def test_tee_integration
9
+ s = client_socket
10
+ default_sink_pid(s)
11
+ tee_pid = Tempfile.new(%w(dtas-test .pid))
12
+ orig = Tempfile.new(%w(orig .junk))
13
+ ajunk = Tempfile.new(%w(a .junk))
14
+ bjunk = Tempfile.new(%w(b .junk))
15
+ cmd = "echo $$ > #{tee_pid.path}; " \
16
+ "cat /dev/fd/a > #{ajunk.path} & " \
17
+ "cat /dev/fd/b > #{bjunk.path}; wait"
18
+ s.send("sink ed split active=true command='#{cmd}'", Socket::MSG_EOR)
19
+ assert_equal("OK", s.readpartial(666))
20
+ pluck = "sox -n $SOXFMT - synth 3 pluck | tee #{orig.path}"
21
+ s.send("enq-cmd \"#{pluck}\"", Socket::MSG_EOR)
22
+ assert_equal "OK", s.readpartial(666)
23
+
24
+ wait_files_not_empty(tee_pid)
25
+ pid = read_pid_file(tee_pid)
26
+ dethrottle_decoder(s)
27
+ wait_pid_dead(pid)
28
+ assert_equal ajunk.size, bjunk.size
29
+ assert_equal orig.size, bjunk.size
30
+ assert_equal ajunk.read, bjunk.read
31
+ bjunk.rewind
32
+ assert_equal orig.read, bjunk.read
33
+ end
34
+ end
@@ -0,0 +1,102 @@
1
+ # -*- encoding: binary -*-
2
+ # Copyright (C) 2013, Eric Wong <normalperson@yhbt.net>
3
+ # License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
4
+ require './test/helper'
5
+ require 'dtas/source'
6
+ require 'tempfile'
7
+
8
+ class TestSource < Minitest::Unit::TestCase
9
+ def teardown
10
+ @tempfiles.each { |tmp| tmp.close! }
11
+ end
12
+
13
+ def setup
14
+ @tempfiles = []
15
+ end
16
+
17
+ def x(cmd)
18
+ system(*cmd)
19
+ assert $?.success?, cmd.inspect
20
+ end
21
+
22
+ def new_file(suffix)
23
+ tmp = Tempfile.new(%W(tmp .#{suffix}))
24
+ @tempfiles << tmp
25
+ cmd = %W(sox -r 44100 -b 16 -c 2 -n #{tmp.path} trim 0 1)
26
+ return tmp if system(*cmd)
27
+ nil
28
+ end
29
+
30
+ def test_flac
31
+ return if `which metaflac`.strip.size == 0
32
+ tmp = new_file('flac') or return
33
+
34
+ source = DTAS::Source.new(tmp.path)
35
+ x(%W(metaflac --set-tag=FOO=BAR #{tmp.path}))
36
+ x(%W(metaflac --add-replay-gain #{tmp.path}))
37
+ assert_equal source.comments["FOO"], "BAR"
38
+ rg = source.replaygain
39
+ assert_kind_of DTAS::ReplayGain, rg
40
+ assert_in_delta 0.0, rg.track_peak.to_f, 0.00000001
41
+ assert_in_delta 0.0, rg.album_peak.to_f, 0.00000001
42
+ assert_operator rg.album_gain.to_f, :>, 1
43
+ assert_operator rg.track_gain.to_f, :>, 1
44
+ end
45
+
46
+ def test_mp3gain
47
+ return if `which mp3gain`.strip.size == 0
48
+ a = new_file('mp3') or return
49
+ b = new_file('mp3') or return
50
+
51
+ source = DTAS::Source.new(a.path)
52
+
53
+ # redirect stdout to /dev/null temporarily, mp3gain is noisy
54
+ File.open("/dev/null", "w") do |null|
55
+ old_out = $stdout.dup
56
+ $stdout.reopen(null)
57
+ begin
58
+ x(%W(mp3gain -q #{a.path} #{b.path}))
59
+ ensure
60
+ $stdout.reopen(old_out)
61
+ old_out.close
62
+ end
63
+ end
64
+
65
+ rg = source.replaygain
66
+ assert_kind_of DTAS::ReplayGain, rg
67
+ assert_in_delta 0.0, rg.track_peak.to_f, 0.00000001
68
+ assert_in_delta 0.0, rg.album_peak.to_f, 0.00000001
69
+ assert_operator rg.album_gain.to_f, :>, 1
70
+ assert_operator rg.track_gain.to_f, :>, 1
71
+ end
72
+
73
+ def test_offset
74
+ tmp = new_file('sox') or return
75
+ source = DTAS::Source.new(*%W(#{tmp.path} 5s))
76
+ assert_equal 5, source.offset_samples
77
+
78
+ source = DTAS::Source.new(*%W(#{tmp.path} 1:00:00.5))
79
+ expect = 1 * 60 * 60 * 44100 + (44100/2)
80
+ assert_equal expect, source.offset_samples
81
+
82
+ source = DTAS::Source.new(*%W(#{tmp.path} 1:10.5))
83
+ expect = 1 * 60 * 44100 + (10 * 44100) + (44100/2)
84
+ assert_equal expect, source.offset_samples
85
+
86
+ source = DTAS::Source.new(*%W(#{tmp.path} 10.03))
87
+ expect = (10 * 44100) + (44100 * 3/100.0)
88
+ assert_equal expect, source.offset_samples
89
+ end
90
+
91
+ def test_offset_us
92
+ tmp = new_file('sox') or return
93
+ source = DTAS::Source.new(*%W(#{tmp.path} 441s))
94
+ assert_equal 10000.0, source.offset_us
95
+
96
+ source = DTAS::Source.new(*%W(#{tmp.path} 22050s))
97
+ assert_equal 500000.0, source.offset_us
98
+
99
+ source = DTAS::Source.new(tmp.path, '1')
100
+ assert_equal 1000000.0, source.offset_us
101
+ end
102
+ end
@@ -0,0 +1,66 @@
1
+ # -*- encoding: binary -*-
2
+ # Copyright (C) 2013, Eric Wong <normalperson@yhbt.net>
3
+ # License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
4
+ require './test/helper'
5
+ require 'tempfile'
6
+ require 'dtas/unix_server'
7
+ require 'stringio'
8
+
9
+ class TestUNIXServer < Minitest::Unit::TestCase
10
+ def setup
11
+ @tmp = Tempfile.new(%w(dtas-unix_server-test .sock))
12
+ File.unlink(@tmp.path)
13
+ @clients = []
14
+ @srv = DTAS::UNIXServer.new(@tmp.path)
15
+ end
16
+
17
+ def test_close
18
+ assert File.exist?(@tmp.path)
19
+ assert_nil @srv.close
20
+ refute File.exist?(@tmp.path)
21
+ end
22
+
23
+ def teardown
24
+ @clients.each { |io| io.close unless io.closed? }
25
+ if File.exist?(@tmp.path)
26
+ @tmp.close!
27
+ else
28
+ @tmp.close
29
+ end
30
+ end
31
+
32
+ def new_client
33
+ c = Socket.new(:AF_UNIX, :SEQPACKET, 0)
34
+ @clients << c
35
+ c.connect(Socket.pack_sockaddr_un(@tmp.path))
36
+ c
37
+ end
38
+
39
+ def test_server_loop
40
+ client = new_client
41
+ @srv.run_once # nothing
42
+ msgs = []
43
+ clients = []
44
+ client.send("HELLO", Socket::MSG_EOR)
45
+ @srv.run_once do |c, msg|
46
+ clients << c
47
+ msgs << msg
48
+ end
49
+ assert_equal %w(HELLO), msgs, clients.inspect
50
+ assert_equal 1, clients.size
51
+ c = clients[0]
52
+ c.emit "HIHI"
53
+ assert_equal "HIHI", client.recv(4)
54
+
55
+ err = nil
56
+ 500.times do
57
+ rc = c.emit "SPAM"
58
+ case rc
59
+ when StandardError
60
+ err = rc
61
+ break
62
+ end
63
+ end
64
+ assert_kind_of RuntimeError, err
65
+ end
66
+ end
data/test/test_util.rb ADDED
@@ -0,0 +1,15 @@
1
+ # -*- encoding: binary -*-
2
+ # Copyright (C) 2013, Eric Wong <normalperson@yhbt.net>
3
+ # License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
4
+ require './test/helper'
5
+ require 'dtas/util'
6
+
7
+ class TestUtil < Minitest::Unit::TestCase
8
+ include DTAS::Util
9
+ def test_util
10
+ orig = 6.0
11
+ lin = db_to_linear(orig)
12
+ db = linear_to_db(lin)
13
+ assert_in_delta orig, db, 0.00000001
14
+ end
15
+ end
metadata ADDED
@@ -0,0 +1,208 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dtas
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Eric Wong
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rdoc
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '4.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: hoe
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '3.6'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '3.6'
41
+ description: '["Free Software command-line tools for audio playback, mastering, and\nwhatever
42
+ else related to audio. dtas follows the worse-is-better\nphilosophy and acts as
43
+ duct tape to combine existing command-line tools\nfor flexibility and ease-of-development. dtas
44
+ is currently implemented\nin Ruby (and some embedded shell), but may use other languages
45
+ in the\nfuture."]'
46
+ email:
47
+ - e@80x24.org
48
+ executables:
49
+ - dtas-console
50
+ - dtas-ctl
51
+ - dtas-cueedit
52
+ - dtas-enq
53
+ - dtas-msinkctl
54
+ - dtas-player
55
+ - dtas-sinkedit
56
+ - dtas-sourceedit
57
+ - dtas-xdelay
58
+ extensions: []
59
+ extra_rdoc_files:
60
+ - Documentation/dtas-console.txt
61
+ - Documentation/dtas-ctl.txt
62
+ - Documentation/dtas-cueedit.txt
63
+ - Documentation/dtas-enq.txt
64
+ - Documentation/dtas-msinkctl.txt
65
+ - Documentation/dtas-player.txt
66
+ - Documentation/dtas-player_effects.txt
67
+ - Documentation/dtas-player_protocol.txt
68
+ - Documentation/dtas-sinkedit.txt
69
+ - Documentation/dtas-sourceedit.txt
70
+ - Documentation/dtas-xdelay.txt
71
+ - Documentation/troubleshooting.txt
72
+ files:
73
+ - .gitignore
74
+ - .rsync_doc
75
+ - COPYING
76
+ - Documentation/.gitignore
77
+ - Documentation/GNUmakefile
78
+ - Documentation/dtas-console.txt
79
+ - Documentation/dtas-ctl.txt
80
+ - Documentation/dtas-cueedit.txt
81
+ - Documentation/dtas-enq.txt
82
+ - Documentation/dtas-msinkctl.txt
83
+ - Documentation/dtas-player.txt
84
+ - Documentation/dtas-player_effects.txt
85
+ - Documentation/dtas-player_protocol.txt
86
+ - Documentation/dtas-sinkedit.txt
87
+ - Documentation/dtas-sourceedit.txt
88
+ - Documentation/dtas-xdelay.txt
89
+ - Documentation/troubleshooting.txt
90
+ - GIT-VERSION-GEN
91
+ - GNUmakefile
92
+ - HACKING
93
+ - INSTALL
94
+ - README
95
+ - Rakefile
96
+ - TODO
97
+ - bin/dtas-console
98
+ - bin/dtas-ctl
99
+ - bin/dtas-cueedit
100
+ - bin/dtas-enq
101
+ - bin/dtas-msinkctl
102
+ - bin/dtas-player
103
+ - bin/dtas-sinkedit
104
+ - bin/dtas-sourceedit
105
+ - bin/dtas-xdelay
106
+ - dtas-linux.gemspec
107
+ - dtas-mpris.gemspec
108
+ - examples/dtas_state.yml
109
+ - lib/dtas.rb
110
+ - lib/dtas/buffer.rb
111
+ - lib/dtas/buffer/read_write.rb
112
+ - lib/dtas/buffer/splice.rb
113
+ - lib/dtas/command.rb
114
+ - lib/dtas/compat_onenine.rb
115
+ - lib/dtas/disclaimer.rb
116
+ - lib/dtas/format.rb
117
+ - lib/dtas/pipe.rb
118
+ - lib/dtas/player.rb
119
+ - lib/dtas/player/client_handler.rb
120
+ - lib/dtas/process.rb
121
+ - lib/dtas/replaygain.rb
122
+ - lib/dtas/rg_state.rb
123
+ - lib/dtas/serialize.rb
124
+ - lib/dtas/sigevent.rb
125
+ - lib/dtas/sigevent/efd.rb
126
+ - lib/dtas/sigevent/pipe.rb
127
+ - lib/dtas/sink.rb
128
+ - lib/dtas/source.rb
129
+ - lib/dtas/source/command.rb
130
+ - lib/dtas/source/common.rb
131
+ - lib/dtas/source/mp3.rb
132
+ - lib/dtas/state_file.rb
133
+ - lib/dtas/unix_accepted.rb
134
+ - lib/dtas/unix_client.rb
135
+ - lib/dtas/unix_server.rb
136
+ - lib/dtas/util.rb
137
+ - lib/dtas/writable_iter.rb
138
+ - perl/dtas-graph
139
+ - pkg.mk
140
+ - setup.rb
141
+ - test/covshow.rb
142
+ - test/helper.rb
143
+ - test/player_integration.rb
144
+ - test/test_buffer.rb
145
+ - test/test_format.rb
146
+ - test/test_format_change.rb
147
+ - test/test_player.rb
148
+ - test/test_player_client_handler.rb
149
+ - test/test_player_integration.rb
150
+ - test/test_rg_integration.rb
151
+ - test/test_rg_state.rb
152
+ - test/test_sink.rb
153
+ - test/test_sink_tee_integration.rb
154
+ - test/test_source.rb
155
+ - test/test_unixserver.rb
156
+ - test/test_util.rb
157
+ - NEWS
158
+ - lib/dtas/version.rb
159
+ - man/dtas-console.1
160
+ - man/dtas-ctl.1
161
+ - man/dtas-enq.1
162
+ - man/dtas-msinkctl.1
163
+ - man/dtas-player.1
164
+ - man/dtas-player_protocol.7
165
+ - man/dtas-sinkedit.1
166
+ - man/dtas-sourceedit.1
167
+ - man/dtas-xdelay.1
168
+ - .gemtest
169
+ homepage: http://dtas.80x24.org/
170
+ licenses:
171
+ - GPLv3+
172
+ metadata: {}
173
+ post_install_message:
174
+ rdoc_options:
175
+ - --main
176
+ - README
177
+ require_paths:
178
+ - lib
179
+ required_ruby_version: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - '>='
182
+ - !ruby/object:Gem::Version
183
+ version: '0'
184
+ required_rubygems_version: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - '>='
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ requirements: []
190
+ rubyforge_project: dtas
191
+ rubygems_version: 2.0.3
192
+ signing_key:
193
+ specification_version: 4
194
+ summary: dtas
195
+ test_files:
196
+ - test/test_util.rb
197
+ - test/test_sink_tee_integration.rb
198
+ - test/test_unixserver.rb
199
+ - test/test_source.rb
200
+ - test/test_player.rb
201
+ - test/test_format_change.rb
202
+ - test/test_rg_integration.rb
203
+ - test/test_buffer.rb
204
+ - test/test_format.rb
205
+ - test/test_player_integration.rb
206
+ - test/test_player_client_handler.rb
207
+ - test/test_rg_state.rb
208
+ - test/test_sink.rb