use of org.bff.javampd.MPDPlayer in project openhab1-addons by openhab.
the class MpdBinding method executePlayerCommand.
/**
* Executes the given <code>playerCommandLine</code> on the MPD. The
* <code>playerCommandLine</code> is split into its properties
* <code>playerId</code> and <code>playerCommand</code>.
*
* @param playerCommandLine the complete commandLine which gets splitted into
* its properties.
*/
private void executePlayerCommand(String playerCommandLine, Object commandParams) {
String[] commandParts = playerCommandLine.split(":");
String playerId = commandParts[0];
String playerCommand = commandParts[1];
MPD daemon = findMPDInstance(playerId);
if (daemon == null) {
// we give that player another chance -> try to reconnect
reconnect(playerId);
}
if (daemon != null) {
PlayerCommandTypeMapping pCommand = null;
try {
pCommand = PlayerCommandTypeMapping.fromString(playerCommand);
MPDPlayer player = daemon.getMPDPlayer();
MPDPlaylist playlist = daemon.getMPDPlaylist();
MPDDatabase db = daemon.getMPDDatabase();
switch(pCommand) {
case PAUSE:
player.pause();
break;
case PLAY:
player.play();
break;
case STOP:
player.stop();
break;
case VOLUME_INCREASE:
player.setVolume(player.getVolume() + VOLUME_CHANGE_SIZE);
break;
case VOLUME_DECREASE:
player.setVolume(player.getVolume() - VOLUME_CHANGE_SIZE);
break;
case NEXT:
player.playNext();
break;
case PREV:
player.playPrev();
break;
case PLAYSONG:
logger.debug("Searching for song {}", commandParams);
Collection<MPDSong> songs = db.find(ScopeType.TITLE, (String) commandParams);
Iterator<MPDSong> it = songs.iterator();
if (it.hasNext() == true) {
MPDSong song = it.next();
logger.debug("Song found: {}", song.getFile());
MPDFile file = new MPDFile();
file.setPath(song.getFile());
playlist.clearPlaylist();
playlist.addFileOrDirectory(file);
} else {
logger.debug("Song not found: {}", commandParams);
}
break;
case PLAYSONGID:
logger.debug("Play id {}", ((DecimalType) commandParams).intValue());
MPDSong song = new MPDSong();
// song.setId(Integer.parseInt((String) commandParams));
song.setId(((DecimalType) commandParams).intValue());
player.playId(song);
break;
case ENABLE:
case DISABLE:
Integer outputId = Integer.valueOf((String) commandParams);
MPDAdmin admin = daemon.getMPDAdmin();
// internally mpd uses 0-based indexing
MPDOutput output = new MPDOutput(outputId - 1);
if (pCommand == PlayerCommandTypeMapping.ENABLE) {
admin.enableOutput(output);
} else {
admin.disableOutput(output);
}
break;
case VOLUME:
logger.debug("Volume adjustment received: '{}' '{}'", pCommand, commandParams);
player.setVolume(((PercentType) commandParams).intValue());
break;
}
} catch (MPDPlayerException pe) {
logger.error("Error while executing '{}' command: {}", pCommand, pe.getMessage());
} catch (Exception e) {
logger.warn("Unknown player command '{}'", playerCommand);
}
logger.info("Executed command '{}' for player '{}'", playerCommand, playerId);
} else {
logger.warn("Player '{}' was not found or is not connected", playerId);
}
}
use of org.bff.javampd.MPDPlayer in project openhab1-addons by openhab.
the class MpdBinding method determineSongChange.
private void determineSongChange(String playerId) {
MPD daemon = findMPDInstance(playerId);
if (daemon == null) {
// we give that player another chance -> try to reconnect
reconnect(playerId);
}
if (daemon != null) {
try {
MPDPlayer player = daemon.getMPDPlayer();
// get the song object here
MPDSong curSong = player.getCurrentSong();
MPDSong curSongCache = songInfoCache.get(playerId);
if (!songsEqual(curSong, curSongCache)) {
// song is different (or not in cache), update cache
songInfoCache.put(playerId, curSong);
// action the song change¬ification
songChanged(playerId, curSong);
}
} catch (MPDPlayerException pe) {
logger.error("Error while updating player status for player '{}': {}", playerId, pe.getMessage());
} catch (Exception e) {
logger.warn("Failed to communicate with player '{}'", playerId);
}
} else {
logger.warn("Player '{}' was not found or is not connected", playerId);
}
}
use of org.bff.javampd.MPDPlayer in project openhab1-addons by openhab.
the class MpdBinding method determinePlayStateChange.
private void determinePlayStateChange(String playerId) {
MPD daemon = findMPDInstance(playerId);
if (daemon == null) {
// we give that player another chance -> try to reconnect
reconnect(playerId);
}
if (daemon != null) {
try {
MPDPlayer player = daemon.getMPDPlayer();
// get the song object here
PlayerStatus ps = player.getStatus();
PlayerStatus curPs = playerStatusCache.get(playerId);
if (curPs != null) {
if (ps != curPs) {
logger.debug("Play state of player '{}' changed", playerId);
playerStatusCache.put(playerId, ps);
PlayerCommandTypeMapping reportTo;
OnOffType reportStatus;
// trigger song update
if (ps.equals(PlayerStatus.STATUS_PAUSED) || ps.equals(PlayerStatus.STATUS_STOPPED)) {
// stopped
reportTo = PlayerCommandTypeMapping.STOP;
reportStatus = OnOffType.OFF;
} else {
// playing
reportTo = PlayerCommandTypeMapping.PLAY;
reportStatus = OnOffType.ON;
}
broadcastPlayerStateChange(playerId, reportTo, reportStatus);
} else {
// nothing, same state
}
} else {
playerStatusCache.put(playerId, ps);
}
} catch (MPDPlayerException pe) {
logger.error("Error while updating player status for player '{}': {}", playerId, pe.getMessage());
} catch (Exception e) {
logger.warn("Failed to communicate with player '{}'", playerId);
}
} else {
logger.warn("Player '{}' was not found or is not connected", playerId);
}
}
Aggregations