dtas 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|