diff --git a/audio/vorbis/test_tooshort.ogg b/audio/vorbis/test_tooshort.ogg new file mode 100755 index 000000000..66387bd54 Binary files /dev/null and b/audio/vorbis/test_tooshort.ogg differ diff --git a/audio/vorbis/vorbis.go b/audio/vorbis/vorbis.go index 5c2d238b0..4666a8a52 100644 --- a/audio/vorbis/vorbis.go +++ b/audio/vorbis/vorbis.go @@ -172,7 +172,7 @@ func decode(in audio.ReadSeekCloser) (*decoded, int, int, error) { decoder: r, } runtime.SetFinalizer(d, (*decoded).Close) - if _, err := d.Read(make([]uint8, 65536)); err != nil { + if _, err := d.Read(make([]uint8, 65536)); err != nil && err != io.EOF { return nil, 0, 0, err } if _, err := d.Seek(0, io.SeekStart); err != nil { diff --git a/audio/vorbis/vorbis_test.go b/audio/vorbis/vorbis_test.go index 5bd64c1f9..d03f25b2a 100644 --- a/audio/vorbis/vorbis_test.go +++ b/audio/vorbis/vorbis_test.go @@ -24,18 +24,23 @@ import ( . "github.com/hajimehoshi/ebiten/audio/vorbis" ) +var audioContext *audio.Context + +func init() { + var err error + audioContext, err = audio.NewContext(44100) + if err != nil { + panic(err) + } +} + func TestMono(t *testing.T) { bs, err := ioutil.ReadFile("test_mono.ogg") if err != nil { t.Fatal(err) } - c, err := audio.NewContext(44100) - if err != nil { - t.Fatal(err) - } - - s, err := Decode(c, audio.BytesReadSeekCloser(bs)) + s, err := Decode(audioContext, audio.BytesReadSeekCloser(bs)) if err != nil { t.Fatal(err) } @@ -57,3 +62,21 @@ func TestMono(t *testing.T) { t.Errorf("s.Length(): got: %d, want: %d", got, want) } } + +func TestTooShort(t *testing.T) { + bs, err := ioutil.ReadFile("test_tooshort.ogg") + if err != nil { + t.Fatal(err) + } + + s, err := Decode(audioContext, audio.BytesReadSeekCloser(bs)) + if err != nil { + t.Fatal(err) + } + + got := s.Length() + want := int64(79424) + if got != want { + t.Errorf("s.Length(): got: %d, want: %d", got, want) + } +}