package org.red5.app.sip; import java.net.DatagramSocket; import java.net.SocketException; import org.red5.app.sip.codecs.Codec; import org.red5.app.sip.codecs.SpeexCodec; import org.red5.app.sip.stream.ListenStream; import org.red5.app.sip.stream.ReceivedRtpPacketProcessor; import org.red5.app.sip.stream.RtpStreamReceiver; import org.red5.app.sip.stream.RtpStreamReceiverListener; import org.red5.app.sip.stream.RtpStreamSender; import org.red5.app.sip.stream.TalkStream; import org.red5.app.sip.trancoders.NellyToPcmTranscoder; import org.red5.app.sip.trancoders.PcmToNellyTranscoder; import org.red5.app.sip.trancoders.SpeexToSpeexTranscoder; import org.red5.app.sip.trancoders.Transcoder; import org.slf4j.Logger; import org.red5.logging.Red5LoggerFactory; import org.red5.server.api.scope.IScope; import org.red5.server.api.stream.IBroadcastStream; public class CallStream implements RtpStreamReceiverListener { private final static Logger log = Red5LoggerFactory.getLogger(CallStream.class, "sip"); private DatagramSocket socket = null; private final RtpStreamReceiver rtpReceiver; private final RtpStreamSender rtpSender; private final TalkStream talkStream; private final ListenStream listenStream; private final ReceivedRtpPacketProcessor packetProcessor; public CallStream(Codec sipCodec, SipConnectInfo connInfo, ScopeProvider scopeProvider) throws Exception { try { socket = new DatagramSocket(connInfo.getLocalPort()); } catch (SocketException e) { log.error("SocketException while initializing DatagramSocket"); throw new Exception("Exception while initializing CallStream"); } listenStream = new ListenStream(scopeProvider.getScope()); Transcoder rtmpToRtpTranscoder, rtpToRtmpTranscoder; if (sipCodec.getCodecId() == SpeexCodec.codecId) { rtmpToRtpTranscoder = new SpeexToSpeexTranscoder(sipCodec); rtpToRtmpTranscoder = new SpeexToSpeexTranscoder(sipCodec, listenStream); } else { rtmpToRtpTranscoder = new NellyToPcmTranscoder(sipCodec); rtpToRtmpTranscoder = new PcmToNellyTranscoder(sipCodec, listenStream); } packetProcessor = new ReceivedRtpPacketProcessor(rtpToRtmpTranscoder); rtpReceiver = new RtpStreamReceiver(packetProcessor, socket, rtpToRtmpTranscoder.getIncomingEncodedFrameSize()); rtpSender = new RtpStreamSender(rtmpToRtpTranscoder, socket, connInfo.getRemoteAddr(), connInfo.getRemotePort()); talkStream = new TalkStream(rtmpToRtpTranscoder, rtpSender); } public String getTalkStreamName() { return talkStream.getStreamName(); } public String getListenStreamName() { return listenStream.getStreamName(); } public void queueSipDtmfDigits(String argDigits) { if (rtpSender != null) rtpSender.queueSipDtmfDigits(argDigits); } public void startTalkStream(IBroadcastStream broadcastStream, IScope scope) { talkStream.start(broadcastStream, scope); packetProcessor.start(); listenStream.start(); rtpSender.start(); rtpReceiver.setRtpStreamReceiverListener(this); rtpReceiver.start(); } public void stopTalkStream(IBroadcastStream broadcastStream, IScope scope) { stopMedia(); } public boolean stopMedia() { printLog( "stopMedia", "Halting sip audio..." ); talkStream.stop(); listenStream.stop(); packetProcessor.stop(); rtpSender.stop(); rtpReceiver.stop(); return true; } private static void printLog( String method, String message ) { log.debug( "SipAudioLauncher - " + method + " -> " + message ); System.out.println( "SipAudioLauncher - " + method + " -> " + message ); } public void onStoppedReceiving() { System.out.println("Closing socket"); socket.close(); } }