From 20d40dd520c0043a23f0bb4a743d03278aec3cfe Mon Sep 17 00:00:00 2001 From: Jeffrey Han Date: Wed, 26 Aug 2015 09:29:28 -0500 Subject: [PATCH] Better handling of misnamed MP3/OGG files. (part of #120) This also catches more MP3 loading errors that could occur and properly cleans up resources. Signed-off-by: Jeffrey Han --- .../newdawn/slick/openal/Mp3InputStream.java | 7 +++- .../slick/openal/OpenALStreamPlayer.java | 32 +++++++++++++------ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/org/newdawn/slick/openal/Mp3InputStream.java b/src/org/newdawn/slick/openal/Mp3InputStream.java index 8d8cb6df..19dd105f 100644 --- a/src/org/newdawn/slick/openal/Mp3InputStream.java +++ b/src/org/newdawn/slick/openal/Mp3InputStream.java @@ -76,8 +76,9 @@ public class Mp3InputStream extends InputStream implements AudioInputStream { /** * Create a new stream to decode MP3 data. * @param input the input stream from which to read the MP3 file + * @throws IOException failure to read the header from the input stream */ - public Mp3InputStream(InputStream input) { + public Mp3InputStream(InputStream input) throws IOException { decoder = new Decoder(); bitstream = new Bitstream(input); try { @@ -85,6 +86,10 @@ public class Mp3InputStream extends InputStream implements AudioInputStream { } catch (BitstreamException e) { Log.error(e); } + if (header == null) { + close(); + throw new IOException("Failed to read header from MP3 input stream."); + } channels = (header.mode() == Header.SINGLE_CHANNEL) ? 1 : 2; sampleRate = header.frequency(); diff --git a/src/org/newdawn/slick/openal/OpenALStreamPlayer.java b/src/org/newdawn/slick/openal/OpenALStreamPlayer.java index a6e6c3f4..cc13a3e5 100644 --- a/src/org/newdawn/slick/openal/OpenALStreamPlayer.java +++ b/src/org/newdawn/slick/openal/OpenALStreamPlayer.java @@ -152,16 +152,30 @@ public class OpenALStreamPlayer { if (url != null) { audio = new OggInputStream(url.openStream()); } else { - if (ref.toLowerCase().endsWith(".mp3")) - audio = new Mp3InputStream(ResourceLoader.getResourceAsStream(ref)); - else - audio = new OggInputStream(ResourceLoader.getResourceAsStream(ref)); - - if (audio.getRate() == 0 && audio.getChannels() == 0) { - if (ref.toLowerCase().endsWith(".mp3")) - audio = new OggInputStream(ResourceLoader.getResourceAsStream(ref)); - else + if (ref.toLowerCase().endsWith(".mp3")) { + try { audio = new Mp3InputStream(ResourceLoader.getResourceAsStream(ref)); + } catch (IOException e) { + // invalid MP3: check if file is actually OGG + try { + audio = new OggInputStream(ResourceLoader.getResourceAsStream(ref)); + } catch (IOException e1) { + throw e; // invalid OGG: re-throw original MP3 exception + } + if (audio.getRate() == 0 && audio.getChannels() == 0) + throw e; // likely not OGG: re-throw original MP3 exception + } + } else { + audio = new OggInputStream(ResourceLoader.getResourceAsStream(ref)); + if (audio.getRate() == 0 && audio.getChannels() == 0) { + // invalid OGG: check if file is actually MP3 + AudioInputStream audioOGG = audio; + try { + audio = new Mp3InputStream(ResourceLoader.getResourceAsStream(ref)); + } catch (IOException e) { + audio = audioOGG; // invalid MP3: keep OGG stream + } + } } }