private final List<MPDCommand> pendingCommands = new ArrayList<>();
private AtomicBoolean isInIdle = new AtomicBoolean(false);
+ private AtomicBoolean wakingUpFromIdle = new AtomicBoolean(false);
private AtomicBoolean disposed = new AtomicBoolean(false);
public MPDConnectionThread(MPDResponseListener listener, String address, Integer port, String password) {
while (!disposed.get()) {
try {
synchronized (pendingCommands) {
- pendingCommands.clear();
pendingCommands.add(new MPDCommand("status"));
pendingCommands.add(new MPDCommand("currentsong"));
}
closeSocket();
if (!disposed.get()) {
- sleep(RECONNECTION_TIMEOUT_SEC * 1000);
+ if (wakingUpFromIdle.compareAndSet(true, false)) {
+ logger.debug("reconnecting immediately and keeping pending commands");
+ } else {
+ logger.debug("reconnecting in {} seconds and clearing pending commands...",
+ RECONNECTION_TIMEOUT_SEC);
+ sleep(RECONNECTION_TIMEOUT_SEC * 1000);
+ synchronized (pendingCommands) {
+ pendingCommands.clear();
+ }
+ }
}
}
} catch (InterruptedException ignore) {
private void sendCommand(MPDCommand command) throws IOException {
logger.trace("send command '{}'", command);
+ wakingUpFromIdle.set("noidle".equals(command.getCommand()));
final Socket socket = this.socket;
if (socket != null) {
String line = command.asLine();