From 31350dc497b04ded8ce36c3ae72f37edca041812 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Fri, 22 Dec 2017 05:15:08 +0900 Subject: [PATCH] mp3: Avoid calling Length() if possible (#463) --- audio/mp3/decode_notjs.go | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/audio/mp3/decode_notjs.go b/audio/mp3/decode_notjs.go index af8bf4b5c..faf913469 100644 --- a/audio/mp3/decode_notjs.go +++ b/audio/mp3/decode_notjs.go @@ -29,28 +29,40 @@ import ( // Stream is a decoded stream. type Stream struct { - inner audio.ReadSeekCloser - size int64 + orig *mp3.Decoder + resampling *convert.Resampling } // Read is implementation of io.Reader's Read. func (s *Stream) Read(buf []byte) (int, error) { - return s.inner.Read(buf) + if s.resampling != nil { + return s.resampling.Read(buf) + } + return s.orig.Read(buf) } // Seek is implementation of io.Seeker's Seek. func (s *Stream) Seek(offset int64, whence int) (int64, error) { - return s.inner.Seek(offset, whence) + if s.resampling != nil { + return s.resampling.Seek(offset, whence) + } + return s.orig.Seek(offset, whence) } // Close is implementation of io.Closer's Close. func (s *Stream) Close() error { - return s.inner.Close() + if s.resampling != nil { + return s.resampling.Close() + } + return s.orig.Close() } // Size returns the size of decoded stream in bytes. func (s *Stream) Size() int64 { - return s.size + if s.resampling != nil { + return s.resampling.Size() + } + return s.orig.Length() } // Decode decodes MP3 source and returns a decoded stream. @@ -63,16 +75,12 @@ func Decode(context *audio.Context, src audio.ReadSeekCloser) (*Stream, error) { if err != nil { return nil, err } - // TODO: Resampling - var s audio.ReadSeekCloser = d - size := d.Length() + var r *convert.Resampling if d.SampleRate() != context.SampleRate() { - r := convert.NewResampling(s, d.Length(), d.SampleRate(), context.SampleRate()) - s = r - size = r.Size() + r = convert.NewResampling(d, d.Length(), d.SampleRate(), context.SampleRate()) } return &Stream{ - inner: s, - size: size, + orig: d, + resampling: r, }, nil }