Mercurial > hg > jslab
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))) +