From 2ccb9f6ab8793678f9f6d5ee7341537318081378 Mon Sep 17 00:00:00 2001 From: Jan Svabenik Date: Thu, 2 Apr 2026 22:51:51 +0200 Subject: [PATCH] feat: parse wav metadata for offline audio source --- internal/audio/wav.go | 20 +++++++++++++++++--- internal/audio/wav_test.go | 6 ++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/internal/audio/wav.go b/internal/audio/wav.go index 4cf28d0..8725caf 100644 --- a/internal/audio/wav.go +++ b/internal/audio/wav.go @@ -8,8 +8,10 @@ import ( ) type WAVSource struct { - frames []Frame - index int + frames []Frame + index int + SampleRate int + Channels int } func LoadWAVSource(path string) (*WAVSource, error) { @@ -27,16 +29,24 @@ func LoadWAVSource(path string) (*WAVSource, error) { return nil, fmt.Errorf("unsupported wav header") } + audioFormat := binary.LittleEndian.Uint16(header[20:22]) channels := binary.LittleEndian.Uint16(header[22:24]) + sampleRate := binary.LittleEndian.Uint32(header[24:28]) bitsPerSample := binary.LittleEndian.Uint16(header[34:36]) dataSize := binary.LittleEndian.Uint32(header[40:44]) + if audioFormat != 1 { + return nil, fmt.Errorf("only PCM wav supported") + } if bitsPerSample != 16 { return nil, fmt.Errorf("only 16-bit PCM wav supported") } if channels != 1 && channels != 2 { return nil, fmt.Errorf("only mono/stereo wav supported") } + if sampleRate == 0 { + return nil, fmt.Errorf("invalid wav sample rate") + } raw := make([]byte, dataSize) if _, err := io.ReadFull(f, raw); err != nil { @@ -54,7 +64,11 @@ func LoadWAVSource(path string) (*WAVSource, error) { frames = append(frames, NewFrame(l, r)) } - return &WAVSource{frames: frames}, nil + return &WAVSource{ + frames: frames, + SampleRate: int(sampleRate), + Channels: int(channels), + }, nil } func (s *WAVSource) NextFrame() Frame { diff --git a/internal/audio/wav_test.go b/internal/audio/wav_test.go index 84750b8..88ee755 100644 --- a/internal/audio/wav_test.go +++ b/internal/audio/wav_test.go @@ -28,5 +28,11 @@ func TestLoadWAVSource(t *testing.T) { if err != nil { t.Fatalf("LoadWAVSource failed: %v", err) } + if src.SampleRate != 48000 { + t.Fatalf("unexpected sample rate: %d", src.SampleRate) + } + if src.Channels != 1 { + t.Fatalf("unexpected channels: %d", src.Channels) + } _ = src.NextFrame() }