Mercurial > hg > jslab
view src/scheme/audio.scm @ 8:5e3cbbf173aa tip
Reorganise some more
author | samer |
---|---|
date | Fri, 05 Apr 2019 22:41:58 +0100 |
parents | 5df24c91468d |
children |
line wrap: on
line source
;(import "javax.sound.sampled.*") ;;; getting mixers (define (get-mixers) (vector->list (javax.sound.sampled.AudioSystem.getMixerInfo))) (define (pr-mixers) (print (get-mixers))) (define (mixer mi) (javax.sound.sampled.AudioSystem.getMixer mi)) (define (mixer-n n) (mixer (list-ref (get-mixers) n))) (define (default-mixer) (mixer-n (Shell.getInt "mixer" 1))) ;;; constructing formats (define (mono rate) (multi 1 rate)) (define (stereo rate) (multi 2 rate)) (define (multi chans rate) (format 16 chans rate)) (define (format bits chans rate) (javax.sound.sampled.AudioFormat. (.floatValue rate) bits chans #t #f)) ; If current Environment contains "format", then we use that, ; otherwise, we get values for "rate" [22050] and "channel" [1]. (define (default-format) (Shell.get "format" (multi (Shell.getInt "channels" 1) (Shell.getInt "rate" 22050)))) ;;; construct DataLine.Info. args = (format [bufsize]) (define (_dli cl args) (apply javax.sound.sampled.DataLine$Info. (cons cl args))) (define (_open x) (.open x) x) (define (target-info . args) (_dli javax.sound.sampled.TargetDataLine.class args)) (define (source-info . args) (_dli javax.sound.sampled.SourceDataLine.class args)) ;;; getting lines ; get a Line from AudioSystem given Info (define-method (line info) (javax.sound.sampled.AudioSystem.getLine info)) ; get a Line from a particular Mixer using Info (define-method (line mixer info) (.getLine mixer info)) ;;; getting LineSource and LineSink (define _src samer.audio.LineSource.) (define _snk samer.audio.LineSink.) (define (_sbs b l) (.setBufferSize l b) l) (define-method (linesrc) (linesrc (default-format))) (define-method (linesnk) (linesnk (default-format))) (define-method (linesrc fmt) (_open (_src (line (target-info fmt)) fmt))) (define-method (linesnk fmt) (_open (_snk (line (source-info fmt)) fmt))) (define-method (linesrc mx fmt) (_open (_src (line mx (target-info fmt)) fmt))) (define-method (linesnk mx fmt) (_open (_snk (line mx (source-info fmt)) fmt))) (define-method (linesrc mx fmt bf) (_open (_sbs bf (_src (line mx (target-info fmt bf)) fmt)))) (define-method (linesnk mx fmt bf) (_open (_sbs bf (_snk (line mx (source-info fmt bf)) fmt)))) (define-method (linesrc-buf fmt bf) (_open (_sbs bf (_src (line (target-info fmt bf)) fmt)))) (define-method (linesnk-buf fmt bf) (_open (_sbs bf (_snk (line (source-info fmt bf)) fmt)))) (define filesnk samer.audio.FileSink.) (define streamsrc samer.audio.StreamSource.) ;; to do: buffer size? ;; specify default mixer in user.props (define (display-mixer m) (print "\n **************************** \n") (print (.getMixerInfo m)) ; (print "\n---controls:") (print(.getControls m)) (print "\n---source line info:") (print(.getSourceLineInfo m)) (print "\n---target line info:") (print(.getTargetLineInfo m)) ; (print "\n---source lines:") (print(.getSourceLines m)) ; (print "\n---target lines:") (print(.getTargetLines m)) #null ) ;;; buffering audio input into frames with a certain hop size (define-method (linein size step) (linein (linesrc) size step)) (define-method (linein source size step) (define line (LineIn. source size step)) (put "LineIn" line) (addtask line) (.output line) ) ;;; Format conversion (define (convert format stream) (javax.sound.sampled.AudioSystem.getAudioInputStream format stream)) ;;; get audio input stream from file object (define-method (astream (f java.io.File)) (javax.sound.sampled.AudioSystem.getAudioInputStream f)) ;;; get audio input stream from any stream (define-method (astream (f java.io.InputStream)) (javax.sound.sampled.AudioSystem.getAudioInputStream f)) ;;; get audio input stream from named file (define-method (astream (fn String)) (astream (java.io.File. fn)))