small adjustments, many enhancements to rktplayer
This commit is contained in:
96
player.rkt
96
player.rkt
@@ -15,6 +15,8 @@
|
||||
[time-updater (λ (time-s length-s) #t)]
|
||||
[track-nr-updater (λ (nr) #t)]
|
||||
[state-updater (λ (state) #t)]
|
||||
[repeat-updater (λ (state) #t)]
|
||||
[audio-info-cb (λ (current-sample rate channels bits) #t)]
|
||||
[buffer-max-seconds 10]
|
||||
[buffer-min-seconds 4]
|
||||
)
|
||||
@@ -27,9 +29,13 @@
|
||||
(define ct-data #f)
|
||||
(define closing #f)
|
||||
(define pause #f)
|
||||
(define repeat-state 'no-repeat)
|
||||
|
||||
(define ao-handle #f)
|
||||
(define flac-handle #f)
|
||||
|
||||
(define current-music-id -1)
|
||||
(define current-track-id -1)
|
||||
|
||||
(define current-rate 0)
|
||||
(define current-bits 0)
|
||||
@@ -53,10 +59,9 @@
|
||||
current-rate current-bits current-channels ao-handle)
|
||||
(dbg-rktplayer "Opening ao-handle")
|
||||
(when use-ao
|
||||
(let ((fmt (ao-mk-format current-bits current-rate current-channels 'big-endian)))
|
||||
(set! ao-handle (ao-open-live #f fmt))
|
||||
(start-play-time-updater)
|
||||
))
|
||||
(set! ao-handle (ao-open-live current-bits current-rate current-channels 'big-endian))
|
||||
(start-play-time-updater)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -74,10 +79,15 @@
|
||||
'done)
|
||||
(let ((seconds (ao-at-second ao-handle))
|
||||
(duration (ao-music-duration ao-handle))
|
||||
(music-id (ao-at-music-id ao-handle))
|
||||
)
|
||||
(set! current-seconds seconds)
|
||||
(time-updater current-seconds duration)
|
||||
(sleep 0.1)
|
||||
(unless (= music-id current-music-id)
|
||||
(dbg-rktplayer "a ~a ~a ~a" music-id current-track-id seconds)
|
||||
(set! current-music-id music-id)
|
||||
(track-nr-updater track))
|
||||
(sleep 0.2)
|
||||
(updater))))
|
||||
(updater)
|
||||
)
|
||||
@@ -85,6 +95,12 @@
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
(define (stream-equal? rate bits channels)
|
||||
(and (= current-rate rate)
|
||||
(= current-bits bits)
|
||||
(= current-channels channels)))
|
||||
|
||||
(define (flac-play frame buffer buf-len)
|
||||
(unless (eq? state 'quitted)
|
||||
(let* ((sample (hash-ref frame 'number))
|
||||
@@ -96,10 +112,27 @@
|
||||
(bytes-per-sample-all-channels (* channels bytes-per-sample))
|
||||
(duration (hash-ref frame 'duration))
|
||||
)
|
||||
|
||||
(unless (stream-equal? rate bits-per-sample channels)
|
||||
(dbg-rktplayer "Stream has changed to ~a ~a ~a" rate bits-per-sample channels)
|
||||
(unless (eq? ao-handle #f)
|
||||
(dbg-rktplayer "Waiting for play buffer to reach empty state")
|
||||
(while (> (ao-bufsize-async ao-handle) 0)
|
||||
(sleep 0.25)
|
||||
)
|
||||
(dbg-rktplayer "Closing ao-handle")
|
||||
(ao-close ao-handle)
|
||||
(set! ao-handle #f))
|
||||
)
|
||||
|
||||
(set! current-rate rate)
|
||||
(set! current-bits bits-per-sample)
|
||||
(set! current-channels channels)
|
||||
(set! current-length duration)
|
||||
|
||||
(when (eq? ao-handle #f)
|
||||
(audio-info-cb sample current-rate current-channels current-bits)
|
||||
)
|
||||
|
||||
(check-ao-handle)
|
||||
(when (not (eq? ao-handle #f))
|
||||
@@ -115,19 +148,21 @@
|
||||
(sleep 0.25))))
|
||||
|
||||
(when (not (eq? ao-handle #f))
|
||||
(ao-play ao-handle second duration buffer buf-len 'flac)
|
||||
(ao-play ao-handle current-track-id second duration buffer buf-len 'flac)
|
||||
)
|
||||
)
|
||||
|
||||
(when pause
|
||||
(dbg-rktplayer "Pauzing now...")
|
||||
(dbg-rktplayer "Pausing now...")
|
||||
(set-state! 'pauzed)
|
||||
(ao-pause ao-handle #t)
|
||||
(while (and (not (eq? ao-handle #f))
|
||||
(not closing)
|
||||
pause)
|
||||
(sleep 0.25))
|
||||
(sleep 0.5))
|
||||
(ao-pause ao-handle #f)
|
||||
(dbg-rktplayer "Playing on...")
|
||||
(set-state! 'playing)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -144,6 +179,7 @@
|
||||
(let ((file (send ct-data get-file)))
|
||||
(dbg-rktplayer "opening flac handle for file: ~a" file)
|
||||
(set! flac-handle (flac-open file flac-meta flac-play))
|
||||
(set! current-track-id (send ct-data get-id))
|
||||
(dbg-rktplayer "Starting flac-read")
|
||||
(let ((result (flac-read flac-handle)))
|
||||
(if (eq? result 'end-of-stream)
|
||||
@@ -202,7 +238,13 @@
|
||||
)
|
||||
|
||||
(define/public (next-track)
|
||||
(set! track (+ track 1))
|
||||
(unless (eq? repeat-state 'repeat-one)
|
||||
(set! track (+ track 1)))
|
||||
|
||||
(when (eq? repeat-state 'repeat-all)
|
||||
(when (>= track (send pl length))
|
||||
(set! track 0)))
|
||||
|
||||
(if (>= track (send pl length))
|
||||
(begin
|
||||
(set-state! 'stopped)
|
||||
@@ -210,7 +252,7 @@
|
||||
(begin
|
||||
(set! ct-data (send pl track track))
|
||||
(set-state! 'play)
|
||||
(track-nr-updater track)
|
||||
;(track-nr-updater track)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -256,6 +298,24 @@
|
||||
(set! pause (not pause))
|
||||
(dbg-rktplayer "pauzed: ~a" pause)
|
||||
)
|
||||
|
||||
(define/public (pause!)
|
||||
(set! pause #t))
|
||||
|
||||
(define/public (play!)
|
||||
(set! pause #f))
|
||||
|
||||
(define/public (get-repeat)
|
||||
repeat-state)
|
||||
|
||||
(define/public (repeat! state) ; no-repeat, repeat-all, repeat-one
|
||||
(set! repeat-state state)
|
||||
(repeat-updater state)
|
||||
)
|
||||
|
||||
(define/public (seek percentage)
|
||||
(ao-clear-async ao-handle)
|
||||
(flac-seek flac-handle percentage))
|
||||
|
||||
(define (state-machine)
|
||||
(let ((st (orig-current-seconds))
|
||||
@@ -268,15 +328,17 @@
|
||||
(begin
|
||||
(cond
|
||||
((eq? state 'stopped)
|
||||
(sleep 0.01))
|
||||
(sleep 0.1))
|
||||
((eq? state 'play)
|
||||
(if (eq? pl #f)
|
||||
(set-state! 'stoppped)
|
||||
(play-track-worker)))
|
||||
((eq? state 'playing)
|
||||
(sleep 0.01))
|
||||
(sleep 0.1))
|
||||
((eq? state 'track-feeded)
|
||||
(send this next-track))
|
||||
(else
|
||||
(sleep 0.1))
|
||||
)
|
||||
;(let ((ns (orig-current-seconds)))
|
||||
; (when (> (- ns 5) s)
|
||||
@@ -286,12 +348,14 @@
|
||||
)
|
||||
))
|
||||
(worker)))
|
||||
|
||||
(define/public (set-list! playlist)
|
||||
(stop-and-clear)
|
||||
(set! pl playlist)
|
||||
)
|
||||
|
||||
(define/public (play playlist)
|
||||
(stop-and-clear)
|
||||
;(unless (eq? pl #f) (send pl display-tracks))
|
||||
(set! pl playlist)
|
||||
;(unless (eq? pl #f) (send pl display-tracks))
|
||||
(send this set-list! playlist)
|
||||
(send this play-track 0)
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user