X-Git-Url: https://svn.cri.mines-paristech.fr/git/Faustine.git/blobdiff_plain/912dbfbf1eb4809f28e4e3a8bdfe76c47e018259..c55d1f23d06e85b0e21cdf5cbc5c8efb6ac3bc1a:/interpreter/faustio.ml?ds=sidebyside

diff --git a/interpreter/faustio.ml b/interpreter/faustio.ml
index 7df74a6..47e07ce 100644
--- a/interpreter/faustio.ml
+++ b/interpreter/faustio.ml
@@ -12,16 +12,20 @@ open Signal;;
 open Beam;;
 open Aux;;
 
+exception Faustine_IO_Error of string;;
+
 let csv_read_buffer_length = 0xFFFF;;
 
 class virtual io = 
   object
+    val mutable _filename = ""
     val mutable _basename = ""
     val mutable _dir = ""
-    method set : string -> string -> unit = 
-      fun (dir : string) ->
-	fun (basename : string) ->
-	  _basename <- basename; _dir <- dir
+    method set : string -> string -> string -> unit = 
+      fun (filename : string) ->
+	fun (dir : string) ->
+	  fun (basename : string) ->
+	    _filename <- filename; _basename <- basename; _dir <- dir
 
     method virtual read : string array -> beam
     method virtual write : rate array -> data -> string array
@@ -70,11 +74,18 @@ class waveio : io_type =
       fun (rates : rate array) ->
 	fun (output : data) ->
 	  let n = Array.length output in	  
-	  let paths = Array.init n (fun i -> 
-	    _dir ^ _basename ^ (string_of_int (i + 1)) ^ ".wav") in
+	  let paths = 
+	    if _filename = "" then 
+	      Array.init n (fun i -> 
+		_dir ^ _basename ^ (string_of_int (i + 1)) ^ ".wav") 
+	    else if n = 1 then 
+	      let () = Unix.unlink "_filename" in [|(_filename ^ ".wav")|]
+	    else raise (Faustine_IO_Error ("The process has several output signals, 
+			however stdout supports only one output signal. Please remove 
+			the '> " ^ _filename ^ "'.")) in
 	  let get_freq = fun (r : rate) -> r#to_int in
 	  let freqs = Array.map get_freq rates in
-
+	  
 	  let files = 
 	    let channels = self#channels output in 
 	    let file_format = Sndfile.format 
@@ -124,12 +135,16 @@ class csvio : io_type =
     method write : rate array -> data -> string array = 
       fun (rates : rate array) ->
 	fun (data : data) ->
+	  let n = Array.length data in
 	  let paths = 
-	    let n = Array.length data in
-	    let path_pattern = fun i -> 
-	      _dir ^ _basename ^ (string_of_int (i + 1)) ^ ".csv" in
-	    Array.init n path_pattern in	  
-
+	    if _filename = "" then 
+	      Array.init n (fun i -> 
+		_dir ^ _basename ^ (string_of_int (i + 1)) ^ ".csv") 
+	    else if n = 1 then 
+	      let () = Unix.unlink _filename in [|(_filename ^ ".csv")|]
+	    else raise (Faustine_IO_Error ("The process has several output signals, 
+			however stdout supports only one output signal. Please remove 
+			the '> " ^ _filename ^ "'.")) in
 	  let files = Array.map open_out paths in
 	  let strings = 
 	    let value2string : float array -> string =
@@ -151,6 +166,7 @@ class iomanager =
   object (self)
     val wave = new waveio
     val csv = new csvio
+    val mutable _output_filename = ""
     val mutable _dir = ""
     val mutable _format = ""
     val mutable _basename = ""
@@ -175,15 +191,17 @@ class iomanager =
 	  fun b1 -> fun b2 -> b1#append b2 in
 	List.fold_left concat (new beam [||]) beams
 	      
-    method set : string -> string -> string -> unit = 
-      fun (dir : string) ->
-	fun (format : string) ->
-	  fun (basename : string) ->
-	    _dir <- dir; 
-	    _format <- format; 
-	    _basename <- basename;
-	    wave#set _dir _basename;
-	    csv#set _dir _basename
+    method set : string -> string -> string -> string -> unit = 
+      fun (filename : string) ->
+	fun (dir : string) ->
+	  fun (format : string) ->
+	    fun (basename : string) ->
+	      _output_filename <- filename;
+	      _dir <- dir; 
+	      _format <- format; 
+	      _basename <- basename;
+	      wave#set _output_filename _dir _basename;
+	      csv#set _output_filename _dir _basename
 
     method write : rate array -> data -> string array = 
       fun (rates : rate array) ->