Retry opening track files after failure, and gracefully handle final failure by skipping the track.
This commit is contained in:
parent
dd977cc899
commit
abd676fa49
|
@ -105,6 +105,7 @@ public class MusicHandler implements AudioSendHandler, Closeable, Consumer<Track
|
||||||
} catch (UnsupportedAudioFileException | IOException ex)
|
} catch (UnsupportedAudioFileException | IOException ex)
|
||||||
{
|
{
|
||||||
Logger.getLogger(Chords.class.getName()).log(Level.SEVERE, null, ex);
|
Logger.getLogger(Chords.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
skipTrack();
|
||||||
} finally
|
} finally
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,8 @@ package moe.nekojimi.chords;
|
||||||
import java.io.Closeable;
|
import java.io.Closeable;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
import javax.sound.sampled.AudioFormat;
|
import javax.sound.sampled.AudioFormat;
|
||||||
import javax.sound.sampled.AudioInputStream;
|
import javax.sound.sampled.AudioInputStream;
|
||||||
import javax.sound.sampled.AudioSystem;
|
import javax.sound.sampled.AudioSystem;
|
||||||
|
@ -24,6 +26,8 @@ public class TrackPlayer implements Closeable
|
||||||
|
|
||||||
private static final int DESIRED_BUFFER_SIZE = 3840 * 500;
|
private static final int DESIRED_BUFFER_SIZE = 3840 * 500;
|
||||||
private static final int MAX_READ_FAILS = 3;
|
private static final int MAX_READ_FAILS = 3;
|
||||||
|
private static final int RETRY_COUNT = 10;
|
||||||
|
private static final int RETRY_DELAY = 100;
|
||||||
|
|
||||||
private final CircularByteBuffer audioBuffer = new CircularByteBuffer(3840 * 1024);
|
private final CircularByteBuffer audioBuffer = new CircularByteBuffer(3840 * 1024);
|
||||||
|
|
||||||
|
@ -33,8 +37,34 @@ public class TrackPlayer implements Closeable
|
||||||
|
|
||||||
public TrackPlayer(Track track) throws UnsupportedAudioFileException, IOException
|
public TrackPlayer(Track track) throws UnsupportedAudioFileException, IOException
|
||||||
{
|
{
|
||||||
AudioInputStream in = AudioSystem.getAudioInputStream(track.getLocation());
|
AudioInputStream in = null;
|
||||||
AudioFormat decodedFormat = AudioSendHandler.INPUT_FORMAT;
|
AudioFormat decodedFormat = null;
|
||||||
|
for (int retry = 0; retry < RETRY_COUNT; retry++)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
in = AudioSystem.getAudioInputStream(track.getLocation());
|
||||||
|
decodedFormat = AudioSendHandler.INPUT_FORMAT;
|
||||||
|
|
||||||
|
break; // it worked!
|
||||||
|
} catch (IOException ex)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Thread.sleep(((long) Math.pow(2, retry)) * RETRY_DELAY);
|
||||||
|
} catch (InterruptedException ex1)
|
||||||
|
{
|
||||||
|
if (retry < RETRY_COUNT)
|
||||||
|
{
|
||||||
|
System.err.println("Open file " + track.getLocation() + " failed, retry " + retry + "...");
|
||||||
|
continue;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
input = AudioSystem.getAudioInputStream(decodedFormat, in);
|
input = AudioSystem.getAudioInputStream(decodedFormat, in);
|
||||||
fillBuffer(false);
|
fillBuffer(false);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue