Mercurial > hg > jslab
view src/scheme/old/audio.scm @ 1:5df24c91468d
Oh my what a mess.
author | samer |
---|---|
date | Fri, 05 Apr 2019 16:26:00 +0100 |
parents | bf79fb79ee13 |
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))) ;;; 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)) ;;; construct line info from given format (define (target format) (javax.sound.sampled.DataLine$Info. javax.sound.sampled.TargetDataLine.class format)) (define (source format) (javax.sound.sampled.DataLine$Info. javax.sound.sampled.SourceDataLine.class format)) ;;; these two just return the first target/source line info respectively ;;; (define (target-info m) (vector-ref (.getTargetLineInfo m) 0)) ;;; (define (source-info m) (vector-ref (.getSourceLineInfo m) 0)) ;;; getting line from info and optional mixer (define-method (line info) (javax.sound.sampled.AudioSystem.getLine info)) (define-method (line mixer info) (.getLine mixer info)) ;;; these two just return the mixer's first target/source line respectively (define (target-line m) (line m (vector-ref (.getTargetLineInfo m) 0))) (define (source-line m) (line m (vector-ref (.getSourceLineInfo m) 0))) (define _src samer.audio.LineSource.) (define _snk samer.audio.LineSink.) (define (_op1 l) (.open l) l) (define (_op2 l fmt) (.open l fmt) l) (define-method (linesrc) (_op1 (_src))) (define-method (linesrc fmt) (_op1 (_src (line (target fmt))))) (define-method (linesrc m fmt) (_op2 (_src (target-line m)) fmt)) (define-method (linesnk fmt) (_op1 (_snk (line (source fmt))))) (define-method (linesnk m fmt) (_op2 (_snk (source-line m)) fmt)) ;; to do: buffer size? ;; integrate with LineSource.defaultLine and VLine.defaultFormat ;; 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 ) ;; default line in (define-method (linein size step) (linein (linesrc) size step)) ;;; 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 named file (define-method (astream (fn String)) (astream (java.io.File. fn)))