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
|
samer@0
|
12 ;;; formats
|
samer@0
|
13 (define (mono rate) (multi 1 rate))
|
samer@0
|
14 (define (stereo rate) (multi 2 rate))
|
samer@0
|
15 (define (multi chans rate) (format 16 chans rate))
|
samer@0
|
16 (define (format bits chans rate) (javax.sound.sampled.AudioFormat. (.floatValue rate) bits chans #t #f))
|
samer@0
|
17
|
samer@0
|
18 ;;; construct line info from given format
|
samer@0
|
19 (define (target format)
|
samer@0
|
20 (javax.sound.sampled.DataLine$Info.
|
samer@0
|
21 javax.sound.sampled.TargetDataLine.class format))
|
samer@0
|
22
|
samer@0
|
23 (define (source format)
|
samer@0
|
24 (javax.sound.sampled.DataLine$Info.
|
samer@0
|
25 javax.sound.sampled.SourceDataLine.class format))
|
samer@0
|
26
|
samer@0
|
27 ;;; these two just return the first target/source line info respectively
|
samer@0
|
28 ;;; (define (target-info m) (vector-ref (.getTargetLineInfo m) 0))
|
samer@0
|
29 ;;; (define (source-info m) (vector-ref (.getSourceLineInfo m) 0))
|
samer@0
|
30
|
samer@0
|
31 ;;; getting line from info and optional mixer
|
samer@0
|
32 (define-method (line info) (javax.sound.sampled.AudioSystem.getLine info))
|
samer@0
|
33 (define-method (line mixer info) (.getLine mixer info))
|
samer@0
|
34
|
samer@0
|
35 ;;; these two just return the mixer's first target/source line respectively
|
samer@0
|
36 (define (target-line m) (line m (vector-ref (.getTargetLineInfo m) 0)))
|
samer@0
|
37 (define (source-line m) (line m (vector-ref (.getSourceLineInfo m) 0)))
|
samer@0
|
38
|
samer@0
|
39 (define _src samer.audio.LineSource.)
|
samer@0
|
40 (define _snk samer.audio.LineSink.)
|
samer@0
|
41 (define (_op1 l) (.open l) l)
|
samer@0
|
42 (define (_op2 l fmt) (.open l fmt) l)
|
samer@0
|
43
|
samer@0
|
44 (define-method (linesrc) (_op1 (_src)))
|
samer@0
|
45 (define-method (linesrc fmt) (_op1 (_src (line (target fmt)))))
|
samer@0
|
46 (define-method (linesrc m fmt) (_op2 (_src (target-line m)) fmt))
|
samer@0
|
47 (define-method (linesnk fmt) (_op1 (_snk (line (source fmt)))))
|
samer@0
|
48 (define-method (linesnk m fmt) (_op2 (_snk (source-line m)) fmt))
|
samer@0
|
49
|
samer@0
|
50 ;; to do: buffer size?
|
samer@0
|
51 ;; integrate with LineSource.defaultLine and VLine.defaultFormat
|
samer@0
|
52 ;; specify default mixer in user.props
|
samer@0
|
53
|
samer@0
|
54 (define (display-mixer m)
|
samer@0
|
55 (print "\n **************************** \n")
|
samer@0
|
56 (print (.getMixerInfo m))
|
samer@0
|
57 ; (print "\n---controls:") (print(.getControls m))
|
samer@0
|
58 (print "\n---source line info:") (print(.getSourceLineInfo m))
|
samer@0
|
59 (print "\n---target line info:") (print(.getTargetLineInfo m))
|
samer@0
|
60 ; (print "\n---source lines:") (print(.getSourceLines m))
|
samer@0
|
61 ; (print "\n---target lines:") (print(.getTargetLines m))
|
samer@0
|
62 #null
|
samer@0
|
63 )
|
samer@0
|
64
|
samer@0
|
65 ;; default line in
|
samer@0
|
66 (define-method (linein size step) (linein (linesrc) size step))
|
samer@0
|
67
|
samer@0
|
68
|
samer@0
|
69 ;;; Format conversion
|
samer@0
|
70 (define (convert format stream)
|
samer@0
|
71 (javax.sound.sampled.AudioSystem.getAudioInputStream format stream))
|
samer@0
|
72
|
samer@0
|
73 ;;; get audio input stream from file object
|
samer@0
|
74 (define-method (astream (f java.io.File))
|
samer@0
|
75 (javax.sound.sampled.AudioSystem.getAudioInputStream f))
|
samer@0
|
76
|
samer@0
|
77 ;;; get audio input stream from named file
|
samer@0
|
78 (define-method (astream (fn String)) (astream (java.io.File. fn)))
|
samer@0
|
79
|