AtlatestRepositorysigil-audio
sigil-audio / tree / testtest-ogg-encode.sgl
1
;;; Test OGG Vorbis encoding2
;;;3
;;; Generates a sine wave, encodes to .ogg, then verifies the file4
;;; can be read back.6
(import (sigil core)7
(sigil math)8
(sigil audio))10
(define pi 3.14159265358979)12
;; Generate a 1-second 440Hz sine wave (mono, 44100Hz)13
(define sample-rate 44100)14
(define num-samples sample-rate) ;; 1 second15
(define frequency 440.0)17
(display "Generating mono sine wave... ")18
(define samples19
(let ((v (make-vector num-samples 0.0)))20
(let loop ((i 0))21
(when (< i num-samples)22
(vector-set! v i (* 0.8 (sin (* 2.0 pi frequency (/ i sample-rate)))))23
(loop (+ i 1))))24
v))25
(display "OK\n")27
;; Convert to float32 bytevector28
(display "Converting to float buffer... ")29
(define buffer (make-float-buffer samples))30
(display (string-append (number->string (bytevector-length buffer)) " bytes\n"))32
;; Write OGG file using keyword API33
(define output-path "/tmp/test-sigil-ogg-encode.ogg")34
(display (string-append "Encoding mono to " output-path "... "))35
(define result (write-ogg output-path buffer36
sample-rate: sample-rate37
channels: 138
quality: 0.4))39
(if result40
(display "OK\n")41
(begin (display "FAILED\n") (exit 1)))43
;; Verify we can decode the file we just wrote44
(display "Verifying: loading encoded file back... ")45
(define loaded (load-sound output-path))46
(if loaded47
(display "OK\n")48
(begin (display "FAILED - could not decode written file\n") (exit 1)))50
;; Test stereo encoding with defaults (sample-rate: 44100, channels: 2, quality: 0.4)51
(display "\nGenerating stereo sine wave... ")52
(define stereo-samples53
(let ((v (make-vector (* num-samples 2) 0.0)))54
(let loop ((i 0))55
(when (< i num-samples)56
(let ((s (* 0.8 (sin (* 2.0 pi frequency (/ i sample-rate))))))57
(vector-set! v (* i 2) s)58
(vector-set! v (+ (* i 2) 1)59
(* 0.8 (sin (* 2.0 pi (* frequency 1.5) (/ i sample-rate))))))60
(loop (+ i 1))))61
v))62
(display "OK\n")64
(define stereo-buffer (make-float-buffer stereo-samples))65
(define stereo-path "/tmp/test-sigil-ogg-encode-stereo.ogg")66
(display (string-append "Encoding stereo to " stereo-path "... "))67
;; Use defaults for stereo (channels: 2 is default)68
(define stereo-result (write-ogg stereo-path stereo-buffer69
sample-rate: sample-rate))70
(if stereo-result71
(display "OK\n")72
(begin (display "FAILED\n") (exit 1)))74
;; Verify stereo file decodes75
(display "Verifying: loading stereo file back... ")76
(define stereo-loaded (load-sound stereo-path))77
(if stereo-loaded78
(display "OK\n")79
(begin (display "FAILED - could not decode stereo file\n") (exit 1)))81
(display "\nAll tests passed!\n")