Module: DTAS::Source::File

Includes:
Command, Process, Common, Mp3gain
Included in:
AvFfCommon, Sox
Defined in:
lib/dtas/source/file.rb

Overview

:nodoc:

Constant Summary collapse

FILE_SIVS =

for the “current” command

%w(infile comments command env)
SRC_SIVS =
%w(command env tryorder)

Constants included from Process

Process::PIDS

Constants included from Command

Command::COMMAND_DEFAULTS

Instance Attribute Summary collapse

Attributes included from Common

#dst, #dst_zero_byte, #requeued

Attributes included from Command

#command, #env, #pid, #spawn_at, #to_io

Instance Method Summary collapse

Methods included from Mp3gain

#__mp3gain_peak, #mp3gain_comments

Methods included from Process

#dtas_spawn, #env_expand, #env_expand_ary, #env_expand_i, #qx, reaper

Methods included from DTAS::SpawnFix

#spawn

Methods included from XS

#xs

Methods included from Common

#dst_assoc

Methods included from Command

#command_init, #command_string, #on_death

Methods included from DTAS::Serialize

#ivars_to_hash

Instance Attribute Details

#infileObject (readonly)

Returns the value of attribute infile.


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

def infile
  @infile
end

#offsetObject (readonly)

Returns the value of attribute offset.


13
14
15
# File 'lib/dtas/source/file.rb', line 13

def offset
  @offset
end

#tryorderObject

Returns the value of attribute tryorder.


14
15
16
# File 'lib/dtas/source/file.rb', line 14

def tryorder
  @tryorder
end

Instance Method Details

#__file_init(infile, offset, trim) ⇒ Object


31
32
33
34
35
36
37
38
39
40
41
# File 'lib/dtas/source/file.rb', line 31

def __file_init(infile, offset, trim)
  @env = @env.dup
  @format = nil
  @infile = infile
  @offset = offset
  @trim = trim
  @comments = nil
  @samples = nil
  @cuebp = nil
  @rg = nil
end

#__offset_samplesObject


58
59
60
61
62
63
64
65
66
# File 'lib/dtas/source/file.rb', line 58

def __offset_samples
  return 0 unless @offset
  case @offset
  when /\A\d+s\z/
    @offset.to_i
  else
    format.hhmmss_to_samples(@offset)
  end
end

#commentsObject


85
86
87
# File 'lib/dtas/source/file.rb', line 85

def comments
  @comments ||= __load_comments
end

#cuebreakpointsObject


115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/dtas/source/file.rb', line 115

def cuebreakpoints
  rv = @cuebp and return rv
  rv = []
  begin
    str = qx(@env, %W(metaflac --export-cuesheet-to=- #@infile))
  rescue
    return rv
  end
  str.scan(/^    INDEX (\d+) (\S+)/) do |m|
    index = m[0]
    time = m[1].dup
    case time
    when /\A\d+\z/
      time << "s" # sample count (flac 1.3.0)
    else # HH:MM:SS:FF
      # FF/75 CDDA frames per second, convert to fractional seconds
      time.sub!(/:(\d+)\z/, "")
      frames = $1.to_f
      if frames > 0
        time = sprintf("#{time}.%0.6g", frames / 75.0)
      end
    end
    rv << DTAS::CueIndex.new(index, time)
  end
  @cuebp = rv
end

#load!(src_hsh) ⇒ Object


104
105
106
107
108
# File 'lib/dtas/source/file.rb', line 104

def load!(src_hsh)
  SRC_SIVS.each do |field|
    val = src_hsh[field] and instance_variable_set("@#{field}", val)
  end
end

#offset_samplesObject

returns any offset in samples (relative to the original source file), likely zero unless seek was used


51
52
53
54
55
56
# File 'lib/dtas/source/file.rb', line 51

def offset_samples
  off = __offset_samples
  return off unless @trim
  tbeg = @trim[0] * format.rate
  tbeg < off ? off : tbeg
end

#offset_usObject

this exists mainly to make the mpris interface easier, but it's not necessary, the mpris interface also knows the sample rate


45
46
47
# File 'lib/dtas/source/file.rb', line 45

def offset_us
  (offset_samples / format.rate.to_f) * 1000000
end

#replaygain(mode) ⇒ Object


95
96
97
98
# File 'lib/dtas/source/file.rb', line 95

def replaygain(mode)
  @rg ||= DTAS::ReplayGain.new(comments, mode) ||
          DTAS::ReplayGain.new(mp3gain_comments, mode)
end

#samples!Object

A user may be downloading the file and start playing it before the download completes, this refreshes


80
81
82
83
# File 'lib/dtas/source/file.rb', line 80

def samples!
  @samples = nil
  samples
end

#source_file_dup(infile, offset, trim) ⇒ Object


25
26
27
28
29
# File 'lib/dtas/source/file.rb', line 25

def source_file_dup(infile, offset, trim)
  rv = dup
  rv.__file_init(infile, offset, trim)
  rv
end

#to_hashObject


89
90
91
92
93
# File 'lib/dtas/source/file.rb', line 89

def to_hash
  rv = ivars_to_hash(FILE_SIVS)
  rv["samples"] = samples
  rv
end

#to_source_catObject


100
101
102
# File 'lib/dtas/source/file.rb', line 100

def to_source_cat
  ivars_to_hash(SRC_SIVS)
end

#to_state_hashObject


110
111
112
113
# File 'lib/dtas/source/file.rb', line 110

def to_state_hash
  defaults = source_defaults # see dtas/source/{av,sox}.rb
  to_source_cat.delete_if { |k,v| v == defaults[k] }
end

#trimfxObject

creates the effect to fill the TRIMFX env


69
70
71
72
73
74
75
76
# File 'lib/dtas/source/file.rb', line 69

def trimfx
  return unless @offset || @trim
  fx = "trim #{offset_samples}s".dup
  if @trim && @trim[1]
    fx << sprintf(' =%0.9gs', (@trim[0] + @trim[1]) * format.rate)
  end
  fx
end