-
This commit is contained in:
79
player.rkt
79
player.rkt
@@ -14,6 +14,7 @@
|
||||
(init-field [settings #f]
|
||||
[time-updater (λ (time-s length-s) #t)]
|
||||
[track-nr-updater (λ (nr) #t)]
|
||||
[state-updater (λ (state) #t)]
|
||||
[buffer-max-seconds 10]
|
||||
[buffer-min-seconds 4]
|
||||
)
|
||||
@@ -24,6 +25,7 @@
|
||||
(define current-track -1)
|
||||
(define ct-data #f)
|
||||
(define closing #f)
|
||||
(define pause #f)
|
||||
|
||||
(define ao-handle #f)
|
||||
(define flac-handle #f)
|
||||
@@ -39,6 +41,10 @@
|
||||
|
||||
(define play-time-updater-state 'stopped)
|
||||
|
||||
(define (set-state! st)
|
||||
(set! state st)
|
||||
(state-updater st))
|
||||
|
||||
(define (check-ao-handle)
|
||||
(when (eq? ao-handle #f)
|
||||
(unless (or (= current-rate 0) (= current-bits 0) (= current-channels 0))
|
||||
@@ -62,11 +68,13 @@
|
||||
(if (or (eq? ao-handle #f) closing)
|
||||
(begin
|
||||
(set! play-time-updater-state 'stopped)
|
||||
(displayln "Stopping play-time-updater")
|
||||
(displayln "Terminating play-time-updater")
|
||||
'done)
|
||||
(let ((seconds (ao-at-second ao-handle)))
|
||||
(let ((seconds (ao-at-second ao-handle))
|
||||
(duration (ao-music-duration ao-handle))
|
||||
)
|
||||
(set! current-seconds seconds)
|
||||
(time-updater current-seconds current-length)
|
||||
(time-updater current-seconds duration)
|
||||
(sleep 0.1)
|
||||
(updater))))
|
||||
(updater)
|
||||
@@ -100,13 +108,25 @@
|
||||
(when (> (buf-seconds-left) buffer-max-seconds)
|
||||
(while (and (not (eq? ao-handle #f))
|
||||
(not closing)
|
||||
(not pause)
|
||||
(> (buf-seconds-left) buffer-min-seconds))
|
||||
(sleep 0.25))))
|
||||
|
||||
(when (not (eq? ao-handle #f))
|
||||
(ao-play ao-handle second buffer)
|
||||
(ao-play ao-handle second duration buffer)
|
||||
)
|
||||
)
|
||||
|
||||
(when pause
|
||||
(displayln "Pauzing now...")
|
||||
(ao-pause ao-handle #t)
|
||||
(while (and (not (eq? ao-handle #f))
|
||||
(not closing)
|
||||
pause)
|
||||
(sleep 0.25))
|
||||
(ao-pause ao-handle #f)
|
||||
(displayln "Playing on...")
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -125,14 +145,14 @@
|
||||
(displayln "Starting flac-read")
|
||||
(let ((result (flac-read flac-handle)))
|
||||
(if (eq? result 'end-of-stream)
|
||||
(set! state 'track-feeded)
|
||||
(set-state! 'track-feeded)
|
||||
(displayln "Flac read stopped")))
|
||||
'worker-done
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(set! state 'playing)
|
||||
(set-state! 'playing)
|
||||
'playing
|
||||
)
|
||||
|
||||
@@ -154,6 +174,7 @@
|
||||
(let ((h ao-handle))
|
||||
(displayln "closing ao-handle")
|
||||
(set! ao-handle #f)
|
||||
(displayln (format "ao-handle = ~a" h))
|
||||
(ao-close h)
|
||||
))
|
||||
(displayln (format "close-player*: ao-handle = ~a" ao-handle))
|
||||
@@ -170,11 +191,11 @@
|
||||
|
||||
(define (quit-player)
|
||||
(close-player*)
|
||||
(set! state 'quitted)
|
||||
(set-state! 'quitted)
|
||||
)
|
||||
|
||||
(define (stop-and-clear)
|
||||
(set! state 'stopped)
|
||||
(set-state! 'stopped)
|
||||
(close-player*)
|
||||
)
|
||||
|
||||
@@ -182,11 +203,11 @@
|
||||
(set! track (+ track 1))
|
||||
(if (>= track (send pl length))
|
||||
(begin
|
||||
(set! state 'stopped)
|
||||
(set-state! 'stopped)
|
||||
(track-nr-updater #f))
|
||||
(begin
|
||||
(set! ct-data (send pl track track))
|
||||
(set! state 'play)
|
||||
(set-state! 'play)
|
||||
(track-nr-updater track)
|
||||
)
|
||||
)
|
||||
@@ -194,24 +215,19 @@
|
||||
|
||||
(define/public (play-track i)
|
||||
(displayln (format "play-track ~a" i))
|
||||
;(unless (eq? flac-handle #f)
|
||||
; (flac-stop flac-handle)
|
||||
; (set! flac-handle #f)
|
||||
; )
|
||||
;(set! track i)
|
||||
;(set! ct-data (send pl track i))
|
||||
;(while (eq? state 'playing)
|
||||
; (sleep 0.1))
|
||||
;(unless (eq? ao-handle #f)
|
||||
; (ao-clear-async ao-handle))
|
||||
;(set! state 'play)
|
||||
;(track-nr-updater i)
|
||||
(set! state 'stopped)
|
||||
(close-player*)
|
||||
(displayln "Player closed")
|
||||
(set! track i)
|
||||
(set! ct-data (send pl track i))
|
||||
(set! state 'play)
|
||||
(set-state! 'play)
|
||||
(displayln "Set state to 'play")
|
||||
(track-nr-updater track)
|
||||
(displayln "track-nr-updater called")
|
||||
)
|
||||
|
||||
(define/public (stop)
|
||||
(stop-and-clear)
|
||||
)
|
||||
|
||||
(define/public (next)
|
||||
@@ -233,6 +249,11 @@
|
||||
(set! idx (- (send pl length) 1)))
|
||||
(send this play-track idx)
|
||||
)))
|
||||
|
||||
(define/public (pause-unpause)
|
||||
(set! pause (not pause))
|
||||
(displayln (format "pauzed: ~a" pause))
|
||||
)
|
||||
|
||||
(define (state-machine)
|
||||
(let ((st (orig-current-seconds))
|
||||
@@ -248,17 +269,17 @@
|
||||
(sleep 0.01))
|
||||
((eq? state 'play)
|
||||
(if (eq? pl #f)
|
||||
(set! state 'stoppped)
|
||||
(set-state! 'stoppped)
|
||||
(play-track-worker)))
|
||||
((eq? state 'playing)
|
||||
(sleep 0.01))
|
||||
((eq? state 'track-feeded)
|
||||
(send this next-track))
|
||||
)
|
||||
(let ((ns (orig-current-seconds)))
|
||||
(when (> (- ns 5) s)
|
||||
(displayln (format "state-machine: ~a" (- ns st)))
|
||||
(set! s ns)))
|
||||
;(let ((ns (orig-current-seconds)))
|
||||
; (when (> (- ns 5) s)
|
||||
; (displayln (format "state-machine: ~a" (- ns st)))
|
||||
; (set! s ns)))
|
||||
(worker)
|
||||
)
|
||||
))
|
||||
@@ -271,7 +292,7 @@
|
||||
)
|
||||
|
||||
(define/public (quit)
|
||||
(set! state 'quit)
|
||||
(set-state! 'quit)
|
||||
(while (not (eq? state 'quitted))
|
||||
(sleep 0.1))
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user