small adjustments, many enhancements to rktplayer

This commit is contained in:
2026-04-16 22:22:25 +02:00
parent 82fa80746c
commit 4bef5cf94c
8 changed files with 492 additions and 49 deletions

View File

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