/**
* Copyright (c) 2010-2016 by the respective copyright holders.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.io.squeezeserver;
import java.util.EventObject;
import java.util.Iterator;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Internal state of a Squeezebox player
*
* @author Markus Wolters
* @author Ben Jones
* @since 1.4.0
*/
public class SqueezePlayer {
public enum Mode {
play,
pause,
stop;
}
private final SqueezeServer squeezeServer;
private final String playerId;
private final String macAddress;
private String ipAddr;
private String uuid;
private int port;
private String name;
private String model;
private Mode mode;
private boolean isPowered;
private boolean isMuted;
private int volume;
private int unmuteVolume;
private int numPlaylistTracks;
private int currPlaylistIndex;
private int currPlayingTime;
private int currPlaylistShuffle;
private int currPlaylistRepeat;
private String title;
private String album;
private String artist;
private String coverArt;
private String genre;
private int year;
private String remoteTitle;
private String irCode;
private static final Logger logger = LoggerFactory.getLogger(SqueezePlayer.class);
public SqueezePlayer(SqueezeServer server, String playerId, String macAddress) {
this.squeezeServer = server;
this.playerId = playerId;
this.macAddress = macAddress;
this.uuid = "";
this.ipAddr = "";
this.port = 0;
this.name = "";
this.model = "";
this.mode = Mode.stop;
this.isPowered = false;
this.isMuted = false;
this.volume = -128;
this.unmuteVolume = 50;
this.numPlaylistTracks = 0;
this.currPlaylistIndex = -1;
this.currPlayingTime = 0;
this.currPlaylistShuffle = 0;
this.currPlaylistRepeat = 0;
this.title = "";
this.album = "";
this.artist = "";
this.coverArt = "";
this.genre = "";
this.year = 0;
this.remoteTitle = "";
printDebug();
}
public String getPlayerId() {
return this.playerId;
}
public String getMacAddress() {
return this.macAddress;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getUuid() {
return this.uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getIpAddr() {
return this.ipAddr;
}
public void setIpAddr(String ipAddr) {
if (ipAddr.contains(":")) {
this.ipAddr = ipAddr.substring(0, ipAddr.indexOf(":"));
this.port = Integer.parseInt(ipAddr.substring(ipAddr.indexOf(":") + 1));
} else {
this.ipAddr = ipAddr;
}
}
public int getPort() {
return this.port;
}
public String getModel() {
return this.model;
}
public void setModel(String model) {
this.model = model;
}
public boolean isPowered() {
return this.isPowered;
}
public void setPowered(boolean isPowered) {
if (this.isPowered != isPowered) {
this.isPowered = isPowered;
firePowerChangeEvent();
}
}
public boolean isMuted() {
return this.isMuted;
}
public void setMuted(boolean isMuted) {
if (this.isMuted != isMuted) {
this.isMuted = isMuted;
fireMuteChangeEvent();
}
}
public Mode getMode() {
return this.mode;
}
public boolean isPlaying() {
return this.mode.equals(Mode.play);
}
public boolean isPaused() {
return this.mode.equals(Mode.pause);
}
public boolean isStopped() {
return this.mode.equals(Mode.stop);
}
public void setMode(Mode mode) {
if (this.mode != mode) {
this.mode = mode;
fireModeChangeEvent();
if (mode == Mode.play) {
fireTitleChangeEvent();
fireVolumeChangeEvent();
}
}
}
public void setVolume(int volume) {
if (this.volume != volume) {
if (volume < 0) {
this.volume = 0;
} else if (volume > 100) {
this.volume = 100;
} else {
this.volume = volume;
}
if (this.volume == 0) {
setMuted(true);
} else {
setMuted(false);
this.unmuteVolume = this.volume;
}
fireVolumeChangeEvent();
}
}
public void setNumberPlaylistTracks(int numberPlaylistTracks) {
this.numPlaylistTracks = numberPlaylistTracks;
fireNumberPlaylistTracksEvent();
}
public void setCurrentPlaylistIndex(int currentPlaylistIndex) {
this.currPlaylistIndex = currentPlaylistIndex;
fireCurrentPlaylistIndexEvent();
}
public void setCurrentPlayingTime(int currentPlayingTime) {
this.currPlayingTime = currentPlayingTime;
fireCurrentPlayingTimeEvent();
}
public void setCurrentPlaylistShuffle(int currentPlaylistShuffle) {
this.currPlaylistShuffle = currentPlaylistShuffle;
fireCurrentPlaylistShuffleEvent();
}
public void setCurrentPlaylistRepeat(int currentPlaylistRepeat) {
this.currPlaylistRepeat = currentPlaylistRepeat;
fireCurrentPlaylistRepeatEvent();
}
public int getNumberPlaylistTracks() {
return this.numPlaylistTracks;
}
public int getCurrentPlaylistIndex() {
return this.currPlaylistIndex;
}
public int getCurrentPlayingTime() {
return this.currPlayingTime;
}
public int getCurrentPlaylistShuffle() {
return this.currPlaylistShuffle;
}
public int getCurrentPlaylistRepeat() {
return this.currPlaylistRepeat;
}
public int getVolume() {
return this.volume;
}
public int getUnmuteVolume() {
return this.unmuteVolume;
}
public int getPlaylistNumTracks() {
return this.numPlaylistTracks;
}
public void printDebug() {
logger.trace("SqueezePlayer id: " + this.playerId);
logger.trace("SqueezePlayer MAC: " + this.macAddress);
logger.trace("SqueezePlayer uuid: " + this.uuid);
logger.trace("SqueezePlayer name: " + this.name);
logger.trace("SqueezePlayer model: " + this.model);
logger.trace("SqueezePlayer ip: " + this.ipAddr);
logger.trace("SqueezePlayer port: " + String.valueOf(this.port));
}
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
if (!StringUtils.equals(this.title, title)) {
logger.trace("Title: " + this.title + " != " + title);
this.title = title;
fireTitleChangeEvent();
}
}
public String getAlbum() {
return this.album;
}
public void setAlbum(String album) {
if (!StringUtils.equals(this.album, album)) {
logger.trace("Album: " + this.album + " != " + album);
this.album = album;
fireAlbumChangeEvent();
}
}
public String getArtist() {
return this.artist;
}
public void setArtist(String artist) {
if (!StringUtils.equals(this.artist, artist)) {
logger.trace("Artist: " + this.artist + " != " + artist);
this.artist = artist;
fireArtistChangeEvent();
}
}
public String getCoverArt() {
return this.coverArt;
}
public void setCoverArt(String coverArt) {
if (!StringUtils.equals(this.coverArt, coverArt)) {
logger.trace("CoverArt: " + this.coverArt + " != " + coverArt);
this.coverArt = coverArt;
fireCoverArtChangeEvent();
}
}
public String getGenre() {
return this.genre;
}
public void setGenre(String genre) {
if (!StringUtils.equals(this.genre, genre)) {
logger.trace("Genre: " + this.genre + " != " + genre);
this.genre = genre;
fireGenreChangeEvent();
}
}
public int getYear() {
return this.year;
}
public void setYear(int year) {
if (this.year != year) {
logger.trace("Year: " + this.year + " != " + year);
this.year = year;
fireYearChangeEvent();
}
}
public String getRemoteTitle() {
return this.remoteTitle;
}
public void setRemoteTitle(String remoteTitle) {
if (!StringUtils.equals(this.remoteTitle, remoteTitle)) {
logger.trace("RemoteTitle: " + this.remoteTitle + " != " + remoteTitle);
this.remoteTitle = remoteTitle;
fireRemoteTitleChangeEvent();
}
}
public String getIrCode() {
return this.irCode;
}
public void setIrCode(String irCode) {
if (!StringUtils.equals(this.irCode, irCode)) {
logger.trace("IrCode: " + this.irCode + " != " + irCode);
this.irCode = irCode;
fireIrCodeChangeEvent();
}
}
@SuppressWarnings("serial")
public class PlayerEvent extends EventObject {
public PlayerEvent(SqueezePlayer source) {
super(source);
}
public SqueezePlayer getPlayer() {
return (SqueezePlayer) this.source;
}
public String getPlayerId() {
// shortcut to get the player id
return getPlayer().getPlayerId();
}
}
private synchronized void fireCurrentPlaylistIndexEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().currentPlaylistIndexEvent(event);
}
}
private synchronized void fireCurrentPlayingTimeEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().currentPlayingTimeEvent(event);
}
}
private synchronized void fireNumberPlaylistTracksEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().numberPlaylistTracksEvent(event);
}
}
private synchronized void fireCurrentPlaylistShuffleEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().currentPlaylistShuffleEvent(event);
}
}
private synchronized void fireCurrentPlaylistRepeatEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().currentPlaylistRepeatEvent(event);
}
}
private synchronized void fireVolumeChangeEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().volumeChangeEvent(event);
}
}
private synchronized void fireMuteChangeEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().muteChangeEvent(event);
}
}
private synchronized void firePowerChangeEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().powerChangeEvent(event);
}
}
private synchronized void fireModeChangeEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().modeChangeEvent(event);
}
}
private synchronized void fireTitleChangeEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().titleChangeEvent(event);
}
}
private synchronized void fireArtistChangeEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().artistChangeEvent(event);
}
}
private synchronized void fireAlbumChangeEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().albumChangeEvent(event);
}
}
private synchronized void fireCoverArtChangeEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().coverArtChangeEvent(event);
}
}
private synchronized void fireGenreChangeEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().genreChangeEvent(event);
}
}
private synchronized void fireYearChangeEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().yearChangeEvent(event);
}
}
private synchronized void fireRemoteTitleChangeEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().remoteTitleChangeEvent(event);
}
}
private synchronized void fireIrCodeChangeEvent() {
PlayerEvent event = new PlayerEvent(this);
Iterator<SqueezePlayerEventListener> itr = squeezeServer.getPlayerEventListeners().iterator();
while (itr.hasNext()) {
itr.next().irCodeChangeEvent(event);
}
}
}