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 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