mp3 support, based on mpg123
This commit is contained in:
+26
-9
@@ -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?)
|
||||
|
||||
Reference in New Issue
Block a user