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 Mp3InputStream(InputStream input) { } 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 @@ private void initStreams() throws IOException { 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 + } + } } }