/*
* @(#)MergingDataSource.java 1.3 99/08/11
*
* 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.ibm.media.protocol;
import java.io.*;
import java.util.Vector;
import java.lang.*;
import java.lang.reflect.*;
import javax.media.*;
import javax.media.protocol.*;
class MergingDataSource extends DataSource {
DataSource[] sources;
SourceStream[] streams = null;
Object [] controls = null;
/**
* Constructor
*/
MergingDataSource(DataSource[] sources) {
this.sources = sources;
}
/**
* Returns the content-type of the merged streams. If all streams are RAW,
* the returned content-type is RAW. Otherwise, the return content-type is
* MIXED.
*/
public String getContentType() {
if (sources.length == 1)
return sources[0].getContentType();
boolean isRaw = true;
for (int index = 0; index < sources.length; index++) {
if (!sources[index].getContentType().equals(ContentDescriptor.RAW)) {
isRaw = false;
break;
}
}
if (isRaw)
return ContentDescriptor.RAW;
else if (sources.length == 1)
return sources[0].getContentType();
else
return ContentDescriptor.MIXED;
}
public void connect() throws IOException {
for (int i = 0; i < sources.length; i++)
sources[i].connect();
}
public void disconnect() {
for (int i = 0; i < sources.length; i++)
sources[i].disconnect();
}
public void start() throws IOException {
for (int i = 0; i < sources.length; i++)
sources[i].start();
}
public void stop() throws IOException {
for (int i = 0; i < sources.length; i++)
sources[i].stop();
}
/**
* Obtain the collection of objects that
* control the object that implements this interface.
* <p>
*
* If no controls are supported, a zero length
* array is returned.
*
* @return the collection of object controls
*/
public Object[] getControls() {
if (controls == null) {
Vector vcontrols = new Vector(1);
for (int i = 0; i < sources.length; i++) {
Object [] cs = (Object[]) sources[i].getControls();
if (cs.length > 0) {
for (int j = 0; j < cs.length; j++) {
vcontrols.addElement(cs[j]);
}
}
}
controls = new Object[vcontrols.size()];
for (int c = 0; c < vcontrols.size(); c++)
controls[c] = vcontrols.elementAt(c);
}
return controls;
}
/**
* Obtain the object that implements the specified
* <code>Class</code> or <code>Interface</code>
* The full class or interface name must be used.
* <p>
*
* If the control is not supported then <code>null</code>
* is returned.
*
* @return the object that implements the control,
* or <code>null</code>.
*/
public Object getControl(String controlType) {
try {
Class cls = Class.forName(controlType);
Object cs[] = getControls();
for (int i = 0; i < cs.length; i++) {
if (cls.isInstance(cs[i]))
return cs[i];
}
return null;
} catch (Exception e) { // no such controlType or such control
return null;
}
}
/**
* Get the duration of the media represented
* by this object.
* The value returned is the media's duration
* when played at the default rate.
* If the duration can't be determined (for example, the media object is presenting live
* video) <CODE>getDuration</CODE> returns <CODE>DURATION_UNKNOWN</CODE>.
*
* @return A <CODE>Time</CODE> object representing the duration or DURATION_UNKNOWN.
*/
public Time getDuration() {
Time longest = new Time(0);
for (int i = 0; i < sources.length; i++) {
Time sourceDuration = sources[i].getDuration();
if (sourceDuration.getSeconds() > longest.getSeconds())
longest = sourceDuration;
}
return longest;
}
}
|