mp3 support, based on mpg123

This commit is contained in:
2026-04-22 13:28:37 +02:00
parent bba44733ab
commit 4c22dd54cc
7 changed files with 575 additions and 116 deletions
+26 -9
View File
@@ -1,6 +1,7 @@
(module audio-decoder racket/base
(require "flac-decoder.rkt"
"mp3-decoder.rkt"
racket/contract
racket/string
racket/path
@@ -24,11 +25,12 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-struct audio-reader
(exts valid? open reader seeker stopper))
(exts valid? open reader seeker stopper ao-type))
;; audiotype, audio-reader
(define audio-readers (make-hash))
;; FLAC
(hash-set! audio-readers
'flac
(make-audio-reader '("flac")
@@ -36,14 +38,26 @@
flac-open
flac-read
flac-seek
flac-stop))
flac-stop
'flac))
;; MP3
(hash-set! audio-readers
'mp3
(make-audio-reader '("mp3")
mp3-valid?
mp3-open
mp3-read
mp3-seek
mp3-stop
'ao))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Known extensions
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define known-extensions
'("flac"))
'("flac" "mp3"))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Register audio reader
@@ -89,12 +103,13 @@
(let ((reader (find-reader file)))
(if (eq? reader #f)
#f
(audio-reader-valid? file)))
((audio-reader-valid? (cadr reader)) file)))
#f))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; cb-stream-info will be called with
; - audio-type: symbol?
; - audio-type: symbol? (e.g. 'flac, 'mp3)
; - ao-type: symbol? - e.g. 'flac, 'ao (ao means the buffer can be used directly by aolib).
; - handle: audio-handle?
; - meta: hash?
; Meta information must at least contain:
@@ -106,6 +121,7 @@
;
; cb-audio will be called with
; - audio-type: symbol?
; - ao-type: symbol? - e.g. 'flac, 'ao (ao means the buffer can be used directly by aolib).
; - handle: audio-handle?
; - buf-info: hash?
; - buffer: cpointer? - contains data to be fed to ao - must be owned / released by the driver
@@ -134,6 +150,7 @@
(error (format "Cannot find reader for '~a'" audio-file)))
(let* ((reader-type (car reader*))
(reader (cadr reader*))
(ao-type (audio-reader-ao-type reader))
(handle (make-audio-handle reader-type cb-stream-info cb-audio reader #f))
)
(set-audio-handle-driver-handle!
@@ -141,9 +158,9 @@
((audio-reader-open reader)
file
(λ (meta)
(cb-stream-info reader-type handle meta))
(cb-stream-info reader-type ao-type handle meta))
(λ (buf-info audio-buffer buf-len)
(cb-audio reader-type handle buf-info audio-buffer buf-len)))
(cb-audio reader-type ao-type handle buf-info audio-buffer buf-len)))
)
handle)
)
@@ -153,7 +170,7 @@
(define/contract (audio-read handle)
(-> audio-handle? void?)
(let ((reader (audio-reader-reader (audio-handle-driver handle))))
(void? (reader (audio-handle-driver-handle handle)))))
(void (reader (audio-handle-driver-handle handle)))))
(define/contract (audio-seek handle percentage)
(-> audio-handle? number? void?)