|
Packit |
5e46da |
/*
|
|
Packit |
5e46da |
* This file is part of libbluray
|
|
Packit |
5e46da |
* Copyright (C) 2013 VideoLAN
|
|
Packit |
5e46da |
*
|
|
Packit |
5e46da |
* This library is free software; you can redistribute it and/or
|
|
Packit |
5e46da |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
5e46da |
* License as published by the Free Software Foundation; either
|
|
Packit |
5e46da |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
5e46da |
*
|
|
Packit |
5e46da |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
5e46da |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
5e46da |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
5e46da |
* Lesser General Public License for more details.
|
|
Packit |
5e46da |
*
|
|
Packit |
5e46da |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
5e46da |
* License along with this library. If not, see
|
|
Packit |
5e46da |
* <http://www.gnu.org/licenses/>.
|
|
Packit |
5e46da |
*/
|
|
Packit |
5e46da |
package org.videolan;
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
import java.util.EventObject;
|
|
Packit |
5e46da |
import java.util.Iterator;
|
|
Packit |
5e46da |
import java.util.LinkedList;
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
import javax.media.ControllerEvent;
|
|
Packit |
5e46da |
import javax.media.ControllerListener;
|
|
Packit |
5e46da |
import javax.media.GainChangeEvent;
|
|
Packit |
5e46da |
import javax.media.GainChangeListener;
|
|
Packit |
5e46da |
import javax.tv.media.MediaSelectEvent;
|
|
Packit |
5e46da |
import javax.tv.media.MediaSelectListener;
|
|
Packit |
5e46da |
import javax.tv.service.selection.ServiceContextEvent;
|
|
Packit |
5e46da |
import javax.tv.service.selection.ServiceContextListener;
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
import org.bluray.bdplus.StatusListener;
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
import org.bluray.media.AngleChangeEvent;
|
|
Packit |
5e46da |
import org.bluray.media.AngleChangeListener;
|
|
Packit |
5e46da |
import org.bluray.media.PanningChangeListener;
|
|
Packit |
5e46da |
import org.bluray.media.PanningChangeEvent;
|
|
Packit |
5e46da |
import org.bluray.media.PiPStatusEvent;
|
|
Packit |
5e46da |
import org.bluray.media.PiPStatusListener;
|
|
Packit |
5e46da |
import org.bluray.media.PlaybackListener;
|
|
Packit |
5e46da |
import org.bluray.media.PlaybackMarkEvent;
|
|
Packit |
5e46da |
import org.bluray.media.PlaybackPlayItemEvent;
|
|
Packit |
5e46da |
import org.bluray.media.UOMaskTableListener;
|
|
Packit |
5e46da |
import org.bluray.media.UOMaskTableChangedEvent;
|
|
Packit |
5e46da |
import org.bluray.media.UOMaskedEvent;
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
import org.davic.resources.ResourceStatusEvent;
|
|
Packit |
5e46da |
import org.davic.resources.ResourceStatusListener;
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
import org.dvb.application.AppsDatabaseEvent;
|
|
Packit |
5e46da |
import org.dvb.application.AppsDatabaseEventListener;
|
|
Packit |
5e46da |
import org.dvb.media.SubtitleAvailableEvent;
|
|
Packit |
5e46da |
import org.dvb.media.SubtitleListener;
|
|
Packit |
5e46da |
import org.dvb.media.SubtitleNotAvailableEvent;
|
|
Packit |
5e46da |
import org.dvb.media.SubtitleNotSelectedEvent;
|
|
Packit |
5e46da |
import org.dvb.media.SubtitleSelectedEvent;
|
|
Packit |
5e46da |
import org.dvb.media.VideoFormatListener;
|
|
Packit |
5e46da |
import org.dvb.media.VideoFormatEvent;
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
public class BDJListeners {
|
|
Packit |
5e46da |
private LinkedList listeners = new LinkedList();
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
public void add(Object listener) {
|
|
Packit |
5e46da |
if (listener != null) {
|
|
Packit |
5e46da |
BDJXletContext ctx = BDJXletContext.getCurrentContext();
|
|
Packit |
5e46da |
if (ctx == null) {
|
|
Packit |
5e46da |
logger.error("Listener added from wrong thread: " + Logger.dumpStack());
|
|
Packit |
5e46da |
return;
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
synchronized (listeners) {
|
|
Packit |
5e46da |
remove(listener);
|
|
Packit |
5e46da |
listeners.add(new BDJListener(ctx, listener));
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
public void remove(Object listener) {
|
|
Packit |
5e46da |
synchronized (listeners) {
|
|
Packit |
5e46da |
for (Iterator it = listeners.iterator(); it.hasNext(); ) {
|
|
Packit |
5e46da |
BDJListener item = (BDJListener)it.next();
|
|
Packit |
5e46da |
if (item.listener == listener)
|
|
Packit |
5e46da |
it.remove();
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
public void clear() {
|
|
Packit |
5e46da |
if (null != BDJXletContext.getCurrentContext()) {
|
|
Packit |
5e46da |
logger.error("clear() from wrong thread: " + Logger.dumpStack());
|
|
Packit |
5e46da |
return;
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
synchronized (listeners) {
|
|
Packit |
5e46da |
listeners.clear();
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
public void putCallback(Object event) {
|
|
Packit |
5e46da |
boolean mediaQueue = true;
|
|
Packit |
5e46da |
/*
|
|
Packit |
5e46da |
if (event instanceof PlaybackMarkEvent) {
|
|
Packit |
5e46da |
} else if (event instanceof PlaybackPlayItemEvent) {
|
|
Packit |
5e46da |
} else if (event instanceof UOMaskTableChangedEvent) {
|
|
Packit |
5e46da |
} else if (event instanceof UOMaskedEvent) {
|
|
Packit |
5e46da |
} else if (event instanceof PiPStatusEvent) {
|
|
Packit |
5e46da |
} else if (event instanceof PanningChangeEvent) {
|
|
Packit |
5e46da |
} else if (event instanceof AngleChangeEvent) {
|
|
Packit |
5e46da |
} else if (event instanceof MediaSelectEvent) {
|
|
Packit |
5e46da |
} else if (event instanceof GainChangeEvent) {
|
|
Packit |
5e46da |
} else if (event instanceof ControllerEvent) {
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
*/
|
|
Packit |
5e46da |
if (event instanceof ServiceContextEvent) {
|
|
Packit |
5e46da |
mediaQueue = false;
|
|
Packit |
5e46da |
} else if (event instanceof ResourceStatusEvent) {
|
|
Packit |
5e46da |
mediaQueue = false;
|
|
Packit |
5e46da |
} else if (event instanceof AppsDatabaseEvent) {
|
|
Packit |
5e46da |
mediaQueue = false;
|
|
Packit |
5e46da |
} else if (event instanceof PSR102Status) {
|
|
Packit |
5e46da |
mediaQueue = false;
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
putCallback(event, mediaQueue);
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
public void putCallback(Object event, boolean mediaQueue) {
|
|
Packit |
5e46da |
synchronized (listeners) {
|
|
Packit |
5e46da |
for (Iterator it = listeners.iterator(); it.hasNext(); ) {
|
|
Packit |
5e46da |
BDJListener item = (BDJListener)it.next();
|
|
Packit |
5e46da |
if (item.ctx == null || item.ctx.isReleased()) {
|
|
Packit |
5e46da |
logger.info("Listener terminated: " + item.ctx);
|
|
Packit |
5e46da |
it.remove();
|
|
Packit |
5e46da |
} else {
|
|
Packit |
5e46da |
if (mediaQueue) {
|
|
Packit |
5e46da |
item.ctx.putMediaCallback(new Callback(event, item.listener));
|
|
Packit |
5e46da |
} else {
|
|
Packit |
5e46da |
item.ctx.putCallback(new Callback(event, item.listener));
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
private static class PSR102Status {
|
|
Packit |
5e46da |
public int value;
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
private PSR102Status(int value) {
|
|
Packit |
5e46da |
this.value = value;
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
public void putPSR102Callback(int value) {
|
|
Packit |
5e46da |
putCallback(new PSR102Status(value));
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
private static class BDJListener {
|
|
Packit |
5e46da |
public BDJXletContext ctx;
|
|
Packit |
5e46da |
public Object listener;
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
BDJListener(BDJXletContext ctx, Object listener) {
|
|
Packit |
5e46da |
this.ctx = ctx;
|
|
Packit |
5e46da |
this.listener = listener;
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
private static class Callback extends BDJAction {
|
|
Packit |
5e46da |
private Callback(Object event, Object listener) {
|
|
Packit |
5e46da |
this.event = event;
|
|
Packit |
5e46da |
this.listener = listener;
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
public String toString() {
|
|
Packit |
5e46da |
return this.getClass().getName() + "[event=" + event + ", listener=" + listener;
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
protected void doAction() {
|
|
Packit |
5e46da |
if (event instanceof PlaybackMarkEvent) {
|
|
Packit |
5e46da |
((PlaybackListener)listener).markReached((PlaybackMarkEvent)event);
|
|
Packit |
5e46da |
} else if (event instanceof PlaybackPlayItemEvent) {
|
|
Packit |
5e46da |
((PlaybackListener)listener).playItemReached((PlaybackPlayItemEvent)event);
|
|
Packit |
5e46da |
} else if (event instanceof ServiceContextEvent) {
|
|
Packit |
5e46da |
((ServiceContextListener)listener).receiveServiceContextEvent((ServiceContextEvent)event);
|
|
Packit |
5e46da |
} else if (event instanceof UOMaskTableChangedEvent) {
|
|
Packit |
5e46da |
((UOMaskTableListener)listener).receiveUOMaskTableChangedEvent((UOMaskTableChangedEvent)event);
|
|
Packit |
5e46da |
} else if (event instanceof UOMaskedEvent) {
|
|
Packit |
5e46da |
((UOMaskTableListener)listener).receiveUOMaskedEvent((UOMaskedEvent)event);
|
|
Packit |
5e46da |
} else if (event instanceof PiPStatusEvent) {
|
|
Packit |
5e46da |
((PiPStatusListener)listener).piPStatusChange((PiPStatusEvent)event);
|
|
Packit |
5e46da |
} else if (event instanceof PanningChangeEvent) {
|
|
Packit |
5e46da |
((PanningChangeListener)listener).panningChange((PanningChangeEvent)event);
|
|
Packit |
5e46da |
} else if (event instanceof AngleChangeEvent) {
|
|
Packit |
5e46da |
((AngleChangeListener)listener).angleChange((AngleChangeEvent)event);
|
|
Packit |
5e46da |
} else if (event instanceof MediaSelectEvent) {
|
|
Packit |
5e46da |
((MediaSelectListener)listener).selectionComplete((MediaSelectEvent)event);
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
} else if (event instanceof GainChangeEvent) {
|
|
Packit |
5e46da |
((GainChangeListener)listener).gainChange((GainChangeEvent)event);
|
|
Packit |
5e46da |
} else if (event instanceof ControllerEvent) {
|
|
Packit |
5e46da |
((ControllerListener)listener).controllerUpdate((ControllerEvent)event);
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
} else if (event instanceof ResourceStatusEvent) {
|
|
Packit |
5e46da |
((ResourceStatusListener)listener).statusChanged((ResourceStatusEvent)event);
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
} else if (event instanceof AppsDatabaseEvent) {
|
|
Packit |
5e46da |
AppsDatabaseEvent dbevent = (AppsDatabaseEvent)event;
|
|
Packit |
5e46da |
AppsDatabaseEventListener dblistener = (AppsDatabaseEventListener)listener;
|
|
Packit |
5e46da |
switch (dbevent.getEventId()) {
|
|
Packit |
5e46da |
case AppsDatabaseEvent.APP_ADDED:
|
|
Packit |
5e46da |
dblistener.entryAdded(dbevent);
|
|
Packit |
5e46da |
break;
|
|
Packit |
5e46da |
case AppsDatabaseEvent.APP_CHANGED:
|
|
Packit |
5e46da |
dblistener.entryChanged(dbevent);
|
|
Packit |
5e46da |
break;
|
|
Packit |
5e46da |
case AppsDatabaseEvent.APP_DELETED:
|
|
Packit |
5e46da |
dblistener.entryRemoved(dbevent);
|
|
Packit |
5e46da |
break;
|
|
Packit |
5e46da |
case AppsDatabaseEvent.NEW_DATABASE:
|
|
Packit |
5e46da |
dblistener.newDatabase(dbevent);
|
|
Packit |
5e46da |
break;
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
} else if (event instanceof SubtitleAvailableEvent || event instanceof SubtitleNotAvailableEvent ||
|
|
Packit |
5e46da |
event instanceof SubtitleNotSelectedEvent || event instanceof SubtitleSelectedEvent) {
|
|
Packit |
5e46da |
((SubtitleListener)listener).subtitleStatusChanged((EventObject)event);
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
} else if (event instanceof VideoFormatEvent) {
|
|
Packit |
5e46da |
((VideoFormatListener)listener).receiveVideoFormatEvent((VideoFormatEvent)event);
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
} else if (event instanceof PSR102Status) {
|
|
Packit |
5e46da |
((StatusListener)listener).receive(((PSR102Status)event).value);
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
} else {
|
|
Packit |
5e46da |
System.err.println("Unknown event type: " + event.getClass().getName());
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
private Object listener;
|
|
Packit |
5e46da |
private Object event;
|
|
Packit |
5e46da |
}
|
|
Packit |
5e46da |
|
|
Packit |
5e46da |
private static final Logger logger = Logger.getLogger(BDJListeners.class.getName());
|
|
Packit |
5e46da |
}
|