/**
* {@inheritDoc}
*/
public void onChange(final StreamState state, final Object... changed) {
Notifier notifier = null;
IStreamAwareScopeHandler handler = getStreamAwareHandler();
switch (state) {
case SEEK:
//notifies subscribers on seek
if (handler != null) {
notifier = new Notifier(this, handler) {
public void execute(ISchedulingService service) {
//make sure those notified have the correct connection
Red5.setConnectionLocal(conn);
//get item being played
IPlayItem item = (IPlayItem) changed[0];
//seek position
int position = (Integer) changed[1];
try {
handler.streamPlayItemSeek(stream, item, position);
} catch (Throwable t) {
log.error("error notify streamPlayItemSeek", t);
}
// clear thread local reference
Red5.setConnectionLocal(null);
}
};
}
break;
case PAUSED:
//set the paused state
this.setState(StreamState.PAUSED);
//notifies subscribers on pause
if (handler != null) {
notifier = new Notifier(this, handler) {
public void execute(ISchedulingService service) {
//make sure those notified have the correct connection
Red5.setConnectionLocal(conn);
//get item being played
IPlayItem item = (IPlayItem) changed[0];
//playback position
int position = (Integer) changed[1];
try {
handler.streamPlayItemPause(stream, item, position);
} catch (Throwable t) {
log.error("error notify streamPlayItemPause", t);
}
// clear thread local reference
Red5.setConnectionLocal(null);
}
};
}
break;
case RESUMED:
//resume playing
this.setState(StreamState.PLAYING);
//notifies subscribers on resume
if (handler != null) {
notifier = new Notifier(this, handler) {
public void execute(ISchedulingService service) {
//make sure those notified have the correct connection
Red5.setConnectionLocal(conn);
//get item being played
IPlayItem item = (IPlayItem) changed[0];
//playback position
int position = (Integer) changed[1];
try {
handler.streamPlayItemResume(stream, item, position);
} catch (Throwable t) {
log.error("error notify streamPlayItemResume", t);
}
// clear thread local reference
Red5.setConnectionLocal(null);
}
};
}
break;
case PLAYING:
//notifies subscribers on play
if (handler != null) {
notifier = new Notifier(this, handler) {
public void execute(ISchedulingService service) {
//make sure those notified have the correct connection
Red5.setConnectionLocal(conn);
//get item being played
IPlayItem item = (IPlayItem) changed[0];
//is it a live broadcast
boolean isLive = (Boolean) changed[1];
try {
handler.streamPlayItemPlay(stream, item, isLive);
} catch (Throwable t) {
log.error("error notify streamPlayItemPlay", t);
}
// clear thread local reference
Red5.setConnectionLocal(null);
}
};
}
break;
case CLOSED:
//notifies subscribers on close
if (handler != null) {
notifier = new Notifier(this, handler) {
public void execute(ISchedulingService service) {
//make sure those notified have the correct connection
Red5.setConnectionLocal(conn);
try {
handler.streamSubscriberClose(stream);
} catch (Throwable t) {
log.error("error notify streamSubscriberClose", t);
}
// clear thread local reference
Red5.setConnectionLocal(null);
}
};
}
break;
case STARTED:
//notifies subscribers on start
if (handler != null) {
notifier = new Notifier(this, handler) {
public void execute(ISchedulingService service) {
//make sure those notified have the correct connection
Red5.setConnectionLocal(conn);
try {
handler.streamSubscriberStart(stream);
} catch (Throwable t) {
log.error("error notify streamSubscriberStart", t);
}
// clear thread local reference
Red5.setConnectionLocal(null);
}
};
}
break;
case STOPPED:
//set the stopped state
this.setState(StreamState.STOPPED);
//notifies subscribers on stop
if (handler != null) {
notifier = new Notifier(this, handler) {
public void execute(ISchedulingService service) {
//make sure those notified have the correct connection
Red5.setConnectionLocal(conn);
//get the item that was stopped
IPlayItem item = (IPlayItem) changed[0];
try {
handler.streamPlayItemStop(stream, item);
} catch (Throwable t) {
log.error("error notify streamPlaylistItemStop", t);
}
// clear thread local reference
Red5.setConnectionLocal(null);