about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--Documentation/.gitignore2
-rw-r--r--Documentation/GNUmakefile2
-rw-r--r--Documentation/dtas-archive.txt2
-rw-r--r--Documentation/dtas-console.txt2
-rw-r--r--Documentation/dtas-ctl.txt2
-rw-r--r--Documentation/dtas-cueedit.txt2
-rw-r--r--Documentation/dtas-enq.txt2
-rw-r--r--Documentation/dtas-env.txt2
-rw-r--r--Documentation/dtas-msinkctl.txt2
-rw-r--r--Documentation/dtas-player.txt2
-rw-r--r--Documentation/dtas-player_effects.txt2
-rw-r--r--Documentation/dtas-player_protocol.txt2
-rw-r--r--Documentation/dtas-player_sink_examples.txt2
-rw-r--r--Documentation/dtas-sinkedit.txt2
-rw-r--r--Documentation/dtas-sourceedit.txt2
-rw-r--r--Documentation/dtas-splitfx.txt2
-rw-r--r--Documentation/dtas-tl.txt2
-rw-r--r--Documentation/dtas-xdelay.txt2
-rwxr-xr-xDocumentation/update-footer.rb5
-rwxr-xr-xGIT-VERSION-GEN7
-rw-r--r--GNUmakefile2
-rw-r--r--HACKING2
-rw-r--r--INSTALL2
-rw-r--r--README2
-rw-r--r--Rakefile7
-rw-r--r--TODO2
-rwxr-xr-xbin/dtas-archive3
-rwxr-xr-xbin/dtas-console5
-rwxr-xr-xbin/dtas-ctl3
-rwxr-xr-xbin/dtas-cueedit3
-rwxr-xr-xbin/dtas-enq3
-rwxr-xr-xbin/dtas-mlib3
-rwxr-xr-xbin/dtas-msinkctl3
-rwxr-xr-xbin/dtas-partstats3
-rwxr-xr-xbin/dtas-player3
-rwxr-xr-xbin/dtas-readahead3
-rwxr-xr-xbin/dtas-sinkedit3
-rwxr-xr-xbin/dtas-sourceedit3
-rwxr-xr-xbin/dtas-splitfx3
-rwxr-xr-xbin/dtas-tl6
-rwxr-xr-xbin/dtas-xdelay3
-rw-r--r--dtas-linux.gemspec4
-rw-r--r--dtas-mpris.gemspec6
-rw-r--r--dtas.gemspec2
-rw-r--r--lib/dtas.rb3
-rw-r--r--lib/dtas/buffer.rb3
-rw-r--r--lib/dtas/buffer/read_write.rb5
-rw-r--r--lib/dtas/buffer/splice.rb3
-rw-r--r--lib/dtas/command.rb3
-rw-r--r--lib/dtas/compat_onenine.rb2
-rw-r--r--lib/dtas/cue_index.rb3
-rw-r--r--lib/dtas/disclaimer.rb3
-rw-r--r--lib/dtas/edit_client.rb5
-rw-r--r--lib/dtas/fadefx.rb5
-rw-r--r--lib/dtas/format.rb3
-rw-r--r--lib/dtas/mlib.rb11
-rw-r--r--lib/dtas/mlib/migrations/0001_initial.rb2
-rw-r--r--lib/dtas/parse_freq.rb4
-rw-r--r--lib/dtas/parse_time.rb3
-rw-r--r--lib/dtas/partstats.rb5
-rw-r--r--lib/dtas/pipe.rb3
-rw-r--r--lib/dtas/player.rb5
-rw-r--r--lib/dtas/player/client_handler.rb7
-rw-r--r--lib/dtas/process.rb7
-rw-r--r--lib/dtas/replaygain.rb3
-rw-r--r--lib/dtas/rg_state.rb5
-rw-r--r--lib/dtas/serialize.rb3
-rw-r--r--lib/dtas/sigevent.rb3
-rw-r--r--lib/dtas/sigevent/efd.rb2
-rw-r--r--lib/dtas/sigevent/pipe.rb5
-rw-r--r--lib/dtas/sink.rb3
-rw-r--r--lib/dtas/source.rb3
-rw-r--r--lib/dtas/source/av.rb3
-rw-r--r--lib/dtas/source/av_ff_common.rb9
-rw-r--r--lib/dtas/source/cmd.rb3
-rw-r--r--lib/dtas/source/common.rb2
-rw-r--r--lib/dtas/source/ff.rb3
-rw-r--r--lib/dtas/source/file.rb5
-rw-r--r--lib/dtas/source/mp3gain.rb3
-rw-r--r--lib/dtas/source/sox.rb10
-rw-r--r--lib/dtas/source/splitfx.rb5
-rw-r--r--lib/dtas/spawn_fix.rb2
-rw-r--r--lib/dtas/splitfx.rb5
-rw-r--r--lib/dtas/state_file.rb3
-rw-r--r--lib/dtas/tfx.rb5
-rw-r--r--lib/dtas/track.rb3
-rw-r--r--lib/dtas/tracklist.rb3
-rw-r--r--lib/dtas/unix_accepted.rb3
-rw-r--r--lib/dtas/unix_client.rb3
-rw-r--r--lib/dtas/unix_server.rb3
-rw-r--r--lib/dtas/util.rb3
-rw-r--r--lib/dtas/watchable.rb3
-rw-r--r--lib/dtas/writable_iter.rb3
-rw-r--r--lib/dtas/xs.rb3
-rwxr-xr-xperl/dtas-graph2
-rw-r--r--test/covshow.rb3
-rw-r--r--test/helper.rb3
-rw-r--r--test/player_integration.rb3
-rw-r--r--test/test_buffer.rb3
-rw-r--r--test/test_env.rb3
-rw-r--r--test/test_fadefx.rb3
-rw-r--r--test/test_format.rb3
-rw-r--r--test/test_format_change.rb3
-rw-r--r--test/test_mlib.rb3
-rw-r--r--test/test_parse_freq.rb4
-rw-r--r--test/test_player.rb3
-rw-r--r--test/test_player_client_handler.rb5
-rw-r--r--test/test_player_integration.rb3
-rw-r--r--test/test_process.rb7
-rw-r--r--test/test_rg_integration.rb3
-rw-r--r--test/test_rg_state.rb3
-rw-r--r--test/test_sink.rb3
-rw-r--r--test/test_sink_pipe_size.rb3
-rw-r--r--test/test_sink_tee_integration.rb3
-rw-r--r--test/test_source_av.rb5
-rw-r--r--test/test_source_sox.rb7
-rw-r--r--test/test_splitfx.rb3
-rw-r--r--test/test_tfx.rb3
-rw-r--r--test/test_tracklist.rb3
-rw-r--r--test/test_unixserver.rb3
-rw-r--r--test/test_util.rb3
122 files changed, 253 insertions, 166 deletions
diff --git a/.gitignore b/.gitignore
index 211acee..8ec29c2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,5 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
 /GIT-VERSION-FILE
 /Manifest.txt
 /NEWS
diff --git a/Documentation/.gitignore b/Documentation/.gitignore
index c011221..57ea590 100644
--- a/Documentation/.gitignore
+++ b/Documentation/.gitignore
@@ -1,5 +1,5 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
 *.1
 *.5
 *.7
diff --git a/Documentation/GNUmakefile b/Documentation/GNUmakefile
index f9b8204..52adf98 100644
--- a/Documentation/GNUmakefile
+++ b/Documentation/GNUmakefile
@@ -1,5 +1,5 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
 all::
 
 INSTALL = install
diff --git a/Documentation/dtas-archive.txt b/Documentation/dtas-archive.txt
index 9f2fe04..f701a5e 100644
--- a/Documentation/dtas-archive.txt
+++ b/Documentation/dtas-archive.txt
@@ -47,7 +47,7 @@ implemented by different than sox and less likely to share the same bugs
 # COPYRIGHT
 
 Copyright 2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
 
 # CONTACT
 
diff --git a/Documentation/dtas-console.txt b/Documentation/dtas-console.txt
index e76f741..1e58cc4 100644
--- a/Documentation/dtas-console.txt
+++ b/Documentation/dtas-console.txt
@@ -65,7 +65,7 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
 
 # SEE ALSO
 
diff --git a/Documentation/dtas-ctl.txt b/Documentation/dtas-ctl.txt
index 7e6d589..5954a12 100644
--- a/Documentation/dtas-ctl.txt
+++ b/Documentation/dtas-ctl.txt
@@ -68,7 +68,7 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
 
 # SEE ALSO
 
diff --git a/Documentation/dtas-cueedit.txt b/Documentation/dtas-cueedit.txt
index 3ce47a4..ab54705 100644
--- a/Documentation/dtas-cueedit.txt
+++ b/Documentation/dtas-cueedit.txt
@@ -29,7 +29,7 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
 
 # SEE ALSO
 
diff --git a/Documentation/dtas-enq.txt b/Documentation/dtas-enq.txt
index a15d87e..5cadcd6 100644
--- a/Documentation/dtas-enq.txt
+++ b/Documentation/dtas-enq.txt
@@ -34,7 +34,7 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
 
 # SEE ALSO
 
diff --git a/Documentation/dtas-env.txt b/Documentation/dtas-env.txt
index 0f59709..8393b7a 100644
--- a/Documentation/dtas-env.txt
+++ b/Documentation/dtas-env.txt
@@ -57,4 +57,4 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
diff --git a/Documentation/dtas-msinkctl.txt b/Documentation/dtas-msinkctl.txt
index 5f0ee5b..544be85 100644
--- a/Documentation/dtas-msinkctl.txt
+++ b/Documentation/dtas-msinkctl.txt
@@ -50,7 +50,7 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
 
 # SEE ALSO
 
diff --git a/Documentation/dtas-player.txt b/Documentation/dtas-player.txt
index 20f2705..1ea6c3b 100644
--- a/Documentation/dtas-player.txt
+++ b/Documentation/dtas-player.txt
@@ -117,7 +117,7 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
 
 # SEE ALSO
 
diff --git a/Documentation/dtas-player_effects.txt b/Documentation/dtas-player_effects.txt
index 58b69c7..efe6825 100644
--- a/Documentation/dtas-player_effects.txt
+++ b/Documentation/dtas-player_effects.txt
@@ -54,4 +54,4 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
diff --git a/Documentation/dtas-player_protocol.txt b/Documentation/dtas-player_protocol.txt
index 8bbb8a9..18dc2ab 100644
--- a/Documentation/dtas-player_protocol.txt
+++ b/Documentation/dtas-player_protocol.txt
@@ -323,4 +323,4 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
diff --git a/Documentation/dtas-player_sink_examples.txt b/Documentation/dtas-player_sink_examples.txt
index b696e02..e9d28a9 100644
--- a/Documentation/dtas-player_sink_examples.txt
+++ b/Documentation/dtas-player_sink_examples.txt
@@ -77,7 +77,7 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
 
 # SEE ALSO
 
diff --git a/Documentation/dtas-sinkedit.txt b/Documentation/dtas-sinkedit.txt
index 7a4f30f..9a5ac09 100644
--- a/Documentation/dtas-sinkedit.txt
+++ b/Documentation/dtas-sinkedit.txt
@@ -62,7 +62,7 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
 
 # SEE ALSO
 
diff --git a/Documentation/dtas-sourceedit.txt b/Documentation/dtas-sourceedit.txt
index 049ba57..e3592d3 100644
--- a/Documentation/dtas-sourceedit.txt
+++ b/Documentation/dtas-sourceedit.txt
@@ -70,7 +70,7 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
 
 # SEE ALSO
 
diff --git a/Documentation/dtas-splitfx.txt b/Documentation/dtas-splitfx.txt
index c077137..1bf7903 100644
--- a/Documentation/dtas-splitfx.txt
+++ b/Documentation/dtas-splitfx.txt
@@ -202,7 +202,7 @@ For reference, the "opusenc" default target is implemented as follows:
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
 
 # SEE ALSO
 
diff --git a/Documentation/dtas-tl.txt b/Documentation/dtas-tl.txt
index 51c8bc1..a1bb74d 100644
--- a/Documentation/dtas-tl.txt
+++ b/Documentation/dtas-tl.txt
@@ -88,7 +88,7 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
 
 # SEE ALSO
 
diff --git a/Documentation/dtas-xdelay.txt b/Documentation/dtas-xdelay.txt
index 0e52549..ebc13e5 100644
--- a/Documentation/dtas-xdelay.txt
+++ b/Documentation/dtas-xdelay.txt
@@ -69,7 +69,7 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
 
 # SEE ALSO
 
diff --git a/Documentation/update-footer.rb b/Documentation/update-footer.rb
index 30316ac..642bdb2 100755
--- a/Documentation/update-footer.rb
+++ b/Documentation/update-footer.rb
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright 2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+# License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
+# frozen_string_literal: true
 contact = %q{
 All feedback welcome via plain-text mail to: <dtas-all@nongnu.org>\
 Mailing list archives available at <http://80x24.org/dtas-all/> and
@@ -10,7 +11,7 @@ No subscription is necessary to post to the mailing list.
 
 copyright = %q{
 Copyright %s all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
 }
 
 ENV['TZ'] = 'UTC'
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index 5326ecd..84680a7 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 CONSTANT = "DTAS::VERSION"
 RVF = "lib/dtas/version.rb"
 GVF = "GIT-VERSION-FILE"
@@ -22,8 +23,8 @@ if File.exist?(".git")
   end
 end
 
-vn = vn.sub!(/\Av/, "")
-new_ruby_version = "#{CONSTANT} = '#{vn}' # :nodoc:\n"
+vn = vn.sub(/\Av/, "")
+new_ruby_version = "#{CONSTANT} = '#{vn}'.freeze # :nodoc:\n"
 cur_ruby_version = File.read(RVF) rescue nil
 if new_ruby_version != cur_ruby_version
   File.open(RVF, "w") { |fp| fp.write(new_ruby_version) }
diff --git a/GNUmakefile b/GNUmakefile
index d737b43..2af7646 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -1,5 +1,5 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
 all::
 pkg = dtas
 RUBY = ruby
diff --git a/HACKING b/HACKING
index 9c1564d..38ccb22 100644
--- a/HACKING
+++ b/HACKING
@@ -24,4 +24,4 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>.\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
diff --git a/INSTALL b/INSTALL
index ec20e3a..6fce79f 100644
--- a/INSTALL
+++ b/INSTALL
@@ -63,4 +63,4 @@ No subscription is necessary to post to the mailing list.
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
diff --git a/README b/README
index f4eee80..f4119e9 100644
--- a/README
+++ b/README
@@ -86,7 +86,7 @@ Atom: <http://80x24.org/dtas-all/new.atom>
 ## Copyright
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
 
 dtas is copyrighted Free Software by all contributors, see logs
 in revision control for names and email addresses of all of them.
diff --git a/Rakefile b/Rakefile
index b94fee6..be25eec 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>.
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'tempfile'
 include Rake::DSL
 
@@ -11,7 +12,7 @@ def tags
       header = header.split(/\n/)
       tagger = header.grep(/\Atagger /).first
       {
-        time: Time.at(tagger.split(/ /)[-2].to_i).utc.strftime(timefmt),
+        time: Time.at(tagger.split(' ')[-2].to_i).utc.strftime(timefmt),
         tagger_name: %r{^tagger ([^<]+)}.match(tagger)[1].strip,
         tagger_email: %r{<([^>]+)>}.match(tagger)[1].strip,
         id: `git rev-parse refs/tags/#{tag}`.chomp!,
@@ -41,7 +42,7 @@ task "NEWS" do
   fp.puts "Unreleased" unless fp.size > 0
   fp.puts "# COPYRIGHT"
   fp.puts "Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>"
-  fp.puts "License: GPLv3 or later (http://www.gnu.org/licenses/gpl-3.0.txt)"
+  fp.puts "License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>"
   fp.rewind
   assert_equal fp.read, File.read("NEWS") rescue nil
   fp.chmod 0644
diff --git a/TODO b/TODO
index 7c87fa3..165ac24 100644
--- a/TODO
+++ b/TODO
@@ -6,4 +6,4 @@
 # COPYRIGHT
 
 Copyright 2013-2015 all contributors <dtas-all@nongnu.org>\
-License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
+License: GPL-3.0+ <http://www.gnu.org/licenses/gpl-3.0.txt>
diff --git a/bin/dtas-archive b/bin/dtas-archive
index 89ca6cc..93eddaa 100755
--- a/bin/dtas-archive
+++ b/bin/dtas-archive
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 usage = "#$0 SOURCE DESTINATION"
 
 # We could use the equivalent sox command here, but some folks working on
diff --git a/bin/dtas-console b/bin/dtas-console
index a8e1838..2d39e13 100755
--- a/bin/dtas-console
+++ b/bin/dtas-console
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 #
 # Note: no idea what I'm doing, especially w.r.t. curses
 require 'dtas'
@@ -99,7 +100,7 @@ def fmt_to_s(f)
 end
 
 def rg_string(rg, current)
-  rv = "rg mode=#{rg['mode']||'off'}"
+  rv = "rg mode=#{rg['mode']||'off'}".dup
   defaults = DTAS::RGState::RG_DEFAULT
   # don't show things that are too rare
   %w(preamp fallback_gain).each do |param|
diff --git a/bin/dtas-ctl b/bin/dtas-ctl
index 4bc4dd9..3408f0c 100755
--- a/bin/dtas-ctl
+++ b/bin/dtas-ctl
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'dtas/unix_client'
 
 c = DTAS::UNIXClient.new
diff --git a/bin/dtas-cueedit b/bin/dtas-cueedit
index 5e6970f..75c8a59 100755
--- a/bin/dtas-cueedit
+++ b/bin/dtas-cueedit
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'tempfile'
 require 'dtas/xs'
 usage = "Usage: #$0 FILENAME"
diff --git a/bin/dtas-enq b/bin/dtas-enq
index e164c58..4c010a6 100755
--- a/bin/dtas-enq
+++ b/bin/dtas-enq
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'dtas/unix_client'
 c = DTAS::UNIXClient.new
 
diff --git a/bin/dtas-mlib b/bin/dtas-mlib
index e85c950..9c0b01a 100755
--- a/bin/dtas-mlib
+++ b/bin/dtas-mlib
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 usage = "#$0 [-d DATABASE-URI] ACTION [ARGS]"
 Thread.abort_on_exception = $stderr.sync = $stdout.sync = true
 trap(:INT, 'SYSTEM_DEFAULT')
diff --git a/bin/dtas-msinkctl b/bin/dtas-msinkctl
index 75770e1..17a5956 100755
--- a/bin/dtas-msinkctl
+++ b/bin/dtas-msinkctl
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'yaml'
 require 'dtas/unix_client'
 usage = "#$0 <active-set|active-add|active-sub|nonblock|active> SINK"
diff --git a/bin/dtas-partstats b/bin/dtas-partstats
index ca3ccfa..40bc622 100755
--- a/bin/dtas-partstats
+++ b/bin/dtas-partstats
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 # TODO
 # - option parsing: sox effects, stats effect options
 # - support piping out to external processes
diff --git a/bin/dtas-player b/bin/dtas-player
index 7f77544..0a14390 100755
--- a/bin/dtas-player
+++ b/bin/dtas-player
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 Thread.abort_on_exception = $stderr.sync = $stdout.sync = true
 require 'yaml'
 require 'dtas/player'
diff --git a/bin/dtas-readahead b/bin/dtas-readahead
index a4664ad..c02353a 100755
--- a/bin/dtas-readahead
+++ b/bin/dtas-readahead
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 #
 # Really janky readahead script.  Requires dtas-player to be
 # running and unlikely to work outside of Linux as it depends on
diff --git a/bin/dtas-sinkedit b/bin/dtas-sinkedit
index f0b222c..8176a53 100755
--- a/bin/dtas-sinkedit
+++ b/bin/dtas-sinkedit
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'optparse'
 require 'dtas/edit_client'
 require 'dtas/sigevent'
diff --git a/bin/dtas-sourceedit b/bin/dtas-sourceedit
index fba0511..713d424 100755
--- a/bin/dtas-sourceedit
+++ b/bin/dtas-sourceedit
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'optparse'
 require 'dtas/edit_client'
 require 'dtas/sigevent'
diff --git a/bin/dtas-splitfx b/bin/dtas-splitfx
index 08c0111..7a2ea79 100755
--- a/bin/dtas-splitfx
+++ b/bin/dtas-splitfx
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'yaml'
 require 'optparse'
 require 'dtas/splitfx'
diff --git a/bin/dtas-tl b/bin/dtas-tl
index f48c6ef..11beea9 100755
--- a/bin/dtas-tl
+++ b/bin/dtas-tl
@@ -1,7 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
-#
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 # WARNING: totally unstable API, use dtas-ctl for scripting (but the protocol
 # itself is also unstable, but better than this one probably).
 require 'dtas/unix_client'
@@ -10,7 +10,7 @@ require 'shellwords'
 def get_track_ids(c)
   track_ids = c.req("tl tracks")
   # we could get more, but SEQPACKET limits size...
-  track_ids = track_ids.split(/ /)
+  track_ids = track_ids.split(' ')
   track_ids.shift
   track_ids
 end
diff --git a/bin/dtas-xdelay b/bin/dtas-xdelay
index 05e2537..4d48e50 100755
--- a/bin/dtas-xdelay
+++ b/bin/dtas-xdelay
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 USAGE = "Usage: #$0 [-x FREQ] [-l] /dev/fd/LO /dev/fd/HI DELAY [DELAY ...]"
 require 'optparse'
 dryrun = false
diff --git a/dtas-linux.gemspec b/dtas-linux.gemspec
index 59d3c4d..2b536eb 100644
--- a/dtas-linux.gemspec
+++ b/dtas-linux.gemspec
@@ -1,5 +1,5 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
 #
 # this just declares dependencies to make gem installation a little easier
 # for Linux users
@@ -16,5 +16,5 @@ Gem::Specification.new do |s|
   s.add_dependency(%q<dtas>)
   s.add_dependency(%q<io_splice>, '~> 4')
   s.add_dependency(%q<sleepy_penguin>, '~> 3')
-  s.licenses = "GPLv3+"
+  s.licenses = 'GPL-3.0+'
 end
diff --git a/dtas-mpris.gemspec b/dtas-mpris.gemspec
index 4438192..711dd9a 100644
--- a/dtas-mpris.gemspec
+++ b/dtas-mpris.gemspec
@@ -1,6 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv2 or later <http://www.gnu.org/licenses/gpl-2.0.txt>
-# This is GPLv2+ instead of GPLv3+ because ruby-dbus is LGPLv2.1 (only)
+# License: GPL-2.0+ or later <http://www.gnu.org/licenses/gpl-2.0.txt>
+# This is GPL-2.0+ instead of GPL-3.0+ because ruby-dbus is LGPL-2.1 (only)
 Gem::Specification.new do |s|
   s.name = %q{dtas-mpris}
   s.version = '0.0.0'
@@ -14,5 +14,5 @@ Gem::Specification.new do |s|
   s.homepage = 'http://dtas.80x24.org/'
   s.add_dependency(%q<dtas>)
   s.add_dependency(%q<ruby-dbus>)
-  s.licenses = "GPLv2+"
+  s.licenses = 'GPL-2.0+'
 end
diff --git a/dtas.gemspec b/dtas.gemspec
index aa8e435..9f961bd 100644
--- a/dtas.gemspec
+++ b/dtas.gemspec
@@ -1,5 +1,5 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
 Gem::Specification.new do |s|
   manifest = File.read('.gem-manifest').split(/\n/)
   s.name = %q{dtas}
diff --git a/lib/dtas.rb b/lib/dtas.rb
index 468fc3b..ac0733f 100644
--- a/lib/dtas.rb
+++ b/lib/dtas.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 
 # DTAS currently exposes no public API for Ruby programmers.
 # See http://dtas.80x24.org/ for more info.
diff --git a/lib/dtas/buffer.rb b/lib/dtas/buffer.rb
index 23b0b77..a6124de 100644
--- a/lib/dtas/buffer.rb
+++ b/lib/dtas/buffer.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'io/wait'
 require_relative '../dtas'
 
diff --git a/lib/dtas/buffer/read_write.rb b/lib/dtas/buffer/read_write.rb
index 76c60b0..5a32e2d 100644
--- a/lib/dtas/buffer/read_write.rb
+++ b/lib/dtas/buffer/read_write.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'io/nonblock'
 require_relative '../../dtas'
 require_relative '../pipe'
@@ -12,7 +13,7 @@ module DTAS::Buffer::ReadWrite # :nodoc:
   attr_accessor :buffer_size
 
   def _rbuf
-    Thread.current[:dtas_pbuf] ||= ""
+    Thread.current[:dtas_pbuf] ||= ''.b
   end
 
   # be sure to only call this with nil when all writers to @wr are done
diff --git a/lib/dtas/buffer/splice.rb b/lib/dtas/buffer/splice.rb
index be40881..42737a1 100644
--- a/lib/dtas/buffer/splice.rb
+++ b/lib/dtas/buffer/splice.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'io/nonblock'
 require 'io/splice'
 require_relative '../../dtas'
diff --git a/lib/dtas/command.rb b/lib/dtas/command.rb
index 3f27c61..e7df32d 100644
--- a/lib/dtas/command.rb
+++ b/lib/dtas/command.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative 'serialize'
 require 'shellwords'
 
diff --git a/lib/dtas/compat_onenine.rb b/lib/dtas/compat_onenine.rb
index bd74eee..2755a7f 100644
--- a/lib/dtas/compat_onenine.rb
+++ b/lib/dtas/compat_onenine.rb
@@ -1,5 +1,5 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
 
 # Make Ruby 1.9.3 look like Ruby 2.0.0 to us
 # This exists for Debian wheezy users using the stock Ruby 1.9.3 install.
diff --git a/lib/dtas/cue_index.rb b/lib/dtas/cue_index.rb
index 9fca5c2..568fd56 100644
--- a/lib/dtas/cue_index.rb
+++ b/lib/dtas/cue_index.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../dtas'
 
 # embedded CUE sheet representation for -player
diff --git a/lib/dtas/disclaimer.rb b/lib/dtas/disclaimer.rb
index 897668b..9211403 100644
--- a/lib/dtas/disclaimer.rb
+++ b/lib/dtas/disclaimer.rb
@@ -1,6 +1,7 @@
 # :enddoc:
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 DTAS_PROGNAME = File.basename($0)
 DTAS_DISCLAIMER = <<EOF
 # WARNING!
diff --git a/lib/dtas/edit_client.rb b/lib/dtas/edit_client.rb
index 21c7662..da34023 100644
--- a/lib/dtas/edit_client.rb
+++ b/lib/dtas/edit_client.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'tempfile'
 require 'yaml'
 require_relative 'unix_client'
@@ -13,7 +14,7 @@ module DTAS::EditClient # :nodoc:
       v.empty? and next
       return v
     end
-    "vi"
+    'vi'.freeze
   end
 
   def client_socket
diff --git a/lib/dtas/fadefx.rb b/lib/dtas/fadefx.rb
index 899505b..577d103 100644
--- a/lib/dtas/fadefx.rb
+++ b/lib/dtas/fadefx.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../dtas'
 require_relative 'parse_time'
 require_relative 'xs'
@@ -94,7 +95,7 @@ class DTAS::FadeFX # :nodoc:
   def parse!(str)
     return nil if str.empty?
     type = "t"
-    str.sub!(/\A([a-z])/, "") and type = $1
+    str.sub!(/\A([a-z])/, "") and type = $1.freeze
     F.new(type, parse_time(str))
   end
 end
diff --git a/lib/dtas/format.rb b/lib/dtas/format.rb
index cfcec64..ee456d1 100644
--- a/lib/dtas/format.rb
+++ b/lib/dtas/format.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../dtas'
 require_relative 'process'
 require_relative 'serialize'
diff --git a/lib/dtas/mlib.rb b/lib/dtas/mlib.rb
index 9160567..d883523 100644
--- a/lib/dtas/mlib.rb
+++ b/lib/dtas/mlib.rb
@@ -1,7 +1,8 @@
 # -*- encoding: utf-8 -*-
 # Copyright (C) 2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
-
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
+#
 require_relative '../dtas'
 require_relative 'process'
 require 'socket'
@@ -97,9 +98,9 @@ class DTAS::Mlib # :nodoc:
     return ignore(job) unless String === buf
 
     # no, we don't support comments with newlines in them
-    buf = buf.split("\n".freeze)
+    buf = buf.split("\n")
     while line = buf.shift
-      tag, value = line.split('='.freeze, 2)
+      tag, value = line.split('=', 2)
       tag && value or next
       tag.downcase!
       tag_id = @tag_map[tag] or next
@@ -396,7 +397,7 @@ class DTAS::Mlib # :nodoc:
     parts.unshift('')
     cache[parent_id] = parts.join('/')
     parts << base
-    parts.join('/')
+    parts.join('/').freeze
   end
 
   def emit_recurse(node, cache, cb)
diff --git a/lib/dtas/mlib/migrations/0001_initial.rb b/lib/dtas/mlib/migrations/0001_initial.rb
index f147cbe..dfab271 100644
--- a/lib/dtas/mlib/migrations/0001_initial.rb
+++ b/lib/dtas/mlib/migrations/0001_initial.rb
@@ -1,5 +1,5 @@
 # Copyright (C) 2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
 
 Sequel.migration do
   up do
diff --git a/lib/dtas/parse_freq.rb b/lib/dtas/parse_freq.rb
index db1b33f..1d1e850 100644
--- a/lib/dtas/parse_freq.rb
+++ b/lib/dtas/parse_freq.rb
@@ -1,6 +1,6 @@
 # Copyright (C) 2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
-
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../dtas'
 module DTAS::ParseFreq # :nodoc:
 
diff --git a/lib/dtas/parse_time.rb b/lib/dtas/parse_time.rb
index 5c22baf..f4215cb 100644
--- a/lib/dtas/parse_time.rb
+++ b/lib/dtas/parse_time.rb
@@ -1,6 +1,7 @@
 # frozen_string_literal: true
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../dtas'
 
 module DTAS::ParseTime # :nodoc:
diff --git a/lib/dtas/partstats.rb b/lib/dtas/partstats.rb
index 7019b3d..30be807 100644
--- a/lib/dtas/partstats.rb
+++ b/lib/dtas/partstats.rb
@@ -1,6 +1,7 @@
 # -*- encoding: binary -*-
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../dtas'
 require_relative 'xs'
 require_relative 'process'
@@ -73,7 +74,7 @@ class DTAS::PartStats # :nodoc:
     fails = []
     do_spawn = lambda do |trim_part|
       pid, rpipe = partstats_spawn(trim_part, opts)
-      rset[rpipe] = [ trim_part, "" ]
+      rset[rpipe] = [ trim_part, ''.b ]
       pids[pid] = [ trim_part, rpipe ]
     end
 
diff --git a/lib/dtas/pipe.rb b/lib/dtas/pipe.rb
index cc1c3b5..7bb57ed 100644
--- a/lib/dtas/pipe.rb
+++ b/lib/dtas/pipe.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 begin
   require 'io/splice'
 rescue LoadError
diff --git a/lib/dtas/player.rb b/lib/dtas/player.rb
index 554a53f..06300b4 100644
--- a/lib/dtas/player.rb
+++ b/lib/dtas/player.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'yaml'
 require 'shellwords'
 require_relative '../dtas'
@@ -76,7 +77,7 @@ class DTAS::Player # :nodoc:
         end
       end
     end
-    $stdout.write(msg << "\n")
+    $stdout.write("#{msg}\n")
   end
 
   # used for state file
diff --git a/lib/dtas/player/client_handler.rb b/lib/dtas/player/client_handler.rb
index 498388e..4499259 100644
--- a/lib/dtas/player/client_handler.rb
+++ b/lib/dtas/player/client_handler.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../xs'
 require_relative '../parse_time'
 
@@ -139,7 +140,7 @@ module DTAS::Player::ClientHandler # :nodoc:
 
       # multiple changes may be made at once
       msg[2..-1].each do |kv|
-        k, v = kv.split(/=/, 2)
+        k, v = kv.split('=', 2)
         case k
         when %r{\Aenv\.([^=]+)\z}
           sink.env[$1] = v
@@ -244,7 +245,7 @@ module DTAS::Player::ClientHandler # :nodoc:
     return io.emit(@rg.to_hsh.to_yaml) if msg.empty?
     before = @rg.to_hsh
     msg.each do |kv|
-      k, v = kv.split(/=/, 2)
+      k, v = kv.split('=', 2)
       case k
       when "mode"
         case v
diff --git a/lib/dtas/process.rb b/lib/dtas/process.rb
index 8c46d9d..310e0b2 100644
--- a/lib/dtas/process.rb
+++ b/lib/dtas/process.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'io/wait'
 require 'shellwords'
 require_relative '../dtas'
@@ -87,7 +88,7 @@ module DTAS::Process # :nodoc:
       cmd, opts = env, cmd
       env = {}
     end
-    buf = ''
+    buf = ''.b
     r, w = DTAS::Nonblock.pipe
     opts = opts.merge(out: w)
     r.binmode
@@ -102,7 +103,7 @@ module DTAS::Process # :nodoc:
     w.close
     if err_str
       we.close
-      res = "".b
+      res = ''.b
       want = { r => res, re => err_str }
       begin
         readable = IO.select(want.keys) or next
diff --git a/lib/dtas/replaygain.rb b/lib/dtas/replaygain.rb
index cc96d54..63eb615 100644
--- a/lib/dtas/replaygain.rb
+++ b/lib/dtas/replaygain.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 
 # Represents ReplayGain metadata for a DTAS::Source, only used by -player
 # cleanup/validate values to prevent malicious files from making us
diff --git a/lib/dtas/rg_state.rb b/lib/dtas/rg_state.rb
index 18f4429..caf1cc7 100644
--- a/lib/dtas/rg_state.rb
+++ b/lib/dtas/rg_state.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 #
 # provides support for generating appropriate effects for ReplayGain
 # MAYBE: account for non-standard reference loudness (89.0 dB is standard)
@@ -72,7 +73,7 @@ class DTAS::RGState # :nodoc:
     when -1 then return 'gain -192'
     when 1 then return 'gain 192'
     else
-      sprintf('gain %0.8g', val)
+      sprintf('gain %0.8g', val).freeze
     end
   end
 
diff --git a/lib/dtas/serialize.rb b/lib/dtas/serialize.rb
index 1a7d477..f03e244 100644
--- a/lib/dtas/serialize.rb
+++ b/lib/dtas/serialize.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 
 # used to serialize player state to the state file
 module DTAS::Serialize # :nodoc:
diff --git a/lib/dtas/sigevent.rb b/lib/dtas/sigevent.rb
index 303459a..55dc0f0 100644
--- a/lib/dtas/sigevent.rb
+++ b/lib/dtas/sigevent.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 begin
   raise LoadError, "no eventfd with _DTAS_POSIX" if ENV["_DTAS_POSIX"]
   require 'sleepy_penguin'
diff --git a/lib/dtas/sigevent/efd.rb b/lib/dtas/sigevent/efd.rb
index 26c8025..daae4ff 100644
--- a/lib/dtas/sigevent/efd.rb
+++ b/lib/dtas/sigevent/efd.rb
@@ -1,5 +1,5 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
 
 # used in various places for safe wakeups from IO.select via signals
 # This requires a modern Linux system and the "sleepy_penguin" RubyGem
diff --git a/lib/dtas/sigevent/pipe.rb b/lib/dtas/sigevent/pipe.rb
index 5dd01a6..f30bb5b 100644
--- a/lib/dtas/sigevent/pipe.rb
+++ b/lib/dtas/sigevent/pipe.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 
 # used in various places for safe wakeups from IO.select via signals
 # A fallback for non-Linux systems lacking the "sleepy_penguin" RubyGem
@@ -9,7 +10,7 @@ class DTAS::Sigevent # :nodoc:
 
   def initialize
     @to_io, @wr = DTAS::Nonblock.pipe
-    @rbuf = ''
+    @rbuf = ''.b
   end
 
   def signal
diff --git a/lib/dtas/sink.rb b/lib/dtas/sink.rb
index 0bf49f4..dce5a59 100644
--- a/lib/dtas/sink.rb
+++ b/lib/dtas/sink.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'yaml'
 require_relative '../dtas'
 require_relative 'pipe'
diff --git a/lib/dtas/source.rb b/lib/dtas/source.rb
index ad8f017..6f3049b 100644
--- a/lib/dtas/source.rb
+++ b/lib/dtas/source.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../dtas'
 
 module DTAS::Source # :nodoc:
diff --git a/lib/dtas/source/av.rb b/lib/dtas/source/av.rb
index c86b5d2..baeaee4 100644
--- a/lib/dtas/source/av.rb
+++ b/lib/dtas/source/av.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../../dtas'
 require_relative 'av_ff_common'
 
diff --git a/lib/dtas/source/av_ff_common.rb b/lib/dtas/source/av_ff_common.rb
index 9f29b02..e1f221b 100644
--- a/lib/dtas/source/av_ff_common.rb
+++ b/lib/dtas/source/av_ff_common.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../../dtas'
 require_relative '../source'
 require_relative '../replaygain'
@@ -75,7 +76,7 @@ module DTAS::Source::AvFfCommon # :nodoc:
       cmd.concat(%W(-show_streams -show_format #@infile))
       break if cmd == prev_cmd
 
-      err = ""
+      err = "".b
       s = qx(@env, cmd, err_str: err, no_raise: true)
       return false unless probe_ok?(s, err)
       s.scan(%r{^\[STREAM\]\n(.*?)\n\[/STREAM\]\n}mn) do |_|
@@ -93,10 +94,10 @@ module DTAS::Source::AvFfCommon # :nodoc:
     end while incomplete.compact[0]
 
     s.scan(%r{^\[FORMAT\]\n(.*?)\n\[/FORMAT\]\n}m) do |_|
-      f = $1
+      f = $1.dup
       f =~ /^duration=([\d\.]+)\s*$/nm and @duration = $1.to_f
       # TODO: multi-line/multi-value/repeated tags
-      f.gsub!(/^TAG:([^=]+)=(.*)$/ni) { |_| @comments[$1.upcase] = $2 }
+      f.gsub!(/^TAG:([^=]+)=(.*)$/ni) { |_| @comments[$1.upcase.freeze] = $2 }
     end
     ! @astreams.compact.empty?
   end
diff --git a/lib/dtas/source/cmd.rb b/lib/dtas/source/cmd.rb
index 4e730ea..46cf1b4 100644
--- a/lib/dtas/source/cmd.rb
+++ b/lib/dtas/source/cmd.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../../dtas'
 require_relative '../source'
 require_relative '../command'
diff --git a/lib/dtas/source/common.rb b/lib/dtas/source/common.rb
index 94cea7d..bb4a40e 100644
--- a/lib/dtas/source/common.rb
+++ b/lib/dtas/source/common.rb
@@ -1,5 +1,5 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
 module DTAS::Source::Common # :nodoc:
   attr_reader :dst_zero_byte # first byte this source object saw
   attr_reader :dst
diff --git a/lib/dtas/source/ff.rb b/lib/dtas/source/ff.rb
index d5e744c..33b46e9 100644
--- a/lib/dtas/source/ff.rb
+++ b/lib/dtas/source/ff.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../../dtas'
 require_relative 'av_ff_common'
 
diff --git a/lib/dtas/source/file.rb b/lib/dtas/source/file.rb
index 75b4a43..7f99ad0 100644
--- a/lib/dtas/source/file.rb
+++ b/lib/dtas/source/file.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../../dtas'
 require_relative '../source'
 require_relative '../command'
@@ -67,7 +68,7 @@ module DTAS::Source::File # :nodoc:
   # creates the effect to fill the TRIMFX env
   def trimfx
     return unless @offset || @trim
-    fx = "trim #{offset_samples}s"
+    fx = "trim #{offset_samples}s".dup
     if @trim && @trim[1]
       fx << sprintf(' =%0.9gs', (@trim[0] + @trim[1]) * format.rate)
     end
diff --git a/lib/dtas/source/mp3gain.rb b/lib/dtas/source/mp3gain.rb
index 6637768..0b3d481 100644
--- a/lib/dtas/source/mp3gain.rb
+++ b/lib/dtas/source/mp3gain.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../process'
 
 module DTAS::Source::Mp3gain # :nodoc:
diff --git a/lib/dtas/source/sox.rb b/lib/dtas/source/sox.rb
index 6f02f99..701a36a 100644
--- a/lib/dtas/source/sox.rb
+++ b/lib/dtas/source/sox.rb
@@ -1,5 +1,7 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
+# encoding: binary
 require_relative '../../dtas'
 require_relative '../source'
 require_relative '../replaygain'
@@ -39,7 +41,7 @@ class DTAS::Source::Sox # :nodoc:
   end
 
   def try(infile, offset = nil, trim = nil)
-    err = ""
+    err = "".b
     cmd = %W(soxi -s #{infile})
     s = qx(@env.dup, cmd, err_str: err, no_raise: true)
     return if err =~ /soxi FAIL formats:/
@@ -65,8 +67,8 @@ class DTAS::Source::Sox # :nodoc:
     tmp = {}
     case @infile
     when String
-      qx(@env, %W(soxi -a #@infile)).split(/\n/n).each do |line|
-        key, value = line.split(/=/n, 2)
+      qx(@env, %W(soxi -a #@infile)).split("\n").each do |line|
+        key, value = line.split('=', 2)
         key && value or next
         # TODO: multi-line/multi-value/repeated tags
         tmp[key.upcase] = value
diff --git a/lib/dtas/source/splitfx.rb b/lib/dtas/source/splitfx.rb
index 02c3a9d..fad165f 100644
--- a/lib/dtas/source/splitfx.rb
+++ b/lib/dtas/source/splitfx.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2014-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later <https://www.gnu.org/licenses/gpl-3.0.txt>
+# License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
+# frozen_string_literal: true
 require 'yaml'
 require_relative 'sox'
 require_relative '../splitfx'
@@ -27,7 +28,7 @@ class DTAS::Source::SplitFX < DTAS::Source::Sox # :nodoc:
     return false if !st.file? || st.size > MAX_YAML_SIZE
 
     # read 4 bytes first to ensure we have a YAML file with a hash:
-    buf = ""
+    buf = "".dup
     File.open(ymlfile, "rb") do |fp|
       return false if fp.read(4, buf) != "---\n"
       buf << fp.read
diff --git a/lib/dtas/spawn_fix.rb b/lib/dtas/spawn_fix.rb
index ebde23c..f02e26f 100644
--- a/lib/dtas/spawn_fix.rb
+++ b/lib/dtas/spawn_fix.rb
@@ -1,5 +1,5 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
 # workaround for older Rubies: https://bugs.ruby-lang.org/issues/8770
 module DTAS::SpawnFix # :nodoc:
   def spawn(*args)
diff --git a/lib/dtas/splitfx.rb b/lib/dtas/splitfx.rb
index 3474a6d..4084393 100644
--- a/lib/dtas/splitfx.rb
+++ b/lib/dtas/splitfx.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../dtas'
 require_relative 'format'
 require_relative 'process'
@@ -35,7 +36,7 @@ class DTAS::SplitFX # :nodoc:
   class T < Struct.new(:env, :comments, :tbeg, :fade_in, :fade_out) # :nodoc:
     def commit(advance_track_samples)
       tlen = advance_track_samples - tbeg
-      trimfx = "trim #{tbeg}s #{tlen}s"
+      trimfx = "trim #{tbeg}s #{tlen}s".dup
       if fade_in
         trimfx << " #{fade_in}"
       end
diff --git a/lib/dtas/state_file.rb b/lib/dtas/state_file.rb
index 26f588f..4eb2a9f 100644
--- a/lib/dtas/state_file.rb
+++ b/lib/dtas/state_file.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'yaml'
 require 'tempfile'
 
diff --git a/lib/dtas/tfx.rb b/lib/dtas/tfx.rb
index ff03819..cc175f4 100644
--- a/lib/dtas/tfx.rb
+++ b/lib/dtas/tfx.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../dtas'
 require_relative 'parse_time'
 require_relative 'format'
@@ -69,7 +70,7 @@ class DTAS::TFX # :nodoc:
   def parse_trim!(args)
     tbeg = parse_time(args.shift)
     if args[0] =~ /\A=?[\d\.]+\z/
-      tlen = args.shift
+      tlen = args.shift.dup
       is_stop_time = tlen.sub!(/\A=/, "") ? true : false
       tlen = parse_time(tlen)
       tlen = tlen - tbeg if is_stop_time
diff --git a/lib/dtas/track.rb b/lib/dtas/track.rb
index b69f63f..2a68cd7 100644
--- a/lib/dtas/track.rb
+++ b/lib/dtas/track.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../dtas'
 
 class DTAS::Track # :nodoc:
diff --git a/lib/dtas/tracklist.rb b/lib/dtas/tracklist.rb
index 726a46a..2cc27d2 100644
--- a/lib/dtas/tracklist.rb
+++ b/lib/dtas/tracklist.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../dtas'
 require_relative 'serialize'
 require_relative 'track'
diff --git a/lib/dtas/unix_accepted.rb b/lib/dtas/unix_accepted.rb
index cb7bdda..00b4e2e 100644
--- a/lib/dtas/unix_accepted.rb
+++ b/lib/dtas/unix_accepted.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'socket'
 require 'io/wait'
 
diff --git a/lib/dtas/unix_client.rb b/lib/dtas/unix_client.rb
index 2c8ba43..bdc5524 100644
--- a/lib/dtas/unix_client.rb
+++ b/lib/dtas/unix_client.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../dtas'
 require_relative 'xs'
 require 'socket'
diff --git a/lib/dtas/unix_server.rb b/lib/dtas/unix_server.rb
index e11b0d7..e6fe869 100644
--- a/lib/dtas/unix_server.rb
+++ b/lib/dtas/unix_server.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'socket'
 require_relative '../dtas'
 require_relative 'unix_accepted'
diff --git a/lib/dtas/util.rb b/lib/dtas/util.rb
index 8098cc5..18a2e08 100644
--- a/lib/dtas/util.rb
+++ b/lib/dtas/util.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../dtas'
 
 # in case we need to convert DB values to a linear scale
diff --git a/lib/dtas/watchable.rb b/lib/dtas/watchable.rb
index 60bade0..86ea57c 100644
--- a/lib/dtas/watchable.rb
+++ b/lib/dtas/watchable.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later <https://www.gnu.org/licenses/gpl-3.0.txt>
+# License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
+# frozen_string_literal: true
 begin
 require 'sleepy_penguin'
 
diff --git a/lib/dtas/writable_iter.rb b/lib/dtas/writable_iter.rb
index 9ddcb30..2026d83 100644
--- a/lib/dtas/writable_iter.rb
+++ b/lib/dtas/writable_iter.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../dtas'
 
 # used to manage writable state for -player pipes
diff --git a/lib/dtas/xs.rb b/lib/dtas/xs.rb
index 7b3a0c2..becbb80 100644
--- a/lib/dtas/xs.rb
+++ b/lib/dtas/xs.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative '../dtas'
 require 'shellwords'
 
diff --git a/perl/dtas-graph b/perl/dtas-graph
index e718977..0149e46 100755
--- a/perl/dtas-graph
+++ b/perl/dtas-graph
@@ -1,6 +1,6 @@
 #!/usr/bin/perl -w
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
 use strict;
 use Graph::Easy; # for ASCII-art graphs
 $^O =~ /linux/ or print STDERR "$0 probably only works on Linux...\n";
diff --git a/test/covshow.rb b/test/covshow.rb
index 13274b9..a7e1368 100644
--- a/test/covshow.rb
+++ b/test/covshow.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 #
 # this works with the __covmerge method in test/helper.rb
 # run this file after all tests are run
diff --git a/test/helper.rb b/test/helper.rb
index c78e14b..9bf0d0d 100644
--- a/test/helper.rb
+++ b/test/helper.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 $stdout.sync = $stderr.sync = Thread.abort_on_exception = true
 require 'thread'
 WAIT_ALL_MTX = Mutex.new
diff --git a/test/player_integration.rb b/test/player_integration.rb
index bce2621..f282a05 100644
--- a/test/player_integration.rb
+++ b/test/player_integration.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/helper'
 require 'dtas/player'
 require 'dtas/state_file'
diff --git a/test/test_buffer.rb b/test/test_buffer.rb
index 72a8593..ae0c203 100644
--- a/test/test_buffer.rb
+++ b/test/test_buffer.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/helper'
 require 'stringio'
 require 'dtas/buffer'
diff --git a/test/test_env.rb b/test/test_env.rb
index 6b36f32..3bbb372 100644
--- a/test/test_env.rb
+++ b/test/test_env.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative 'helper'
 require 'dtas/process'
 class TestEnv < Testcase
diff --git a/test/test_fadefx.rb b/test/test_fadefx.rb
index 5c84578..a82e9c1 100644
--- a/test/test_fadefx.rb
+++ b/test/test_fadefx.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative 'helper'
 require 'dtas/fadefx'
 require 'dtas/format'
diff --git a/test/test_format.rb b/test/test_format.rb
index 11faf16..7d9ffee 100644
--- a/test/test_format.rb
+++ b/test/test_format.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/helper'
 require 'tempfile'
 require 'dtas/format'
diff --git a/test/test_format_change.rb b/test/test_format_change.rb
index 6fcb967..ee96de3 100644
--- a/test/test_format_change.rb
+++ b/test/test_format_change.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/player_integration'
 require 'tmpdir'
 class TestFormatChange < Testcase
diff --git a/test/test_mlib.rb b/test/test_mlib.rb
index 072d1d0..bc3088a 100644
--- a/test/test_mlib.rb
+++ b/test/test_mlib.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative 'helper'
 begin
   require 'dtas/mlib'
diff --git a/test/test_parse_freq.rb b/test/test_parse_freq.rb
index 1dcd8d6..7b3cb60 100644
--- a/test/test_parse_freq.rb
+++ b/test/test_parse_freq.rb
@@ -1,7 +1,7 @@
 # Copyright (C) 2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/helper'
-
 require 'dtas/parse_freq'
 
 class TestParseFreq < Testcase
diff --git a/test/test_player.rb b/test/test_player.rb
index fe61441..6959a38 100644
--- a/test/test_player.rb
+++ b/test/test_player.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/helper'
 require 'tempfile'
 require 'dtas/player'
diff --git a/test/test_player_client_handler.rb b/test/test_player_client_handler.rb
index a100ad1..955a7dd 100644
--- a/test/test_player_client_handler.rb
+++ b/test/test_player_client_handler.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/helper'
 require 'dtas/player'
 
@@ -88,7 +89,7 @@ class TestPlayerClientHandler < Testcase
     res = @io[0]
     result = {}
     Shellwords.split(res).each do |kv|
-      k, v = kv.split(/=/, 2)
+      k, v = kv.split('=', 2)
       result[k] = v
     end
     expect = ENV.to_hash
diff --git a/test/test_player_integration.rb b/test/test_player_integration.rb
index acbb75c..982b83b 100644
--- a/test/test_player_integration.rb
+++ b/test/test_player_integration.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/player_integration'
 class TestPlayerIntegration < Testcase
   include PlayerIntegration
diff --git a/test/test_process.rb b/test/test_process.rb
index c6354cc..4170846 100644
--- a/test/test_process.rb
+++ b/test/test_process.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/helper'
 require 'dtas/process'
 class TestProcess < Testcase
@@ -7,7 +8,7 @@ class TestProcess < Testcase
 
   def test_encoding
     assert_equal Encoding::BINARY, qx('echo HIHIH').encoding
-    s = ""
+    s = "".b
     a = qx('echo HIHIHI; echo >&2 BYEBYE', err_str: s)
     assert_equal Encoding::BINARY, a.encoding
   end
@@ -23,7 +24,7 @@ class TestProcess < Testcase
   end
 
   def test_qx_err_str
-    s = ""
+    s = "".b
     assert_equal "", qx('echo HELLO >&2', err_str: s)
     assert_equal "HELLO\n", s
   end
diff --git a/test/test_rg_integration.rb b/test/test_rg_integration.rb
index efc8f97..917a046 100644
--- a/test/test_rg_integration.rb
+++ b/test/test_rg_integration.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/player_integration'
 require 'dtas/util'
 class TestRgIntegration < Testcase
diff --git a/test/test_rg_state.rb b/test/test_rg_state.rb
index b16438c..a26eb13 100644
--- a/test/test_rg_state.rb
+++ b/test/test_rg_state.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/helper'
 require 'dtas/rg_state'
 
diff --git a/test/test_sink.rb b/test/test_sink.rb
index e23315a..ead76ad 100644
--- a/test/test_sink.rb
+++ b/test/test_sink.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/helper'
 require 'dtas/sink'
 require 'yaml'
diff --git a/test/test_sink_pipe_size.rb b/test/test_sink_pipe_size.rb
index ef56bc5..0c2fe30 100644
--- a/test/test_sink_pipe_size.rb
+++ b/test/test_sink_pipe_size.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 begin
   require 'io/splice'
   require './test/player_integration'
diff --git a/test/test_sink_tee_integration.rb b/test/test_sink_tee_integration.rb
index 77d374b..f51b4b1 100644
--- a/test/test_sink_tee_integration.rb
+++ b/test/test_sink_tee_integration.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/player_integration'
 class TestSinkTeeIntegration < Testcase
   include PlayerIntegration
diff --git a/test/test_source_av.rb b/test/test_source_av.rb
index 09b220e..af68002 100644
--- a/test/test_source_av.rb
+++ b/test/test_source_av.rb
@@ -1,12 +1,13 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# 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 { |tmp| tmp.close! }
+    @tempfiles.each(&:close!)
   end
 
   def setup
diff --git a/test/test_source_sox.rb b/test/test_source_sox.rb
index d9d9503..e9fc0f8 100644
--- a/test/test_source_sox.rb
+++ b/test/test_source_sox.rb
@@ -1,12 +1,13 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/helper'
 require 'dtas/source/sox'
 require 'tempfile'
 
 class TestSource < Testcase
   def teardown
-    @tempfiles.each { |tmp| tmp.close! }
+    @tempfiles.each(&:close!)
   end
 
   def setup
@@ -134,7 +135,7 @@ class TestSource < Testcase
 
   def test_flac_cuesheet_48
     return if `which metaflac`.strip.size == 0
-    ver = `flac --version`.split(/ /)[1].strip
+    ver = `flac --version`.split(' ')[1].strip
     ver.to_f >= 1.3 or return # flac 1.3.0 fixed non-44.1k rate support
 
     tmp = Tempfile.new(%W(tmp .flac))
diff --git a/test/test_splitfx.rb b/test/test_splitfx.rb
index 49df49d..198517a 100644
--- a/test/test_splitfx.rb
+++ b/test/test_splitfx.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require 'yaml'
 require 'dtas/splitfx'
 require 'thread'
diff --git a/test/test_tfx.rb b/test/test_tfx.rb
index 59aa697..a4d8214 100644
--- a/test/test_tfx.rb
+++ b/test/test_tfx.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/helper'
 require 'dtas/tfx'
 require 'dtas/format'
diff --git a/test/test_tracklist.rb b/test/test_tracklist.rb
index c05090c..3842daf 100644
--- a/test/test_tracklist.rb
+++ b/test/test_tracklist.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require_relative 'helper'
 require 'dtas/tracklist'
 class TestTracklist < Testcase
diff --git a/test/test_unixserver.rb b/test/test_unixserver.rb
index 2a84dcb..c5032ba 100644
--- a/test/test_unixserver.rb
+++ b/test/test_unixserver.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/helper'
 require 'tempfile'
 require 'dtas/unix_server'
diff --git a/test/test_util.rb b/test/test_util.rb
index c1eb463..ebdb534 100644
--- a/test/test_util.rb
+++ b/test/test_util.rb
@@ -1,5 +1,6 @@
 # Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
-# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
+# License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt)
+# frozen_string_literal: true
 require './test/helper'
 require 'dtas/util'