Skip to content

Commit

Permalink
Better handling of misnamed MP3/OGG files. (part of #120)
Browse files Browse the repository at this point in the history
This also catches more MP3 loading errors that could occur and properly cleans up resources.

Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
  • Loading branch information
itdelatrisu committed Aug 26, 2015
1 parent 4b68ceb commit 20d40dd
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 10 deletions.
7 changes: 6 additions & 1 deletion src/org/newdawn/slick/openal/Mp3InputStream.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,15 +76,20 @@ 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 {
header = bitstream.readFrame();
} 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();
Expand Down
32 changes: 23 additions & 9 deletions src/org/newdawn/slick/openal/OpenALStreamPlayer.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
}
}

Expand Down

0 comments on commit 20d40dd

Please # to comment.