about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/dtas/source/splitfx.rb14
-rw-r--r--lib/dtas/splitfx.rb10
-rw-r--r--lib/dtas/watchable.rb21
3 files changed, 35 insertions, 10 deletions
diff --git a/lib/dtas/source/splitfx.rb b/lib/dtas/source/splitfx.rb
index b7b9b86..02c3a9d 100644
--- a/lib/dtas/source/splitfx.rb
+++ b/lib/dtas/source/splitfx.rb
@@ -17,6 +17,7 @@ class DTAS::Source::SplitFX < DTAS::Source::Sox # :nodoc:
 
   def initialize(sox = DTAS::Source::Sox.new)
     command_init(SPLITFX_DEFAULTS)
+    @watch_extra = []
     @sox = sox
   end
 
@@ -65,6 +66,19 @@ class DTAS::Source::SplitFX < DTAS::Source::Sox # :nodoc:
     e = @env.merge!(player_format.to_env)
     @sfx.infile_env(e, @sox.infile)
 
+    # watch any scripts or files the command in the YAML file refers to
+    if c = @sfx.command
+      @sfx.expand_cmd(e, c).each do |f|
+        File.readable?(f) and @watch_extra << f
+      end
+    end
+
+    # allow users to specify explicit depdendencies to watch for edit
+    case extra = @ymlhash['deps']
+    when Array, String
+      @watch_extra.concat(Array(extra))
+    end
+
     # make sure these are visible to the "current" command...
     e["TRIMFX"] = trimfx
     e["RGFX"] = rg_state.effect(self) || nil
diff --git a/lib/dtas/splitfx.rb b/lib/dtas/splitfx.rb
index 5a1431a..cc459ae 100644
--- a/lib/dtas/splitfx.rb
+++ b/lib/dtas/splitfx.rb
@@ -14,7 +14,7 @@ class DTAS::SplitFX # :nodoc:
         '$TRIMFX $FX $RATEFX $DITHERFX'
   include DTAS::Process
   include DTAS::XS
-  attr_reader :infile, :env
+  attr_reader :infile, :env, :command
 
   class UTrim
     attr_reader :env, :comments
@@ -229,11 +229,11 @@ class DTAS::SplitFX # :nodoc:
       sub_env_s = sub_env.inject("") { |s,(k,v)| s << "#{k}=#{v} " }
       env['SOXFMT'] = '-tsox'
       sub_env['OUTFMT'] = env.delete('OUTFMT')
-      show_cmd = [ _expand_cmd(env, player_cmd), '|', '(', "#{sub_env_s};",
-                   _expand_cmd(env.merge(sub_env), command), ')' ].flatten
+      show_cmd = [ expand_cmd(env, player_cmd), '|', '(', "#{sub_env_s};",
+                   expand_cmd(env.merge(sub_env), command), ')' ].flatten
       command = "#{player_cmd} | (#{sub_env_s}; #{command})"
     else
-      show_cmd = _expand_cmd(env, command)
+      show_cmd = expand_cmd(env, command)
     end
 
     echo = "echo #{xs(show_cmd)}"
@@ -397,7 +397,7 @@ class DTAS::SplitFX # :nodoc:
     env["INBASE"] = xs(base)
   end
 
-  def _expand_cmd(env, command)
+  def expand_cmd(env, command)
     Shellwords.split(command).map do |arg|
       qx(env, "printf %s \"#{arg}\"")
     end
diff --git a/lib/dtas/watchable.rb b/lib/dtas/watchable.rb
index cc6c018..36e8644 100644
--- a/lib/dtas/watchable.rb
+++ b/lib/dtas/watchable.rb
@@ -18,7 +18,8 @@ module DTAS::Watchable
     def readable_iter
       or_call = false
       while event = take(true) # drain the buffer
-        if (event.mask & FLAGS) != 0 && @watching[1] == event.name
+        w = @watches[event.wd] or next
+        if (event.mask & FLAGS) != 0 && w[event.name]
           or_call = true
         end
       end
@@ -31,19 +32,29 @@ module DTAS::Watchable
     end
 
     # we must watch the directory, since
-    def watch_file(path, blk)
+    def watch_files(paths, blk)
+      @watches = {} # wd -> { basename -> true }
       @on_readable = blk
-      @watching = File.split(File.expand_path(path))
-      add_watch(@watching[0], FLAGS)
+      @dir2wd = {}
+      Array(paths).each do |path|
+        watchdir, watchbase = File.split(File.expand_path(path))
+        wd = @dir2wd[watchdir] ||= add_watch(watchdir, FLAGS)
+        m = @watches[wd] ||= {}
+        m[watchbase] = true
+      end
     end
   end
 
   def watch_begin(blk)
     @ino = InotifyReadableIter.new
-    @ino.watch_file(@infile, blk)
+    @ino.watch_files(@watch_extra << @infile, blk)
     @ino
   end
 
+  def watch_extra(paths)
+    @ino.watch_extra(paths)
+  end
+
   # Closing the inotify descriptor (instead of using inotify_rm_watch)
   # is cleaner because it avoids EINVAL on race conditions in case
   # a directory is deleted: https://lkml.org/lkml/2007/7/9/3