dtas 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Documentation/dtas-splitfx.txt +4 -0
- data/GIT-VERSION-GEN +1 -1
- data/INSTALL +3 -3
- data/bin/dtas-splitfx +1 -0
- data/lib/dtas/buffer/read_write.rb +5 -3
- data/lib/dtas/buffer/splice.rb +3 -1
- data/lib/dtas/player.rb +9 -1
- data/lib/dtas/player/client_handler.rb +3 -3
- data/lib/dtas/splitfx.rb +5 -1
- data/lib/dtas/unix_server.rb +16 -11
- data/lib/dtas/writable_iter.rb +16 -0
- data/test/test_buffer.rb +5 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 161846cfdf7681efdb615adfff1fbdf0fff1efe7
|
4
|
+
data.tar.gz: c3c4c03f5f66ba0df0d26f59d216f0e0d4046e4d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6df024d59f87441b02c45cd1461c3598afcc80e0fe34b138531b9ad657fe01836cdfe6438d560607ae0642c23accbbd5fb89d17305fd60200f714b6467ea9082
|
7
|
+
data.tar.gz: 82dcabe750e95a1650ec1e4c83da1fc25e1752a75bbb4670982f73b813965e3729c4f59197174df16de68cf4c53877436b91b9b208ab92b002fced1a0abdff29
|
@@ -31,6 +31,10 @@ to use ecasound(1), too.
|
|
31
31
|
-s, \--quiet, \--silent
|
32
32
|
: Silent operation, commands are not printed as executed
|
33
33
|
|
34
|
+
-D, \--no-dither
|
35
|
+
: Disable automatic setting of the DITHERFX env. This also passes
|
36
|
+
the option to sox(1) via SOX_OPTS.
|
37
|
+
|
34
38
|
# FILE FORMAT
|
35
39
|
|
36
40
|
* infile - string, the pathname of the original audio file
|
data/GIT-VERSION-GEN
CHANGED
data/INSTALL
CHANGED
@@ -40,10 +40,10 @@ For future upgrades of dtas (upgrades to dtas-linux will be infrequent)
|
|
40
40
|
|
41
41
|
Grab the latest tarball from our HTTP site:
|
42
42
|
|
43
|
-
http://dtas.80x24.org/2013/dtas-0.
|
43
|
+
http://dtas.80x24.org/2013/dtas-0.7.0.tar.gz
|
44
44
|
|
45
|
-
$ tar zxvf dtas-0.
|
46
|
-
$ cd dtas-0.
|
45
|
+
$ tar zxvf dtas-0.7.0.tar.gz
|
46
|
+
$ cd dtas-0.7.0
|
47
47
|
$ sudo ruby setup.rb
|
48
48
|
|
49
49
|
GNU/Linux users may optionally install "io_splice" and
|
data/bin/dtas-splitfx
CHANGED
@@ -13,6 +13,7 @@ OptionParser.new('', 24, ' ') do |op|
|
|
13
13
|
op.on('-n', '--dry-run') { opts[:dryrun] = true }
|
14
14
|
op.on('-j', '--jobs [JOBS]', Integer) { |val| opts[:jobs] = val }
|
15
15
|
op.on('-s', '--quiet', '--silent') { |val| opts[:silent] = true }
|
16
|
+
op.on('-D', '--no-dither') { |val| opts[:no_dither] = true }
|
16
17
|
op.parse!(ARGV)
|
17
18
|
end
|
18
19
|
|
@@ -26,12 +26,14 @@ module DTAS::Buffer::ReadWrite # :nodoc:
|
|
26
26
|
# always block when we have a single target
|
27
27
|
def broadcast_one(targets)
|
28
28
|
buf = _rbuf
|
29
|
-
@to_io.
|
29
|
+
@to_io.read_nonblock(MAX_AT_ONCE, buf)
|
30
30
|
n = targets[0].write(buf) # IO#write has write-in-full behavior
|
31
31
|
@bytes_xfer += n
|
32
32
|
:wait_readable
|
33
33
|
rescue EOFError
|
34
34
|
nil
|
35
|
+
rescue Errno::EAGAIN
|
36
|
+
:wait_readable
|
35
37
|
rescue Errno::EPIPE, IOError => e
|
36
38
|
__dst_error(targets[0], e)
|
37
39
|
targets.clear
|
@@ -39,8 +41,7 @@ module DTAS::Buffer::ReadWrite # :nodoc:
|
|
39
41
|
end
|
40
42
|
|
41
43
|
def broadcast_inf(targets)
|
42
|
-
|
43
|
-
nr_nb = targets.count { |sink| sink.nonblock? }
|
44
|
+
nr_nb = targets.count(&:nonblock?)
|
44
45
|
if nr_nb == 0 || nr_nb == targets.size
|
45
46
|
# if all targets are full, don't start until they're all writable
|
46
47
|
r = IO.select(nil, targets, nil, 0) or return targets
|
@@ -57,6 +58,7 @@ module DTAS::Buffer::ReadWrite # :nodoc:
|
|
57
58
|
again = {}
|
58
59
|
|
59
60
|
# don't pin too much on one target
|
61
|
+
bytes = inflight
|
60
62
|
bytes = bytes > MAX_AT_ONCE ? MAX_AT_ONCE : bytes
|
61
63
|
buf = _rbuf
|
62
64
|
@to_io.read(bytes, buf)
|
data/lib/dtas/buffer/splice.rb
CHANGED
@@ -69,7 +69,9 @@ module DTAS::Buffer::Splice # :nodoc:
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def broadcast_inf(targets)
|
72
|
-
if targets.
|
72
|
+
if targets.all?(&:ready_write_optimized?)
|
73
|
+
blocked = []
|
74
|
+
elsif targets.none?(&:nonblock?)
|
73
75
|
# if all targets are blocking, don't start until they're all writable
|
74
76
|
r = IO.select(nil, targets, nil, 0) or return targets
|
75
77
|
blocked = targets - r[1]
|
data/lib/dtas/player.rb
CHANGED
@@ -300,12 +300,19 @@ class DTAS::Player # :nodoc:
|
|
300
300
|
end
|
301
301
|
end
|
302
302
|
|
303
|
+
def _optimize_write_prepare(targets)
|
304
|
+
targets.each do |dst|
|
305
|
+
dst.wait_writable_prepare
|
306
|
+
@srv.wait_ctl(dst, :wait_writable)
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
303
310
|
# returns a wait_ctl arg for self
|
304
311
|
def broadcast_iter(buf, targets)
|
305
312
|
case rv = buf.broadcast(targets)
|
306
313
|
when Array # array of blocked sinks
|
307
314
|
# have sinks wake up the this buffer when they're writable
|
308
|
-
trade_ctl = proc { @srv.wait_ctl(buf, :
|
315
|
+
trade_ctl = proc { @srv.wait_ctl(buf, :hot_read) }
|
309
316
|
rv.each do |dst|
|
310
317
|
dst.on_writable = trade_ctl
|
311
318
|
@srv.wait_ctl(dst, :wait_writable)
|
@@ -315,6 +322,7 @@ class DTAS::Player # :nodoc:
|
|
315
322
|
# via DTAS::Sink#writable_iter
|
316
323
|
:ignore
|
317
324
|
else # :wait_readable or nil
|
325
|
+
_optimize_write_prepare(targets)
|
318
326
|
rv
|
319
327
|
end
|
320
328
|
end
|
@@ -265,7 +265,7 @@ module DTAS::Player::ClientHandler # :nodoc:
|
|
265
265
|
end
|
266
266
|
|
267
267
|
def active_sinks
|
268
|
-
sinks = @targets.map
|
268
|
+
sinks = @targets.map(&:sink)
|
269
269
|
sinks.uniq!
|
270
270
|
sinks
|
271
271
|
end
|
@@ -588,7 +588,7 @@ module DTAS::Player::ClientHandler # :nodoc:
|
|
588
588
|
io.emit("#{res.size} #{res.join(' ')}")
|
589
589
|
when "tracks"
|
590
590
|
tracks = @tl.tracks
|
591
|
-
io.emit("#{tracks.size} " << tracks.map!
|
591
|
+
io.emit("#{tracks.size} " << tracks.map!(&:to_s).join(' '))
|
592
592
|
when "goto"
|
593
593
|
track_id = msg.shift or return io.emit("ERR track_id not specified")
|
594
594
|
offset = msg.shift # may be nil
|
@@ -660,7 +660,7 @@ module DTAS::Player::ClientHandler # :nodoc:
|
|
660
660
|
bp = cur.cuebreakpoints
|
661
661
|
case msg[0]
|
662
662
|
when nil
|
663
|
-
tmp = { "infile" => cur.infile, "cue" => bp.map
|
663
|
+
tmp = { "infile" => cur.infile, "cue" => bp.map(&:to_hash) }
|
664
664
|
io.emit(tmp.to_yaml)
|
665
665
|
when "next", "prev"
|
666
666
|
return __bp_prev_next(io, msg, cur, bp)
|
data/lib/dtas/splitfx.rb
CHANGED
@@ -173,7 +173,11 @@ class DTAS::SplitFX # :nodoc:
|
|
173
173
|
end
|
174
174
|
|
175
175
|
# add noise-shaped dither for 16-bit (sox manual seems to recommend this)
|
176
|
-
|
176
|
+
if opts[:no_dither]
|
177
|
+
env["SOX_OPTS"] = "#{ENV["SOX_OPTS"]} -D"
|
178
|
+
else outfmt.bits && outfmt.bits <= 16
|
179
|
+
env["DITHERFX"] = "dither -s"
|
180
|
+
end
|
177
181
|
comments = Tempfile.new(%W(dtas-splitfx-#{t.comments["TRACKNUMBER"]} .txt))
|
178
182
|
comments.sync = true
|
179
183
|
t.comments.each do |k,v|
|
data/lib/dtas/unix_server.rb
CHANGED
@@ -69,6 +69,11 @@ class DTAS::UNIXServer # :nodoc:
|
|
69
69
|
|
70
70
|
def wait_ctl(io, err)
|
71
71
|
case err
|
72
|
+
when :hot_read
|
73
|
+
# this is only safe when we're iterating through ready writers
|
74
|
+
# the linear search for Array#include? is not expensive since
|
75
|
+
# we usually don't have a lot of sinks.
|
76
|
+
@hot_read << io unless @hot_read.include?(io)
|
72
77
|
when :wait_readable
|
73
78
|
@readers[io] = true
|
74
79
|
when :wait_writable
|
@@ -93,17 +98,17 @@ class DTAS::UNIXServer # :nodoc:
|
|
93
98
|
end
|
94
99
|
|
95
100
|
def run_once
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
101
|
+
# give IO.select one-shot behavior, snapshot and replace the watchlist
|
102
|
+
r = IO.select(@readers.keys, @writers.keys) or return
|
103
|
+
@hot_read = r[0]
|
104
|
+
r[1].each do |io|
|
105
|
+
@writers.delete(io)
|
106
|
+
wait_ctl(io, io.writable_iter)
|
107
|
+
end
|
108
|
+
@hot_read = nil
|
109
|
+
r[0].each do |io|
|
110
|
+
@readers.delete(io)
|
111
|
+
wait_ctl(io, io.readable_iter { |_io, msg| yield(_io, msg) })
|
107
112
|
end
|
108
113
|
end
|
109
114
|
end
|
data/lib/dtas/writable_iter.rb
CHANGED
@@ -4,9 +4,24 @@ require_relative '../dtas'
|
|
4
4
|
|
5
5
|
module DTAS::WritableIter # :nodoc:
|
6
6
|
attr_accessor :on_writable
|
7
|
+
# we may use the ready_write flag to avoid an extra IO.select
|
8
|
+
attr_accessor :ready_write
|
7
9
|
|
8
10
|
def writable_iter_init
|
11
|
+
@mark_writable = proc { @ready_write = true }
|
9
12
|
@on_writable = nil
|
13
|
+
@ready_write = true
|
14
|
+
end
|
15
|
+
|
16
|
+
def ready_write_optimized?
|
17
|
+
rv = @ready_write
|
18
|
+
@ready_write = false
|
19
|
+
rv
|
20
|
+
end
|
21
|
+
|
22
|
+
def wait_writable_prepare
|
23
|
+
@ready_write = false
|
24
|
+
@on_writable ||= @mark_writable
|
10
25
|
end
|
11
26
|
|
12
27
|
# this is used to exchange our own writable status for the readable
|
@@ -14,6 +29,7 @@ module DTAS::WritableIter # :nodoc:
|
|
14
29
|
def writable_iter
|
15
30
|
if owr = @on_writable
|
16
31
|
@on_writable = nil
|
32
|
+
@ready_write = true
|
17
33
|
owr.call # this triggers readability watching of DTAS::Buffer
|
18
34
|
end
|
19
35
|
:ignore
|
data/test/test_buffer.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dtas
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dtas hackers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-12-30 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |-
|
14
14
|
Free Software command-line tools for audio playback, mastering, and
|
@@ -34,7 +34,7 @@ executables:
|
|
34
34
|
extensions: []
|
35
35
|
extra_rdoc_files: []
|
36
36
|
files:
|
37
|
-
- .gitignore
|
37
|
+
- ".gitignore"
|
38
38
|
- COPYING
|
39
39
|
- Documentation/.gitignore
|
40
40
|
- Documentation/GNUmakefile
|
@@ -172,17 +172,17 @@ require_paths:
|
|
172
172
|
- lib
|
173
173
|
required_ruby_version: !ruby/object:Gem::Requirement
|
174
174
|
requirements:
|
175
|
-
- -
|
175
|
+
- - ">="
|
176
176
|
- !ruby/object:Gem::Version
|
177
177
|
version: '0'
|
178
178
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
179
|
requirements:
|
180
|
-
- -
|
180
|
+
- - ">="
|
181
181
|
- !ruby/object:Gem::Version
|
182
182
|
version: '0'
|
183
183
|
requirements: []
|
184
184
|
rubyforge_project:
|
185
|
-
rubygems_version: 2.
|
185
|
+
rubygems_version: 2.2.0
|
186
186
|
signing_key:
|
187
187
|
specification_version: 4
|
188
188
|
summary: duct tape audio suite for *nix
|