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

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