diff src/scheme/audio.scm @ 0:bf79fb79ee13

Initial Mercurial check in.
author samer
date Tue, 17 Jan 2012 17:50:20 +0000
parents
children 5df24c91468d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/scheme/audio.scm	Tue Jan 17 17:50:20 2012 +0000
@@ -0,0 +1,97 @@
+;(import "javax.sound.sampled.*")
+
+;;; getting mixers
+(define (get-mixers)	(vector->list (javax.sound.sampled.AudioSystem.getMixerInfo)))
+(define (pr-mixers) (print (get-mixers)))
+(define (mixer mi) (javax.sound.sampled.AudioSystem.getMixer mi))
+(define (mixer-n n) (mixer (list-ref (get-mixers) n)))
+(define (default-mixer) (mixer-n (Shell.getInt "mixer" 1)))
+
+
+;;; constructing formats
+(define (mono rate) (multi 1 rate))
+(define (stereo rate) (multi 2 rate))
+(define (multi chans rate) (format 16 chans rate))
+(define (format bits chans rate) 
+	(javax.sound.sampled.AudioFormat. (.floatValue rate) bits chans #t #f))
+
+; If current Environment contains "format", then we use that,
+; otherwise, we get values for "rate" [22050] and "channel" [1].
+(define (default-format) 
+  (Shell.get "format" 
+    (multi (Shell.getInt "channels" 1) (Shell.getInt "rate" 22050))))
+
+;;; construct DataLine.Info. args = (format [bufsize])
+(define (_dli cl args) (apply javax.sound.sampled.DataLine$Info. (cons cl args)))
+(define (target-info . args) (_dli javax.sound.sampled.TargetDataLine.class args))
+(define (source-info . args) (_dli javax.sound.sampled.SourceDataLine.class args))
+
+
+
+;;; getting lines
+
+; get a Line from AudioSystem given Info
+(define-method (line info) (javax.sound.sampled.AudioSystem.getLine info))
+
+; get a Line from a particular Mixer using Info
+(define-method (line mixer info) (.getLine mixer info))
+
+
+;;; getting LineSource and LineSink
+(define _src samer.audio.LineSource.)
+(define _snk samer.audio.LineSink.)
+(define (_sbs b l) (.setBufferSize l b) l)
+
+(define-method (linesrc) 				(linesrc (default-format)))
+(define-method (linesnk) 				(linesnk (default-format)))
+(define-method (linesrc fmt) 			(.open (_src (line (target-info fmt)) fmt)))
+(define-method (linesnk fmt) 			(.open (_snk (line (source-info fmt bf)) fmt))) 
+(define-method (linesrc mx fmt)		(.open (_src (line mx (target-info fmt)) fmt)))
+(define-method (linesnk mx fmt)		(.open (_snk (line mx (source-info fmt)) fmt)))
+(define-method (linesrc mx fmt bf)	(.open (_sbs bf (_src (line mx (target-info fmt bf)) fmt))))
+(define-method (linesnk mx fmt bf)	(.open (_sbs bf (_snk (line mx (source-info fmt bf)) fmt))))
+(define-method (linesrc-buf fmt bf) (.open (_sbs bf (_src (line (target-info fmt bf)) fmt))))
+(define-method (linesnk-buf fmt bf) (.open (_sbs bf (_snk (line (source-info fmt bf)) fmt))))
+(define filesnk samer.audio.FileSink.)
+
+(define streamsrc samer.audio.StreamSource.)
+
+;; to do: buffer size?
+;; specify default mixer in user.props
+
+(define (display-mixer m)
+	(print "\n **************************** \n")
+	(print (.getMixerInfo m))
+;	(print "\n---controls:") (print(.getControls m))
+	(print "\n---source line info:") (print(.getSourceLineInfo m))
+	(print "\n---target line info:") (print(.getTargetLineInfo m))
+;	(print "\n---source lines:") 		(print(.getSourceLines m))
+;	(print "\n---target lines:") 		(print(.getTargetLines m))
+	#null
+)
+
+;;; buffering audio input into frames with a certain hop size
+(define-method (linein size step) (linein (linesrc) size step))
+(define-method (linein (source samer.audio.AudioSource) size step)
+	(define line (LineIn. source size step))
+	(put "LineIn" line)
+	(addtask line)
+	(.output line) )
+
+
+
+;;; Format conversion
+(define (convert format stream)
+	(javax.sound.sampled.AudioSystem.getAudioInputStream format stream))
+
+;;; get audio input stream from file object
+(define-method (astream (f java.io.File)) 
+	(javax.sound.sampled.AudioSystem.getAudioInputStream f))
+
+;;; get audio input stream from any stream
+(define-method (astream (f java.io.InputStream)) 
+	(javax.sound.sampled.AudioSystem.getAudioInputStream f))
+
+;;; get audio input stream from named file
+(define-method (astream (fn String))  (astream (java.io.File. fn)))
+