dtas.git  about / heads / tags
duct tape audio suite for *nix
blob 3ee115e3108a172bef7552e2ea96290168e5152f 3115 bytes (raw)
name: testtest_source_av.rb 	 # note: path name is non-authoritative(*)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 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
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
 
# Copyright (C) 2013-2020 all contributors <dtas-all@nongnu.org>
# License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
# frozen_string_literal: true
require './test/helper'
require 'dtas/source/av'
require 'tempfile'

class TestSourceAv < Testcase
  def teardown
    @tempfiles.each(&:close!)
  end

  def setup
    @tempfiles = []
  end

  def x(cmd)
    system(*cmd)
    assert $?.success?, cmd.inspect
  end

  def new_file(suffix)
    tmp = Tempfile.new(%W(tmp .#{suffix}))
    @tempfiles << tmp
    cmd = %W(sox -r 44100 -b 16 -c 2 -n #{tmp.path} trim 0 1)
    return tmp if system(*cmd)
    nil
  end

  def test_flac
    return if `which metaflac`.strip.size == 0
    tmp = new_file('flac') or return

    x(%W(metaflac --set-tag=FOO=BAR #{tmp.path}))
    x(%W(metaflac --add-replay-gain #{tmp.path}))
    source = DTAS::Source::Av.new.try(tmp.path)
    assert_equal source.comments["FOO"], "BAR", source.inspect
    rg = source.replaygain('track_gain')
    assert_kind_of DTAS::ReplayGain, rg
    assert_in_delta 0.0, rg.track_peak.to_f, 0.00000001
    assert_in_delta 0.0, rg.album_peak.to_f, 0.00000001
    assert_operator rg.album_gain.to_f, :>, 1
    assert_operator rg.track_gain.to_f, :>, 1
  end

  def test_mp3gain
    return if `which mp3gain`.strip.size == 0
    a = new_file('mp3') or return
    b = new_file('mp3') or return

    # redirect stdout to /dev/null temporarily, mp3gain is noisy
    File.open("/dev/null", "w") do |null|
      old_out = $stdout.dup
      $stdout.reopen(null)
      begin
        x(%W(mp3gain -q #{a.path} #{b.path}))
      ensure
        $stdout.reopen(old_out)
        old_out.close
      end
    end

    source = DTAS::Source::Av.new.try(a.path)
    rg = source.replaygain('track_gain')
    assert_kind_of DTAS::ReplayGain, rg
    assert_in_delta 0.0, rg.track_peak.to_f, 0.00000001
    assert_in_delta 0.0, rg.album_peak.to_f, 0.00000001
    assert_operator rg.album_gain.to_f, :>, 1
    assert_operator rg.track_gain.to_f, :>, 1
  end

  def test_offset
    tmp = new_file('flac') or return
    source = DTAS::Source::Av.new.try(*%W(#{tmp.path} 5s))
    assert_equal 5, source.offset_samples

    source = DTAS::Source::Av.new.try(*%W(#{tmp.path} 1:00:00.5))
    expect = 1 * 60 * 60 * 44100 + (44100/2)
    assert_equal expect, source.offset_samples

    source = DTAS::Source::Av.new.try(*%W(#{tmp.path} 1:10.5))
    expect = 1 * 60 * 44100 + (10 * 44100) + (44100/2)
    assert_equal expect, source.offset_samples

    source = DTAS::Source::Av.new.try(*%W(#{tmp.path} 10.03))
    expect = (10 * 44100) + (44100 * 3/100.0)
    assert_equal expect, source.offset_samples
  end

  def test_offset_us
    tmp = new_file('flac') or return
    source = DTAS::Source::Av.new.try(*%W(#{tmp.path} 441s))
    assert_equal 10000.0, source.offset_us

    source = DTAS::Source::Av.new.try(*%W(#{tmp.path} 22050s))
    assert_equal 500000.0, source.offset_us

    source = DTAS::Source::Av.new.try(tmp.path, '1')
    assert_equal 1000000.0, source.offset_us
  end
end if `which avconv 2>/dev/null` =~ /avconv/ &&
       `which avprobe 2>/dev/null` =~ /avprobe/

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

git clone git://80x24.org/dtas.git
git clone https://80x24.org/dtas.git