Class: CarrierWave::AudioWaveform::WaveformData

Inherits:
Object
  • Object
show all
Defined in:
lib/carrierwave/audio_waveform/waveform_data.rb,
lib/carrierwave/audio_waveform/waveform_data.rb

Defined Under Namespace

Classes: ArgumentError, Log, RuntimeError

Constant Summary collapse

DefaultOptions =
{
  pixels_per_second: 10,
  bits: 16
}

Class Method Summary collapse

Class Method Details

.generate(source, options = {}) ⇒ Object

Generate a Waveform image at the given filename with the given options.

Available options (all optional) are:

:convert_to_extension_before_processing => Symbolized extension (:wav, :mp3, etc.)
Useful if .wav or .mp3 isn't being passed in--you can convert to that format first.

:set_extension_before_processing => Symbolized extension (:wav, :mp3, etc.)
This is useful because CarrierWave will send files in with the wrong extension sometimes.
For instance, if this is nested under a version, that version may be an .mp3, but its parent

:pixels_per_second => The number of pixels per second to evaluate.

:bits => 8 or 16 bit precision

:logger => IOStream to log progress to.

Example:

CarrierWave::AudioWaveform::Waveformer.generate("Kickstart My Heart.wav")
CarrierWave::AudioWaveform::Waveformer.generate("Kickstart My Heart.wav", :method => :rms)
CarrierWave::AudioWaveform::Waveformer.generate("Kickstart My Heart.wav", :color => "#ff00ff", :logger => $stdout)

Raises:



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/carrierwave/audio_waveform/waveform_data.rb', line 40

def generate(source, options={})
  options = DefaultOptions.merge(options)
  options[:filename] ||= self.generate_json_filename(source)
  old_source = source
  if options[:convert_to_extension_before_processing]
    source = generate_valid_source(source, options[:convert_to_extension_before_processing])
  elsif options[:set_extension_before_processing]
    source = generate_proper_source(source, options[:set_extension_before_processing])
  end

  raise ArgumentError.new("No source audio filename given, must be an existing sound file.") unless source
  raise ArgumentError.new("No destination filename given for waveform") unless options[:filename]
  raise RuntimeError.new("Source audio file '#{source}' not found.") unless File.exist?(source)

  @log = Log.new(options[:logger])
  @log.start!

  @log.timed("\nGenerating...") do
    stdout_str, stderr_str, status = self.generate_waveform_data(source, options)
    if stderr_str.present? && !stderr_str.include?("Recoverable")
      raise RuntimeError.new(stderr_str)
    end
  end

  if source != old_source && options[:convert_to_extension_before_processing]
    @log.out("Removing temporary file at #{source}")
    FileUtils.rm(source)
  elsif source != old_source && options[:set_extension_before_processing]
    @log.out("Renaming file at #{source}")
    old_ext = File.extname(source).gsub(/\./, '').to_sym
    generate_proper_source(source, old_ext)
  end

  @log.done!("Generated waveform data '#{options[:filename]}'")

  options[:filename]
end

.generate_json_filename(source) ⇒ Object



78
79
80
81
82
# File 'lib/carrierwave/audio_waveform/waveform_data.rb', line 78

def generate_json_filename(source)
  ext = File.extname(source)
  source_file_path_without_extension = File.join File.dirname(source), File.basename(source, ext)
  "#{source_file_path_without_extension}.json"
end

.generate_waveform_data(source, options = DefaultOptions) ⇒ Object



84
85
86
87
88
89
# File 'lib/carrierwave/audio_waveform/waveform_data.rb', line 84

def generate_waveform_data(source, options = DefaultOptions)
  options[:filename] ||= self.generate_json_filename(source)
  Open3.capture3(
    "audiowaveform -i #{source} --pixels-per-second #{options[:pixels_per_second]} -b #{options[:bits]} -o #{options[:filename]}"
  )
end