From 8725589619285819ad2b980b192737621f3f9d6a Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Mon, 28 Aug 2017 01:31:29 +0900 Subject: [PATCH] audio/mp3: Bug fix: decoding a mono MP3 panics on browsers (#421) --- audio/mp3/decode_js.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/audio/mp3/decode_js.go b/audio/mp3/decode_js.go index 7d842070f..2e56a3368 100644 --- a/audio/mp3/decode_js.go +++ b/audio/mp3/decode_js.go @@ -18,6 +18,7 @@ package mp3 import ( "errors" + "fmt" "io" "io/ioutil" @@ -98,22 +99,31 @@ func Decode(context *audio.Context, src audio.ReadSeekCloser) (*Stream, error) { return nil, err } s := &Stream{} - ch := make(chan struct{}) + ch := make(chan error) klass := js.Global.Get("OfflineAudioContext") if klass == js.Undefined { klass = js.Global.Get("webkitOfflineAudioContext") } if klass == js.Undefined { - return nil, errors.New("vorbis: OfflineAudioContext is not available") + return nil, errors.New("audio/mp3: OfflineAudioContext is not available") } // TODO: 1 is a correct second argument? oc := klass.New(2, 1, context.SampleRate()) oc.Call("decodeAudioData", js.NewArrayBuffer(b), func(buf *js.Object) { s.leftData = buf.Call("getChannelData", 0).Interface().([]float32) - s.rightData = buf.Call("getChannelData", 1).Interface().([]float32) + switch n := buf.Get("numberOfChannels").Int(); n { + case 1: + s.rightData = s.leftData + case 2: + s.rightData = buf.Call("getChannelData", 1).Interface().([]float32) + default: + ch <- fmt.Errorf("audio/mp3: Number of channels must be 1 or 2 but %d", n) + } close(ch) }) - <-ch + if err := <-ch; err != nil { + return nil, err + } return s, nil }