diff --git a/flac/decode.go b/flac/decode.go index a4a672a..bd6893a 100644 --- a/flac/decode.go +++ b/flac/decode.go @@ -23,7 +23,15 @@ func Decode(r io.Reader) (s beep.StreamSeekCloser, format beep.Format, err error } } }() - d.stream, err = flac.New(r) + + rs, seeker := r.(io.ReadSeeker) + if seeker { + d.stream, err = flac.NewSeek(rs) + d.seekEnabled = true + } else { + d.stream, err = flac.New(r) + } + if err != nil { return nil, beep.Format{}, errors.Wrap(err, "flac") } @@ -36,11 +44,12 @@ func Decode(r io.Reader) (s beep.StreamSeekCloser, format beep.Format, err error } type decoder struct { - r io.Reader - stream *flac.Stream - buf [][2]float64 - pos int - err error + r io.Reader + stream *flac.Stream + buf [][2]float64 + pos int + err error + seekEnabled bool } func (d *decoder) Stream(samples [][2]float64) (n int, ok bool) { @@ -138,8 +147,15 @@ func (d *decoder) Position() int { return d.pos } +// p represents flac sample num perhaps? func (d *decoder) Seek(p int) error { - return errors.New("flac.decoder.Seek: not yet implemented") + if !d.seekEnabled { + return errors.New("flac.decoder.Seek: not enabled") + } + + pos, err := d.stream.Seek(uint64(p)) + d.pos = int(pos) + return err } func (d *decoder) Close() error { diff --git a/go.mod b/go.mod index dbc3615..b6404dc 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,6 @@ require ( github.com/hajimehoshi/go-mp3 v0.3.0 github.com/hajimehoshi/oto v0.7.1 github.com/jfreymuth/oggvorbis v1.0.1 - github.com/mewkiz/flac v1.0.6 + github.com/mewkiz/flac v1.0.7 github.com/pkg/errors v0.9.1 ) diff --git a/go.sum b/go.sum index c572f2d..a001a2b 100644 --- a/go.sum +++ b/go.sum @@ -28,8 +28,8 @@ github.com/lucasb-eyer/go-colorful v1.0.2 h1:mCMFu6PgSozg9tDNMMK3g18oJBX7oYGrC09 github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mewkiz/flac v1.0.6 h1:OnMwCWZPAnjDndjEzLynOZ71Y2U+/QYHoVI4JEKgKkk= -github.com/mewkiz/flac v1.0.6/go.mod h1:yU74UH277dBUpqxPouHSQIar3G1X/QIclVbFahSd1pU= +github.com/mewkiz/flac v1.0.7 h1:uIXEjnuXqdRaZttmSFM5v5Ukp4U6orrZsnYGGR3yow8= +github.com/mewkiz/flac v1.0.7/go.mod h1:yU74UH277dBUpqxPouHSQIar3G1X/QIclVbFahSd1pU= github.com/mewkiz/pkg v0.0.0-20190919212034-518ade7978e2 h1:EyTNMdePWaoWsRSGQnXiSoQu0r6RS1eA557AwJhlzHU= github.com/mewkiz/pkg v0.0.0-20190919212034-518ade7978e2/go.mod h1:3E2FUC/qYUfM8+r9zAwpeHJzqRVVMIYnpzD/clwWxyA= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=