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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 95cea9c51fc4befa828c208dabf229b37dbc3582
4
- data.tar.gz: 4bb3019027d4864ea6d6e9fd8026b236c2f0070f
3
+ metadata.gz: 161846cfdf7681efdb615adfff1fbdf0fff1efe7
4
+ data.tar.gz: c3c4c03f5f66ba0df0d26f59d216f0e0d4046e4d
5
5
  SHA512:
6
- metadata.gz: 795146ad7d81aeabfa30ad36b1de0bf92402428f1c6388f9ba5e2e51df95a773feaf312d38889aa88ee9ab635d61e6b9f082518a03b9614636107b4ebb5dc331
7
- data.tar.gz: 75076a786083803900a61adee4847326866f6e08cd8bf624c1b3b4fa021e1f80a991c37be78782caae3888ec5d3c26c6869f29de6bc016c5b65dd90c499e3a6c
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
@@ -4,7 +4,7 @@
4
4
  CONSTANT = "DTAS::VERSION"
5
5
  RVF = "lib/dtas/version.rb"
6
6
  GVF = "GIT-VERSION-FILE"
7
- DEF_VER = "v0.6.0"
7
+ DEF_VER = "v0.7.0"
8
8
  vn = DEF_VER
9
9
 
10
10
  # First see if there is a version file (included in release tarballs),
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.5.0.tar.gz
43
+ http://dtas.80x24.org/2013/dtas-0.7.0.tar.gz
44
44
 
45
- $ tar zxvf dtas-0.5.0.tar.gz
46
- $ cd dtas-0.5.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
@@ -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.readpartial(MAX_AT_ONCE, buf)
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
- bytes = inflight
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)
@@ -69,7 +69,9 @@ module DTAS::Buffer::Splice # :nodoc:
69
69
  end
70
70
 
71
71
  def broadcast_inf(targets)
72
- if targets.none? { |sink| sink.nonblock? }
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]
@@ -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, :wait_readable) }
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 { |t| t.sink }
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! { |i| i.to_s }.join(' '))
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 { |ci| ci.to_hash } }
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)
@@ -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
- outfmt.bits && outfmt.bits <= 16 and env["DITHERFX"] = "dither -s"
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|
@@ -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
- begin
97
- # give IO.select one-shot behavior, snapshot and replace the watchlist
98
- r = IO.select(@readers.keys, @writers.keys) or return
99
- r[1].each do |io|
100
- @writers.delete(io)
101
- wait_ctl(io, io.writable_iter)
102
- end
103
- r[0].each do |io|
104
- @readers.delete(io)
105
- wait_ctl(io, io.readable_iter { |_io, msg| yield(_io, msg) })
106
- end
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
@@ -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
@@ -15,6 +15,11 @@ class TestBuffer < Testcase
15
15
 
16
16
  def pipe
17
17
  ret = IO.pipe
18
+ ret.each do |x|
19
+ def x.ready_write_optimized?
20
+ false
21
+ end
22
+ end
18
23
  @to_close.concat(ret)
19
24
  ret
20
25
  end
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.6.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-10-19 00:00:00.000000000 Z
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.1.3
185
+ rubygems_version: 2.2.0
186
186
  signing_key:
187
187
  specification_version: 4
188
188
  summary: duct tape audio suite for *nix