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)))