/* * @(#)BasicOutputConnector.java 1.9 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package com.sun.media; import javax.media.Format; import javax.media.Buffer; /** * implementation of the OutputConnector interface */ public class BasicOutputConnector extends BasicConnector implements OutputConnector{ /** the connected input connector **/ protected InputConnector inputConnector=null; private boolean reset = false; /** * Connects an InputConnector to this OutputConnector. */ public Format connectTo(InputConnector inputConnector, Format useThisFormat) { Format format=canConnectTo(inputConnector,useThisFormat); // if (format==null) // return null; this.inputConnector=inputConnector; inputConnector.setOutputConnector(this); int bufferSize=Math.max(getSize(),inputConnector.getSize()); circularBuffer = new CircularBuffer(bufferSize); inputConnector.setCircularBuffer(circularBuffer); return null; } /** * check if a connection to the specified InputConnector would succeed. */ public Format canConnectTo(InputConnector inputConnector, Format useThisFormat) { if ( getProtocol() != inputConnector.getProtocol() ) throw new RuntimeException("protocols do not match:: "); return null; } /** * Return the InputConnectore this OutputConnector is connected * to. If this Connector is unconnected return null. */ public InputConnector getInputConnector(){ return inputConnector; } public void reset() { synchronized (circularBuffer) { reset = true; super.reset(); if (inputConnector != null) inputConnector.reset(); circularBuffer.notifyAll(); } } /** * checks if there are empty Buffer objects in the Connector's queue. */ public boolean isEmptyBufferAvailable(){ return circularBuffer.canWrite(); } /** * Get an empty buffer object. **/ public Buffer getEmptyBuffer(){ // System.out.println(getClass().getName()+":: getEmptyBuffer"); switch ( protocol ) { case ProtocolPush: if (!isEmptyBufferAvailable () && reset) return null; reset = false; return circularBuffer.getEmptyBuffer(); case ProtocolSafe: synchronized (circularBuffer) { reset = false; while (!reset && !isEmptyBufferAvailable()) { try { circularBuffer.wait(); } catch (Exception e) {} } if (reset) return null; Buffer buffer = circularBuffer.getEmptyBuffer(); circularBuffer.notifyAll(); return buffer; } default: throw new RuntimeException(); } } /** * put media chunk in the queue * */ public void writeReport(){ // System.out.println(getClass().getName()+":: writeReport "); switch ( protocol ) { case ProtocolPush: synchronized (circularBuffer) { if (reset /* && pendingWriteReport */) return; circularBuffer.writeReport(); } getInputConnector().getModule().connectorPushed( getInputConnector() ); return; case ProtocolSafe: synchronized (circularBuffer ) { if (reset) return; circularBuffer.writeReport(); circularBuffer.notifyAll(); return; } default: throw new RuntimeException(); } } }