package org.jboss.media.engine.audio;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import javax.media.Codec;
import javax.media.DataSink;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoDataSinkException;
import javax.media.NoProcessorException;
import javax.media.NotConfiguredError;
import javax.media.Processor;
import javax.media.UnsupportedPlugInException;
import javax.media.control.FormatControl;
import javax.media.control.TrackControl;
import javax.media.format.AudioFormat;
import javax.media.protocol.DataSource;
import jmapps.util.StateHelper;
import org.jboss.media.engine.MediaPluginGraph;
import org.jboss.media.engine.MediaPublisher;
import org.jboss.media.engine.MediaPublisherMBean;
public class RtpAudioMediaPublisher
extends MediaPublisher
implements MediaPublisherMBean, RtpAudioMediaPublisherMBean
{
private int m_bitRate;
private int m_resolution;
private String m_encoding;
private int m_channels;
protected Processor m_processor;
protected DataSink m_rtpTransmitter;
protected AudioGenericPluginSupport m_plugin;
public RtpAudioMediaPublisher()
{
m_plugin = new AudioGenericPluginSupport();
}
public int getBitRate()
{
return m_bitRate;
}
public String getEncoding()
{
return m_encoding;
}
public void setBitRate(int bitRate)
{
m_bitRate = bitRate;
}
public void setEncoding(String encoding)
{
m_encoding = encoding;
}
public int getResolution()
{
return m_resolution;
}
public void setResolution(int resolution)
{
m_resolution = resolution;
}
public int getChannels()
{
return m_channels;
}
public void setChannels(int channels)
{
m_channels = channels;
}
public void publish()
throws
NoProcessorException,
MalformedURLException,
IOException,
NoDataSinkException
{
File file = new File(getFileName());
m_processor = Manager.createProcessor(new MediaLocator(file.toURL()));
StateHelper stateHelper;
stateHelper = new StateHelper(m_processor);
if (!stateHelper.configure(10000))
{
log.error("Failed to configure the processor.");
}
configurePluginGraph();
boolean encodingOk = checkForEncoding(m_encoding);
if (encodingOk)
{
if (!stateHelper.realize(10000))
{
log.error("Failed to realize the processor.");
}
DataSource ds = null;
ds = m_processor.getDataOutput();
String url = "rtp://" + getHost() + ":" + getPort() + getContext();
MediaLocator m = new MediaLocator(url);
m_rtpTransmitter = Manager.createDataSink(ds, m);
log.debug(m_rtpTransmitter);
m_rtpTransmitter.open();
m_rtpTransmitter.start();
ds.start();
m_processor.start();
}
log.info("Transmission of " + getFileName() + " " + "started");
}
public void stop()
{
if (m_processor != null)
{
m_processor.stop();
m_processor.close();
m_processor = null;
m_rtpTransmitter.close();
m_rtpTransmitter = null;
}
log.info("Transmission of " + getFileName() + " " + "stopped");
}
private boolean checkForEncoding(String encoding)
{
TrackControl track[] = m_processor.getTrackControls();
boolean encodingOk = false;
for (int i = 0; i < track.length; i++)
{
if (!encodingOk && track[i] instanceof FormatControl)
{
if (((FormatControl) track[i])
.setFormat(
new AudioFormat(
getEncoding(),
getResolution(),
getBitRate(),
getChannels()))
== null)
{
track[i].setEnabled(false);
}
else
{
encodingOk = true;
}
}
else
{
track[i].setEnabled(false);
}
}
return encodingOk;
}
public void addPluginGraph(MediaPluginGraph pg)
{
m_plugin.setPluginGraph(pg);
}
private void configurePluginGraph()
{
if (m_plugin == null)
return;
TrackControl tc[] = m_processor.getTrackControls();
if (tc == null)
{
log.error("Failed to obtain track controls from the processor.");
}
else
{
TrackControl audioTrack = null;
for (int i = 0; i < tc.length; i++)
{
if (tc[i].getFormat() instanceof AudioFormat)
{
audioTrack = tc[i];
break;
}
}
try
{
audioTrack.setCodecChain(new Codec[] { m_plugin });
}
catch (UnsupportedPlugInException e)
{
log.error("The processor does not support effects.");
}
catch (NotConfiguredError e)
{
log.error("Processor not configured", e);
}
}
}
}