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
|