/* * @(#)Handler.java 1.6 02/08/21 * * Copyright 1996-1998 by Sun Microsystems, Inc., * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A. * All rights reserved. * * This software is the confidential and proprietary information * of Sun Microsystems, Inc. ("Confidential Information"). You * shall not disclose such Confidential Information and shall use * it only in accordance with the terms of the license agreement * you entered into with Sun. */ package com.sun.media.content.application.x_jmx; import java.io.*; import java.awt.*; import java.net.*; import java.util.Vector; import javax.media.*; import javax.media.protocol.*; import javax.media.format.AudioFormat; import javax.media.format.VideoFormat; import javax.media.Format; import javax.media.renderer.VisualContainer; import com.sun.media.*; import com.sun.media.util.*; import com.sun.media.ui.*; import com.sun.media.controls.*; /** * MediaPlayer extends BasicPlayer and uses MediaEngine to play media. */ public class Handler extends BasicPlayer { Player players[] = null; Player master = null; boolean realized[] = null; Vector locators = new Vector(); // Media Locators. ControllerListener listener = new PlayerListener(this); boolean playersRealized = false; Object realizedSync = new Object(); private boolean closed = false; private boolean audioEnabled = false; private boolean videoEnabled = false; public Handler() { framePositioning = true; } String sessionError = "Cannot create a Player for: "; protected boolean doRealize() { super.doRealize(); MediaLocator ml = null; try { players = new Player[locators.size()]; realized = new boolean[locators.size()]; for (int i = 0; i < locators.size(); i++) { ml = (MediaLocator)locators.elementAt(i); players[i] = Manager.createPlayer(ml); players[i].addControllerListener(listener); realized[i] = false; players[i].realize(); } } catch (Exception e) { Log.error(sessionError + ml); processError = sessionError + ml; return false; } // dont realize this meta player until our player is realized try{ synchronized (realizedSync) { while (!playersRealized && !isInterrupted() && !closed) realizedSync.wait(); } } catch (Exception e) {} // If realize is being interrupted, return failure from realize. if (closed || isInterrupted()) { resetInterrupt(); processError = "Realize interrupted"; return false; } try { master = players[0]; for (int i = 1; i < players.length; i++) { master.addController(players[i]); } } catch (IncompatibleTimeBaseException e) { processError = "AddController failed"; return false; } manageController(master); return true; } protected void completeRealize() { state = Realized; super.completeRealize(); } protected void doStart() { super.doStart(); } protected void doStop() { super.doStop(); } protected void doDeallocate() { synchronized (realizedSync) { realizedSync.notify(); } } protected void doClose() { closed = true; synchronized (realizedSync) { realizedSync.notify(); } stop(); super.doClose(); } protected TimeBase getMasterTimeBase() { return master.getTimeBase(); } protected boolean audioEnabled() { return audioEnabled; } protected boolean videoEnabled() { return videoEnabled; } private void sendMyEvent(ControllerEvent e) { super.sendEvent(e); } public void setSource(javax.media.protocol.DataSource source) throws IOException, IncompatibleSourceException { super.setSource(source); if (!(source instanceof PullDataSource)) throw new IncompatibleSourceException(); PullSourceStream pss[] = ((PullDataSource)source).getStreams(); if (pss.length != 1) throw new IncompatibleSourceException(); source.start(); int len = (int)pss[0].getContentLength(); if (len == SourceStream.LENGTH_UNKNOWN) throw new IncompatibleSourceException(); byte barray[] = new byte[len]; String content; try { len = pss[0].read(barray, 0, len); content = new String(barray); } catch (Exception e) { throw new IncompatibleSourceException(); } char ch; int start = 0, idx; int size = content.length(); String str; String relPath = null; ch = content.charAt(start); while (start < size) { while (ch == ' ' || ch == '\n') { start++; if (start >= size) break; ch = content.charAt(start); } if (start >= size) break; idx = start; do { idx++; if (idx >= size) break; ch = content.charAt(idx); } while (ch != '\n'); str = content.substring(start, idx); if (str.indexOf(':') == -1) { // Probably didn't specify a protocol or // absolute path here. // We'll assume it's relative path and use // the first part of the media locator to // generate the name. if (relPath == null) { MediaLocator loc = source.getLocator(); if (loc == null) throw new IncompatibleSourceException(); relPath = loc.toString(); int i = relPath.lastIndexOf('/'); if (i < 0) i = relPath.lastIndexOf(File.separator); relPath = relPath.substring(0, i + 1); } str = relPath + str; } locators.addElement(new MediaLocator(str)); start = idx; } if (locators.size() < 1) throw new IncompatibleSourceException(); } private void invalidateComp(){ controlComp = null; controls = null; } private Container container = null; public Component getVisualComponent() { Vector visuals = new Vector(1); for( int i = 0; i < players.length; i++) { Component comp= players[i].getVisualComponent(); if( comp != null) { visuals.addElement( comp); } } if( visuals.size() == 0) { return null; } else if( visuals.size() == 1) { return (Component) visuals.elementAt( 0); } else { return createVisualContainer( visuals); } } protected Component createVisualContainer(Vector visuals) { Boolean hint = (Boolean) Manager.getHint(Manager.LIGHTWEIGHT_RENDERER); if (container == null) { if (hint == null || hint.booleanValue() == false) { container = new HeavyPanel(visuals); } else { container = new LightPanel(visuals); } container.setLayout( new FlowLayout() ); container.setBackground(Color.black); for (int i = 0; i < visuals.size(); i++) { Component c = (Component)visuals.elementAt(i); container.add(c); c.setSize(c.getPreferredSize()); } } return container; } class HeavyPanel extends java.awt.Panel implements VisualContainer { public HeavyPanel(Vector visuals) { } } class LightPanel extends java.awt.Container implements VisualContainer { public LightPanel(Vector visuals) { } } public void updateStats() { for (int i = 0; i < players.length; i++) { if (players[i] != null) ((BasicPlayer)players[i]).updateStats(); } } class PlayerListener implements ControllerListener { Handler handler; public PlayerListener(Handler handler) { this.handler = handler; } public synchronized void controllerUpdate(ControllerEvent ce) { Player p = (Player)ce.getSourceController(); int idx; if (p == null) return; for (idx = 0; idx < players.length; idx++) { if (players[idx] == p) break; } if (idx >= players.length) { // Something's wrong. System.err.println("Unknown player: " + p); return; } if (ce instanceof RealizeCompleteEvent) { realized[idx] = true; // Check to see if all the players are realized. for (int i = 0; i < realized.length; i++) { if (!realized[i]) return; } // The meta player is considered to be realized if all // the component players are all realized. synchronized (realizedSync){ playersRealized = true; realizedSync.notifyAll(); } } if (ce instanceof ControllerErrorEvent) { players[idx].removeControllerListener( this ); Log.error("Meta Handler internal error: " + ce); players[idx] = null; } }// end of controllerUpdate } // end of PlayerListener; }// end of Handler