samer@0: ;(import "javax.sound.sampled.*") samer@0: samer@0: ;;; getting mixers samer@0: (define (get-mixers) (vector->list (javax.sound.sampled.AudioSystem.getMixerInfo))) samer@0: (define (pr-mixers) (print (get-mixers))) samer@0: (define (mixer mi) (javax.sound.sampled.AudioSystem.getMixer mi)) samer@0: (define (mixer-n n) (mixer (list-ref (get-mixers) n))) samer@0: (define (default-mixer) (mixer-n (Shell.getInt "mixer" 1))) samer@0: samer@0: samer@0: samer@0: ;;; formats samer@0: (define (mono rate) (multi 1 rate)) samer@0: (define (stereo rate) (multi 2 rate)) samer@0: (define (multi chans rate) (format 16 chans rate)) samer@0: (define (format bits chans rate) (javax.sound.sampled.AudioFormat. (.floatValue rate) bits chans #t #f)) samer@0: samer@0: ;;; construct line info from given format samer@0: (define (target format) samer@0: (javax.sound.sampled.DataLine$Info. samer@0: javax.sound.sampled.TargetDataLine.class format)) samer@0: samer@0: (define (source format) samer@0: (javax.sound.sampled.DataLine$Info. samer@0: javax.sound.sampled.SourceDataLine.class format)) samer@0: samer@0: ;;; these two just return the first target/source line info respectively samer@0: ;;; (define (target-info m) (vector-ref (.getTargetLineInfo m) 0)) samer@0: ;;; (define (source-info m) (vector-ref (.getSourceLineInfo m) 0)) samer@0: samer@0: ;;; getting line from info and optional mixer samer@0: (define-method (line info) (javax.sound.sampled.AudioSystem.getLine info)) samer@0: (define-method (line mixer info) (.getLine mixer info)) samer@0: samer@0: ;;; these two just return the mixer's first target/source line respectively samer@0: (define (target-line m) (line m (vector-ref (.getTargetLineInfo m) 0))) samer@0: (define (source-line m) (line m (vector-ref (.getSourceLineInfo m) 0))) samer@0: samer@0: (define _src samer.audio.LineSource.) samer@0: (define _snk samer.audio.LineSink.) samer@0: (define (_op1 l) (.open l) l) samer@0: (define (_op2 l fmt) (.open l fmt) l) samer@0: samer@0: (define-method (linesrc) (_op1 (_src))) samer@0: (define-method (linesrc fmt) (_op1 (_src (line (target fmt))))) samer@0: (define-method (linesrc m fmt) (_op2 (_src (target-line m)) fmt)) samer@0: (define-method (linesnk fmt) (_op1 (_snk (line (source fmt))))) samer@0: (define-method (linesnk m fmt) (_op2 (_snk (source-line m)) fmt)) samer@0: samer@0: ;; to do: buffer size? samer@0: ;; integrate with LineSource.defaultLine and VLine.defaultFormat samer@0: ;; specify default mixer in user.props samer@0: samer@0: (define (display-mixer m) samer@0: (print "\n **************************** \n") samer@0: (print (.getMixerInfo m)) samer@0: ; (print "\n---controls:") (print(.getControls m)) samer@0: (print "\n---source line info:") (print(.getSourceLineInfo m)) samer@0: (print "\n---target line info:") (print(.getTargetLineInfo m)) samer@0: ; (print "\n---source lines:") (print(.getSourceLines m)) samer@0: ; (print "\n---target lines:") (print(.getTargetLines m)) samer@0: #null samer@0: ) samer@0: samer@0: ;; default line in samer@0: (define-method (linein size step) (linein (linesrc) size step)) samer@0: samer@0: samer@0: ;;; Format conversion samer@0: (define (convert format stream) samer@0: (javax.sound.sampled.AudioSystem.getAudioInputStream format stream)) samer@0: samer@0: ;;; get audio input stream from file object samer@0: (define-method (astream (f java.io.File)) samer@0: (javax.sound.sampled.AudioSystem.getAudioInputStream f)) samer@0: samer@0: ;;; get audio input stream from named file samer@0: (define-method (astream (fn String)) (astream (java.io.File. fn))) samer@0: