1cabdff1aSopenharmony_ci#!/usr/bin/env ruby
2cabdff1aSopenharmony_ci
3cabdff1aSopenharmony_cirequire 'open3'
4cabdff1aSopenharmony_cirequire 'json'
5cabdff1aSopenharmony_ci
6cabdff1aSopenharmony_ciffmpeg_bin = 'ffmpeg'
7cabdff1aSopenharmony_citarget_il  = -24.0
8cabdff1aSopenharmony_citarget_lra = +11.0
9cabdff1aSopenharmony_citarget_tp  = -2.0
10cabdff1aSopenharmony_cisamplerate = '48k'
11cabdff1aSopenharmony_ci
12cabdff1aSopenharmony_ciif ARGF.argv.count != 2
13cabdff1aSopenharmony_ci  puts "Usage: #{$PROGRAM_NAME} input.wav output.wav"
14cabdff1aSopenharmony_ci  exit 1
15cabdff1aSopenharmony_ciend
16cabdff1aSopenharmony_ci
17cabdff1aSopenharmony_ciff_cmd = Array.new([
18cabdff1aSopenharmony_ci  ffmpeg_bin,
19cabdff1aSopenharmony_ci  '-hide_banner',
20cabdff1aSopenharmony_ci  '-i', ARGF.argv[0],
21cabdff1aSopenharmony_ci  '-af', "loudnorm='I=#{target_il}:LRA=#{target_lra}:tp=#{target_tp}:print_format=json'",
22cabdff1aSopenharmony_ci  '-f', 'null',
23cabdff1aSopenharmony_ci  '-']);
24cabdff1aSopenharmony_ci
25cabdff1aSopenharmony_ci_stdin, _stdout, stderr, wait_thr = Open3.popen3(*ff_cmd)
26cabdff1aSopenharmony_ci
27cabdff1aSopenharmony_ciif wait_thr.value.success?
28cabdff1aSopenharmony_ci  stats = JSON.parse(stderr.read.lines[-12, 12].join)
29cabdff1aSopenharmony_ci  loudnorm_string  = 'loudnorm='
30cabdff1aSopenharmony_ci  loudnorm_string += 'print_format=summary:'
31cabdff1aSopenharmony_ci  loudnorm_string += 'linear=true:'
32cabdff1aSopenharmony_ci  loudnorm_string += "I=#{target_il}:"
33cabdff1aSopenharmony_ci  loudnorm_string += "LRA=#{target_lra}:"
34cabdff1aSopenharmony_ci  loudnorm_string += "tp=#{target_tp}:"
35cabdff1aSopenharmony_ci  loudnorm_string += "measured_I=#{stats['input_i']}:"
36cabdff1aSopenharmony_ci  loudnorm_string += "measured_LRA=#{stats['input_lra']}:"
37cabdff1aSopenharmony_ci  loudnorm_string += "measured_tp=#{stats['input_tp']}:"
38cabdff1aSopenharmony_ci  loudnorm_string += "measured_thresh=#{stats['input_thresh']}:"
39cabdff1aSopenharmony_ci  loudnorm_string += "offset=#{stats['target_offset']}"
40cabdff1aSopenharmony_cielse
41cabdff1aSopenharmony_ci  puts stderr.read
42cabdff1aSopenharmony_ci  exit 1
43cabdff1aSopenharmony_ciend
44cabdff1aSopenharmony_ci
45cabdff1aSopenharmony_ciff_cmd = Array.new([
46cabdff1aSopenharmony_ci  ffmpeg_bin,
47cabdff1aSopenharmony_ci  '-y', '-hide_banner',
48cabdff1aSopenharmony_ci  '-i', ARGF.argv[0],
49cabdff1aSopenharmony_ci  '-af', loudnorm_string,
50cabdff1aSopenharmony_ci  '-ar', samplerate,
51cabdff1aSopenharmony_ci  ARGF.argv[1].to_s]);
52cabdff1aSopenharmony_ci
53cabdff1aSopenharmony_ci_stdin, _stdout, stderr, wait_thr = Open3.popen3(*ff_cmd)
54cabdff1aSopenharmony_ci
55cabdff1aSopenharmony_ciif wait_thr.value.success?
56cabdff1aSopenharmony_ci  puts stderr.read.lines[-12, 12].join
57cabdff1aSopenharmony_ci  exit 0
58cabdff1aSopenharmony_cielse
59cabdff1aSopenharmony_ci  puts stderr.read
60cabdff1aSopenharmony_ci  exit 1
61cabdff1aSopenharmony_ciend
62