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