samer@0: (define set-step null) samer@0: (define line-on null) samer@0: (define line-off null) samer@0: (define _lineout null) samer@0: samer@0: samer@0: samer@0: samer@0: ;;; Audio output from given vector to given AudioSink samer@0: ;;; Task is added to current task list, and functions line-on samer@0: ;;; and line-off are defined to insert and remove the lineout task. samer@0: ;;; Function set-step defined to change hop size. samer@0: ;;; Optional final parameter is hop size samer@0: (define-method (lineout sink (in Vec) hop) samer@0: (let ((out (LineOut. in sink)) samer@0: (tlist (tasks))) samer@0: (set! set-step (lambda (m) (.setWindow out 0 m))) samer@0: (set! line-on (lambda () samer@0: (.starting out) (Thread.sleep 200L) samer@0: (.addTask tlist out))) samer@0: (set! line-off (lambda () samer@0: (.removeTask tlist out) samer@0: (.stopping out) (Thread.sleep 200L))) samer@0: (set-step hop) samer@0: (addtasks out) samer@0: out)) samer@0: samer@0: (define-method (lineout (in Vec)) (lineout (linesnk) in)) samer@0: (define-method (lineout sink (in Vec)) (lineout sink in (.size in))) samer@0: (define-method (lineout sink (in LineIn)) samer@0: (put "lineout.scale" 1.0) samer@0: (let ((out (lineout sink (.output in)))) samer@0: (set-step (.getStep in)) samer@0: (set! set-step (lambda (n) samer@0: (.setStep in n) samer@0: (.setWindow out 0 n))))) samer@0: samer@0: (define-method (overlap-and-add sink x hop) samer@0: (define oa (OverlapAndAdd. x hop)) samer@0: (define line (LineOut. (.output oa) sink)) samer@0: (.setWindow oa (Hanning.)) samer@0: (.setWindow line 0 hop) samer@0: (addtasks oa line) samer@0: (set! _lineout line) samer@0: (set! set-step (lambda (h) samer@0: (.setHop oa h) samer@0: (.setWindow line 0 h))) samer@0: line) samer@0: