Search in sources :

Example 1 with TrackControl

use of javax.media.control.TrackControl in project Smack by igniterealtime.

the class AudioChannel method createProcessor.

private String createProcessor() {
    if (locator == null)
        return "Locator is null";
    DataSource ds;
    try {
        ds = javax.media.Manager.createDataSource(locator);
    } catch (Exception e) {
        // Try JavaSound Locator as a last resort
        try {
            ds = javax.media.Manager.createDataSource(new MediaLocator("javasound://"));
        } catch (Exception ee) {
            return "Couldn't create DataSource";
        }
    }
    // Try to create a processor to handle the input jmf locator
    try {
        processor = javax.media.Manager.createProcessor(ds);
    } catch (NoProcessorException npe) {
        LOGGER.log(Level.WARNING, "exception", npe);
        return "Couldn't create processor";
    } catch (IOException ioe) {
        LOGGER.log(Level.WARNING, "exception", ioe);
        return "IOException creating processor";
    }
    // Wait for it to configure
    boolean result = waitForState(processor, Processor.Configured);
    if (!result) {
        return "Couldn't configure processor";
    }
    // Get the tracks from the processor
    TrackControl[] tracks = processor.getTrackControls();
    // Do we have at least one track?
    if (tracks == null || tracks.length < 1) {
        return "Couldn't find tracks in processor";
    }
    // Set the output content descriptor to RAW_RTP
    // This will limit the supported formats reported from
    // Track.getSupportedFormats to only valid RTP formats.
    ContentDescriptor cd = new ContentDescriptor(ContentDescriptor.RAW_RTP);
    processor.setContentDescriptor(cd);
    Format[] supported;
    Format chosen = null;
    boolean atLeastOneTrack = false;
    // Program the tracks.
    for (int i = 0; i < tracks.length; i++) {
        if (tracks[i].isEnabled()) {
            supported = tracks[i].getSupportedFormats();
            if (supported.length > 0) {
                for (Format format : supported) {
                    if (format instanceof AudioFormat) {
                        if (this.format.matches(format))
                            chosen = format;
                    }
                }
                if (chosen != null) {
                    tracks[i].setFormat(chosen);
                    LOGGER.severe("Track " + i + " is set to transmit as: " + chosen);
                    if (tracks[i].getFormat() instanceof AudioFormat) {
                        int packetRate = 20;
                        PacketSizeControl pktCtrl = (PacketSizeControl) processor.getControl(PacketSizeControl.class.getName());
                        if (pktCtrl != null) {
                            try {
                                pktCtrl.setPacketSize(getPacketSize(tracks[i].getFormat(), packetRate));
                            } catch (IllegalArgumentException e) {
                                pktCtrl.setPacketSize(80);
                            // Do nothing
                            }
                        }
                        if (tracks[i].getFormat().getEncoding().equals(AudioFormat.ULAW_RTP)) {
                            Codec[] codec = new Codec[3];
                            codec[0] = new com.ibm.media.codec.audio.rc.RCModule();
                            codec[1] = new com.ibm.media.codec.audio.ulaw.JavaEncoder();
                            codec[2] = new com.sun.media.codec.audio.ulaw.Packetizer();
                            ((com.sun.media.codec.audio.ulaw.Packetizer) codec[2]).setPacketSize(160);
                            try {
                                tracks[i].setCodecChain(codec);
                            } catch (UnsupportedPlugInException e) {
                                LOGGER.log(Level.WARNING, "exception", e);
                            }
                        }
                    }
                    atLeastOneTrack = true;
                } else
                    tracks[i].setEnabled(false);
            } else
                tracks[i].setEnabled(false);
        }
    }
    if (!atLeastOneTrack)
        return "Couldn't set any of the tracks to a valid RTP format";
    result = waitForState(processor, Controller.Realized);
    if (!result)
        return "Couldn't realize processor";
    // Get the output data source of the processor
    dataOutput = processor.getDataOutput();
    return null;
}
Also used : TrackControl(javax.media.control.TrackControl) NoProcessorException(javax.media.NoProcessorException) Codec(javax.media.Codec) MediaLocator(javax.media.MediaLocator) Format(javax.media.Format) AudioFormat(javax.media.format.AudioFormat) PacketSizeControl(javax.media.control.PacketSizeControl) AudioFormat(javax.media.format.AudioFormat) IOException(java.io.IOException) NoProcessorException(javax.media.NoProcessorException) IOException(java.io.IOException) UnknownHostException(java.net.UnknownHostException) InvalidSessionAddressException(javax.media.rtp.InvalidSessionAddressException) UnsupportedPlugInException(javax.media.UnsupportedPlugInException) PushBufferDataSource(javax.media.protocol.PushBufferDataSource) DataSource(javax.media.protocol.DataSource) ContentDescriptor(javax.media.protocol.ContentDescriptor) UnsupportedPlugInException(javax.media.UnsupportedPlugInException)

Aggregations

IOException (java.io.IOException)1 UnknownHostException (java.net.UnknownHostException)1 Codec (javax.media.Codec)1 Format (javax.media.Format)1 MediaLocator (javax.media.MediaLocator)1 NoProcessorException (javax.media.NoProcessorException)1 UnsupportedPlugInException (javax.media.UnsupportedPlugInException)1 PacketSizeControl (javax.media.control.PacketSizeControl)1 TrackControl (javax.media.control.TrackControl)1 AudioFormat (javax.media.format.AudioFormat)1 ContentDescriptor (javax.media.protocol.ContentDescriptor)1 DataSource (javax.media.protocol.DataSource)1 PushBufferDataSource (javax.media.protocol.PushBufferDataSource)1 InvalidSessionAddressException (javax.media.rtp.InvalidSessionAddressException)1