Mercurial > hg > jslab
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 |