annotate src/scheme/audio.scm @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents 5df24c91468d
children
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@1 26 (define (_open x) (.open x) x)
samer@0 27 (define (target-info . args) (_dli javax.sound.sampled.TargetDataLine.class args))
samer@0 28 (define (source-info . args) (_dli javax.sound.sampled.SourceDataLine.class args))
samer@0 29
samer@0 30
samer@0 31
samer@0 32 ;;; getting lines
samer@0 33
samer@0 34 ; get a Line from AudioSystem given Info
samer@0 35 (define-method (line info) (javax.sound.sampled.AudioSystem.getLine info))
samer@0 36
samer@0 37 ; get a Line from a particular Mixer using Info
samer@0 38 (define-method (line mixer info) (.getLine mixer info))
samer@0 39
samer@0 40
samer@0 41 ;;; getting LineSource and LineSink
samer@0 42 (define _src samer.audio.LineSource.)
samer@0 43 (define _snk samer.audio.LineSink.)
samer@0 44 (define (_sbs b l) (.setBufferSize l b) l)
samer@0 45
samer@0 46 (define-method (linesrc) (linesrc (default-format)))
samer@0 47 (define-method (linesnk) (linesnk (default-format)))
samer@1 48 (define-method (linesrc fmt) (_open (_src (line (target-info fmt)) fmt)))
samer@1 49 (define-method (linesnk fmt) (_open (_snk (line (source-info fmt)) fmt)))
samer@1 50 (define-method (linesrc mx fmt) (_open (_src (line mx (target-info fmt)) fmt)))
samer@1 51 (define-method (linesnk mx fmt) (_open (_snk (line mx (source-info fmt)) fmt)))
samer@1 52 (define-method (linesrc mx fmt bf) (_open (_sbs bf (_src (line mx (target-info fmt bf)) fmt))))
samer@1 53 (define-method (linesnk mx fmt bf) (_open (_sbs bf (_snk (line mx (source-info fmt bf)) fmt))))
samer@1 54 (define-method (linesrc-buf fmt bf) (_open (_sbs bf (_src (line (target-info fmt bf)) fmt))))
samer@1 55 (define-method (linesnk-buf fmt bf) (_open (_sbs bf (_snk (line (source-info fmt bf)) fmt))))
samer@0 56 (define filesnk samer.audio.FileSink.)
samer@0 57
samer@0 58 (define streamsrc samer.audio.StreamSource.)
samer@0 59
samer@0 60 ;; to do: buffer size?
samer@0 61 ;; specify default mixer in user.props
samer@0 62
samer@0 63 (define (display-mixer m)
samer@0 64 (print "\n **************************** \n")
samer@0 65 (print (.getMixerInfo m))
samer@0 66 ; (print "\n---controls:") (print(.getControls m))
samer@0 67 (print "\n---source line info:") (print(.getSourceLineInfo m))
samer@0 68 (print "\n---target line info:") (print(.getTargetLineInfo m))
samer@0 69 ; (print "\n---source lines:") (print(.getSourceLines m))
samer@0 70 ; (print "\n---target lines:") (print(.getTargetLines m))
samer@0 71 #null
samer@0 72 )
samer@0 73
samer@0 74 ;;; buffering audio input into frames with a certain hop size
samer@0 75 (define-method (linein size step) (linein (linesrc) size step))
samer@1 76 (define-method (linein source size step)
samer@0 77 (define line (LineIn. source size step))
samer@0 78 (put "LineIn" line)
samer@0 79 (addtask line)
samer@0 80 (.output line) )
samer@0 81
samer@0 82
samer@0 83
samer@0 84 ;;; Format conversion
samer@0 85 (define (convert format stream)
samer@0 86 (javax.sound.sampled.AudioSystem.getAudioInputStream format stream))
samer@0 87
samer@0 88 ;;; get audio input stream from file object
samer@0 89 (define-method (astream (f java.io.File))
samer@0 90 (javax.sound.sampled.AudioSystem.getAudioInputStream f))
samer@0 91
samer@0 92 ;;; get audio input stream from any stream
samer@0 93 (define-method (astream (f java.io.InputStream))
samer@0 94 (javax.sound.sampled.AudioSystem.getAudioInputStream f))
samer@0 95
samer@0 96 ;;; get audio input stream from named file
samer@0 97 (define-method (astream (fn String)) (astream (java.io.File. fn)))
samer@0 98