From b1982bf5cc1fa6d42512461da7293ba7769f2e3b Mon Sep 17 00:00:00 2001 From: wadasan Date: Sat, 11 Aug 2018 11:41:36 +0900 Subject: [PATCH] fixed small bug: changed Seek skipping fixed size header (44bytes) to skipping variable size. --- wav/decode.go | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/wav/decode.go b/wav/decode.go index 6ec9903..4df8a67 100644 --- a/wav/decode.go +++ b/wav/decode.go @@ -46,6 +46,7 @@ func Decode(rc io.ReadCloser) (s beep.StreamSeekCloser, format beep.Format, err // check each formtypes ft := [4]byte{0, 0, 0, 0} var fs int32 = 0 + d.hsz = 4 + 4 + 4 // add size of (RiffMark + FileSize + WaveMark) for string(ft[:]) != "data" { if err = binary.Read(rc, binary.LittleEndian, ft[:]); err != nil { return nil, beep.Format{}, errors.Wrap(err, "wav: missing chunk type") @@ -56,6 +57,7 @@ func Decode(rc io.ReadCloser) (s beep.StreamSeekCloser, format beep.Format, err if err := binary.Read(rc, binary.LittleEndian, &d.h.FormatSize); err != nil { return nil, beep.Format{}, errors.New("wav: missing format chunk size") } + d.hsz += 4 + 4 + d.h.FormatSize // add size of (FmtMark + FormatSize + its trailing size) if err := binary.Read(rc, binary.LittleEndian, &d.h.FormatType); err != nil { return nil, beep.Format{}, errors.New("wav: missing format type") } @@ -115,6 +117,7 @@ func Decode(rc io.ReadCloser) (s beep.StreamSeekCloser, format beep.Format, err if err := binary.Read(rc, binary.LittleEndian, &d.h.DataSize); err != nil { return nil, beep.Format{}, errors.Wrap(err, "wav: missing data chunk size") } + d.hsz += 4 + 4 //add size of (DataMark + DataSize) default: if err := binary.Read(rc, binary.LittleEndian, &fs); err != nil { return nil, beep.Format{}, errors.Wrap(err, "wav: missing unknown chunk size") @@ -123,6 +126,7 @@ func Decode(rc io.ReadCloser) (s beep.StreamSeekCloser, format beep.Format, err if err := binary.Read(rc, binary.LittleEndian, trash); err != nil { return nil, beep.Format{}, errors.Wrap(err, "wav: missing unknown chunk body") } + d.hsz += 4 + fs //add size of (Unknown formtype + formsize) } } @@ -173,24 +177,25 @@ type formatchunkextensible struct { } type header struct { - RiffMark [4]byte - FileSize int32 - WaveMark [4]byte - FmtMark [4]byte - FormatSize int32 - FormatType int16 + RiffMark [4]byte + FileSize int32 + WaveMark [4]byte + FmtMark [4]byte + FormatSize int32 + FormatType int16 NumChans int16 SampleRate int32 ByteRate int32 BytesPerFrame int16 BitsPerSample int16 - DataMark [4]byte - DataSize int32 + DataMark [4]byte + DataSize int32 } type decoder struct { rc io.ReadCloser h header + hsz int32 pos int32 err error } @@ -260,7 +265,7 @@ func (d *decoder) Seek(p int) error { return fmt.Errorf("wav: seek position %v out of range [%v, %v]", p, 0, d.Len()) } pos := int32(p) * int32(d.h.BytesPerFrame) - _, err := seeker.Seek(int64(pos)+44, io.SeekStart) // 44 is the size of the header + _, err := seeker.Seek(int64(pos+d.hsz), io.SeekStart) // hsz is the size of the header if err != nil { return errors.Wrap(err, "wav: seek error") }