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

Initial Mercurial check in.
author samer
date Tue, 17 Jan 2012 17:50:20 +0000
parents
children 5df24c91468d
rev   line source
samer@0 1 ;(import "javax.sound.sampled.*")
samer@0 2
samer@0 3 ;;; getting mixers
samer@0 4 (define (get-mixers) (vector->list (javax.sound.sampled.AudioSystem.getMixerInfo)))
samer@0 5 (define (pr-mixers) (print (get-mixers)))
samer@0 6 (define (mixer mi) (javax.sound.sampled.AudioSystem.getMixer mi))
samer@0 7 (define (mixer-n n) (mixer (list-ref (get-mixers) n)))
samer@0 8 (define (default-mixer) (mixer-n (Shell.getInt "mixer" 1)))
samer@0 9
samer@0 10
samer@0 11 ;;; constructing formats
samer@0 12 (define (mono rate) (multi 1 rate))
samer@0 13 (define (stereo rate) (multi 2 rate))
samer@0 14 (define (multi chans rate) (format 16 chans rate))
samer@0 15 (define (format bits chans rate)
samer@0 16 (javax.sound.sampled.AudioFormat. (.floatValue rate) bits chans #t #f))
samer@0 17
samer@0 18 ; If current Environment contains "format", then we use that,
samer@0 19 ; otherwise, we get values for "rate" [22050] and "channel" [1].
samer@0 20 (define (default-format)
samer@0 21 (Shell.get "format"
samer@0 22 (multi (Shell.getInt "channels" 1) (Shell.getInt "rate" 22050))))
samer@0 23
samer@0 24 ;;; construct DataLine.Info. args = (format [bufsize])
samer@0 25 (define (_dli cl args) (apply javax.sound.sampled.DataLine$Info. (cons cl args)))
samer@0 26 (define (target-info . args) (_dli javax.sound.sampled.TargetDataLine.class args))
samer@0 27 (define (source-info . args) (_dli javax.sound.sampled.SourceDataLine.class args))
samer@0 28
samer@0 29
samer@0 30
samer@0 31 ;;; getting lines
samer@0 32
samer@0 33 ; get a Line from AudioSystem given Info
samer@0 34 (define-method (line info) (javax.sound.sampled.AudioSystem.getLine info))
samer@0 35
samer@0 36 ; get a Line from a particular Mixer using Info
samer@0 37 (define-method (line mixer info) (.getLine mixer info))
samer@0 38
samer@0 39
samer@0 40 ;;; getting LineSource and LineSink
samer@0 41 (define _src samer.audio.LineSource.)
samer@0 42 (define _snk samer.audio.LineSink.)
samer@0 43 (define (_sbs b l) (.setBufferSize l b) l)
samer@0 44
samer@0 45 (define-method (linesrc) (linesrc (default-format)))
samer@0 46 (define-method (linesnk) (linesnk (default-format)))
samer@0 47 (define-method (linesrc fmt) (.open (_src (line (target-info fmt)) fmt)))
samer@0 48 (define-method (linesnk fmt) (.open (_snk (line (source-info fmt bf)) fmt)))
samer@0 49 (define-method (linesrc mx fmt) (.open (_src (line mx (target-info fmt)) fmt)))
samer@0 50 (define-method (linesnk mx fmt) (.open (_snk (line mx (source-info fmt)) fmt)))
samer@0 51 (define-method (linesrc mx fmt bf) (.open (_sbs bf (_src (line mx (target-info fmt bf)) fmt))))
samer@0 52 (define-method (linesnk mx fmt bf) (.open (_sbs bf (_snk (line mx (source-info fmt bf)) fmt))))
samer@0 53 (define-method (linesrc-buf fmt bf) (.open (_sbs bf (_src (line (target-info fmt bf)) fmt))))
samer@0 54 (define-method (linesnk-buf fmt bf) (.open (_sbs bf (_snk (line (source-info fmt bf)) fmt))))
samer@0 55 (define filesnk samer.audio.FileSink.)
samer@0 56
samer@0 57 (define streamsrc samer.audio.StreamSource.)
samer@0 58
samer@0 59 ;; to do: buffer size?
samer@0 60 ;; specify default mixer in user.props
samer@0 61
samer@0 62 (define (display-mixer m)
samer@0 63 (print "\n **************************** \n")
samer@0 64 (print (.getMixerInfo m))
samer@0 65 ; (print "\n---controls:") (print(.getControls m))
samer@0 66 (print "\n---source line info:") (print(.getSourceLineInfo m))
samer@0 67 (print "\n---target line info:") (print(.getTargetLineInfo m))
samer@0 68 ; (print "\n---source lines:") (print(.getSourceLines m))
samer@0 69 ; (print "\n---target lines:") (print(.getTargetLines m))
samer@0 70 #null
samer@0 71 )
samer@0 72
samer@0 73 ;;; buffering audio input into frames with a certain hop size
samer@0 74 (define-method (linein size step) (linein (linesrc) size step))
samer@0 75 (define-method (linein (source samer.audio.AudioSource) size step)
samer@0 76 (define line (LineIn. source size step))
samer@0 77 (put "LineIn" line)
samer@0 78 (addtask line)
samer@0 79 (.output line) )
samer@0 80
samer@0 81
samer@0 82
samer@0 83 ;;; Format conversion
samer@0 84 (define (convert format stream)
samer@0 85 (javax.sound.sampled.AudioSystem.getAudioInputStream format stream))
samer@0 86
samer@0 87 ;;; get audio input stream from file object
samer@0 88 (define-method (astream (f java.io.File))
samer@0 89 (javax.sound.sampled.AudioSystem.getAudioInputStream f))
samer@0 90
samer@0 91 ;;; get audio input stream from any stream
samer@0 92 (define-method (astream (f java.io.InputStream))
samer@0 93 (javax.sound.sampled.AudioSystem.getAudioInputStream f))
samer@0 94
samer@0 95 ;;; get audio input stream from named file
samer@0 96 (define-method (astream (fn String)) (astream (java.io.File. fn)))
samer@0 97