/*
* @(#)DelegateDataSource.java 1.5 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package com.sun.media.protocol;
import javax.media.*;
import javax.media.protocol.*;
import com.sun.media.Log;
import java.io.IOException;
/**
* This special DataSource is used to prebuild a streaming player
* before the actual streaming DataSource is not available e.g. RTP.
*/
public class DelegateDataSource extends PushBufferDataSource implements Streamable {
protected String contentType = ContentDescriptor.RAW;
protected PushBufferDataSource master;
protected DelegateStream streams[];
protected boolean started = false;
protected boolean connected = false;
public DelegateDataSource(Format format[]) {
streams = new DelegateStream[format.length];
for (int i = 0; i < format.length; i++) {
streams[i] = new DelegateStream(format[i]);
}
try {
connect();
} catch (IOException e) {}
}
public void setMaster(PushBufferDataSource ds) throws IOException {
master = ds;
PushBufferStream mstrms[] = ds.getStreams();
for (int i = 0; i < mstrms.length; i++) {
for (int j = 0; j < streams.length; j++) {
if (streams[j].getFormat().matches(mstrms[i].getFormat()))
streams[j].setMaster(mstrms[i]);
}
}
for (int i = 0; i < mstrms.length; i++) {
if (streams[i].getMaster() == null) {
Log.error("DelegateDataSource: cannot not find a matching track from the master with this format: " + streams[i].getFormat());
}
}
if (connected)
master.connect();
if (started)
master.start();
}
public javax.media.protocol.DataSource getMaster() {
return master;
}
public PushBufferStream[] getStreams() {
return streams;
}
public MediaLocator getLocator() {
if (master != null)
return master.getLocator();
return null;
}
public String getContentType() {
if (!connected){
System.err.println("Error: DataSource not connected");
return null;
}
return contentType;
}
public void connect() throws IOException {
if (connected)
return;
if (master != null)
master.connect();
connected = true;
}
public void disconnect() {
try{
if (started)
stop();
}catch (IOException e){}
if (master != null)
master.disconnect();
connected = false;
}
public void start() throws IOException {
// we need to throw error if connect() has not been called
if (!connected)
throw new java.lang.Error("DataSource must be connected before it can be started");
if (started)
return;
if (master != null)
master.start();
started = true;
}
public void stop() throws IOException {
if ((!connected) || (!started))
return;
if (master != null)
master.stop();
started = false;
}
public Object [] getControls() {
if (master != null)
return master.getControls();
return new Object[0];
}
public Object getControl(String controlType) {
if (master != null)
return master.getControl(controlType);
return null;
}
public Time getDuration() {
if (master != null)
return master.getDuration();
return Duration.DURATION_UNKNOWN;
}
public boolean isPrefetchable() {
return false;
}
/////////////////////
//
// INNER CLASSES
/////////////////////
class DelegateStream implements PushBufferStream, BufferTransferHandler {
Format format;
PushBufferStream master;
BufferTransferHandler th;
public DelegateStream(Format format) {
this.format = format;
}
public void setMaster(PushBufferStream master) {
this.master = master;
master.setTransferHandler(this);
}
public PushBufferStream getMaster() {
return master;
}
public Format getFormat() {
if (master != null)
return master.getFormat();
return format;
}
public ContentDescriptor getContentDescriptor() {
if (master != null)
return master.getContentDescriptor();
return new ContentDescriptor(ContentDescriptor.RAW);
}
public long getContentLength() {
if (master != null)
return master.getContentLength();
return LENGTH_UNKNOWN;
}
public boolean endOfStream() {
if (master != null)
return master.endOfStream();
return false;
}
public void read(Buffer buffer) throws IOException {
if (master != null)
master.read(buffer);
throw new IOException("No data available");
}
public void setTransferHandler(BufferTransferHandler transferHandler) {
th = transferHandler;
}
public void transferData(PushBufferStream stream) {
if (th != null)
th.transferData(stream);
}
public Object [] getControls() {
if (master != null)
return master.getControls();
return new Object[0];
}
public Object getControl(String controlType) {
if (master != null)
return master.getControl(controlType);
return null;
}
}
}
|