Class: DTAS::TrimFX

Inherits:
Object
  • Object
show all
Includes:
ParseTime
Defined in:
lib/dtas/trimfx.rb

Defined Under Namespace

Classes: TFXSort

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ParseTime

#parse_time

Constructor Details

#initialize(args) ⇒ TrimFX

Returns a new instance of TrimFX.



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/dtas/trimfx.rb', line 14

def initialize(args)
  args = args.dup
  case args.shift
  when "trim"
    parse_trim!(args)
  when "all"
    @tbeg = 0
    @tlen = nil
  else
    raise ArgumentError, "#{args.inspect} not understood"
  end
  case tmp =  args.shift
  when "sh" then @cmd = args
  when "sox" then tfx_sox(args)
  when "eca" then tfx_eca(args)
  when nil
    @cmd = []
  else
    raise ArgumentError, "unknown effect type: #{tmp}"
  end
end

Instance Attribute Details

#cmdObject (readonly)

Returns the value of attribute cmd.



12
13
14
# File 'lib/dtas/trimfx.rb', line 12

def cmd
  @cmd
end

#tbegObject (readonly)

Returns the value of attribute tbeg.



10
11
12
# File 'lib/dtas/trimfx.rb', line 10

def tbeg
  @tbeg
end

#tlenObject (readonly)

Returns the value of attribute tlen.



11
12
13
# File 'lib/dtas/trimfx.rb', line 11

def tlen
  @tlen
end

Class Method Details

.expand(ary, total_len) ⇒ Object



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/dtas/trimfx.rb', line 119

def self.expand(ary, total_len)
  rv = []
  schedule(ary).each_with_index do |sary, i|
    tip = 0
    dst = rv[i] = []
    while tfx = sary.shift
      if tfx.tbeg > tip
        nfx = new(%W(trim #{tip} =#{tfx.tbeg}))
        dst << nfx
        dst << tfx
        tip = tfx.tbeg + tfx.tlen
      end
    end
    if tip < total_len
      nfx = new(%W(trim #{tip} =#{total_len}))
      dst << nfx
    end
  end
  rv
end

.schedule(ary) ⇒ Object

there’ll be multiple epochs if ranges overlap



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/dtas/trimfx.rb', line 91

def self.schedule(ary)
  sorted = []
  ary.each_with_index { |tfx, i| sorted << TFXSort[tfx, i] }
  sorted.sort!
  rv = []
  epoch = 0
  prev_end = 0
  defer = []
  begin
    while tfxsort = sorted.shift
      tfx = tfxsort.tfx
      if tfx.tbeg >= prev_end
        prev_end = tfx.tbeg + tfx.tlen
        (rv[epoch] ||= []) << tfx
      else
        defer << tfxsort
      end
    end
    if defer[0]
      epoch += 1
      sorted = defer
      defer = []
      prev_end = 0
    end
  end while sorted[0]
  rv
end

Instance Method Details

#<=>(other) ⇒ Object



78
79
80
# File 'lib/dtas/trimfx.rb', line 78

def <=>(other)
  tbeg <=> other.tbeg
end

#parse_trim!(args) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/dtas/trimfx.rb', line 62

def parse_trim!(args)
  tbeg = parse_time(args.shift)
  if args[0] =~ /\A=?[\d\.]+\z/
    tlen = args.shift
    is_stop_time = tlen.sub!(/\A=/, "") ? true : false
    tlen = parse_time(tlen)
    if is_stop_time
      tlen = tlen - tbeg
    end
  else
    tlen = nil
  end
  @tbeg = tbeg
  @tlen = tlen
end

#tfx_eca(args) ⇒ Object



41
42
43
44
45
46
# File 'lib/dtas/trimfx.rb', line 41

def tfx_eca(args)
  @cmd = %w(sox $SOXIN $SOX2ECA $TRIMFX)
  @cmd.concat(%w(| ecasound $ECAFMT -i stdin -o stdout))
  @cmd.concat(args)
  @cmd.concat(%w(| sox $ECA2SOX - $SOXOUT))
end

#tfx_sox(args) ⇒ Object



36
37
38
39
# File 'lib/dtas/trimfx.rb', line 36

def tfx_sox(args)
  @cmd = %w(sox $SOXIN $SOXOUT $TRIMFX)
  @cmd.concat(args)
end

#to_sox_arg(format) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/dtas/trimfx.rb', line 48

def to_sox_arg(format)
  if @tbeg && @tlen
    beg = @tbeg * format.rate
    len = @tlen * format.rate
    %W(trim #{beg.round}s #{len.round}s)
  elsif @tbeg
    return [] if @tbeg == 0
    beg = @tbeg * format.rate
    %W(trim #{beg.round}s)
  else
    []
  end
end