package org.red5.app.sip.stream; import org.red5.app.sip.AudioStream; import org.red5.app.sip.trancoders.TranscodedAudioDataListener; import org.red5.logging.Red5LoggerFactory; import org.red5.server.api.IContext; import org.red5.server.api.scope.IScope; import org.red5.server.net.rtmp.event.AudioData; import org.red5.server.scope.Scope; import org.red5.server.stream.IProviderService; import org.slf4j.Logger; public class ListenStream implements TranscodedAudioDataListener { final private Logger log = Red5LoggerFactory.getLogger(ListenStream.class, "sip"); private AudioStream broadcastStream; private IScope scope; private final String listenStreamName; public ListenStream(IScope scope) { this.scope = scope; listenStreamName = "speaker_" + System.currentTimeMillis(); ((Scope)scope).setName(listenStreamName); } public String getStreamName() { return listenStreamName; } public void stop() { streamEnded(); } public void start() { System.out.println("**** Starting listen stream ****"); startPublishing(scope); } public void handleTranscodedAudioData(AudioData audioData) { streamAudioData(audioData); } private void streamAudioData(AudioData audioData) { long startRx = System.currentTimeMillis(); /* * Don't set the timestamp as it results in choppy audio. Let the client * play the audio as soon as they receive the packets. (ralam dec 10, 2009) */ broadcastStream.dispatchEvent(audioData); audioData.release(); long completeRx = System.currentTimeMillis(); // System.out.println("Send took " + (completeRx - startRx) + "ms."); } private void streamEnded() { broadcastStream.stop(); broadcastStream.close(); log.debug("stopping and closing stream {}", listenStreamName); } private void startPublishing(IScope aScope){ System.out.println("started publishing stream in " + aScope.getName()); broadcastStream = new AudioStream(listenStreamName); broadcastStream.setPublishedName(listenStreamName); broadcastStream.setScope(aScope); IContext context = aScope.getContext(); IProviderService providerService = (IProviderService) context.getBean(IProviderService.BEAN_NAME); if (providerService.registerBroadcastStream(aScope, listenStreamName, broadcastStream)){ // Do nothing. } else{ log.error("could not register broadcast stream"); throw new RuntimeException("could not register broadcast stream"); } broadcastStream.start(); } }