diff options
Diffstat (limited to 'android/sdl_android/src/main/java/com/smartdevicelink')
5 files changed, 107 insertions, 148 deletions
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/SdlConnection/SdlSession.java b/android/sdl_android/src/main/java/com/smartdevicelink/SdlConnection/SdlSession.java index f4bdb7136..d9017bd69 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/SdlConnection/SdlSession.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/SdlConnection/SdlSession.java @@ -35,21 +35,11 @@ package com.smartdevicelink.SdlConnection; import android.content.Context; import com.smartdevicelink.exception.SdlException; -import com.smartdevicelink.protocol.ProtocolMessage; import com.smartdevicelink.protocol.SdlPacket; import com.smartdevicelink.protocol.SdlProtocol; import com.smartdevicelink.protocol.SdlProtocolBase; import com.smartdevicelink.protocol.enums.SessionType; -import com.smartdevicelink.proxy.interfaces.IAudioStreamListener; import com.smartdevicelink.proxy.interfaces.ISdlServiceListener; -import com.smartdevicelink.proxy.interfaces.IVideoStreamListener; -import com.smartdevicelink.proxy.rpc.VideoStreamingFormat; -import com.smartdevicelink.proxy.rpc.enums.VideoStreamingProtocol; -import com.smartdevicelink.streaming.AbstractPacketizer; -import com.smartdevicelink.streaming.IStreamListener; -import com.smartdevicelink.streaming.StreamPacketizer; -import com.smartdevicelink.streaming.video.RTPH264Packetizer; -import com.smartdevicelink.streaming.video.VideoStreamingParameters; import com.smartdevicelink.transport.MultiplexTransportConfig; import com.smartdevicelink.transport.TCPTransportConfig; import com.smartdevicelink.transport.enums.TransportType; @@ -57,7 +47,6 @@ import com.smartdevicelink.util.DebugTool; import com.smartdevicelink.util.MediaStreamingStatus; import com.smartdevicelink.util.Version; -import java.io.IOException; import java.lang.ref.WeakReference; import java.util.concurrent.CopyOnWriteArrayList; @@ -178,13 +167,8 @@ public class SdlSession extends BaseSdlSession { @Override public void onServiceEnded(SdlPacket packet, SessionType serviceType, int sessionID) { - if (SessionType.RPC.equals(serviceType)) { this.sessionListener.onSessionEnded(sessionID); - } else if (SessionType.NAV.equals(serviceType)) { - stopVideoStream(); - } else if (SessionType.PCM.equals(serviceType)) { - stopAudioStream(); } if (serviceListeners != null && serviceListeners.containsKey(serviceType)) { @@ -198,12 +182,6 @@ public class SdlSession extends BaseSdlSession { @Override public void onServiceError(SdlPacket packet, SessionType serviceType, int sessionID, String error) { - if (SessionType.NAV.equals(serviceType)) { - stopVideoStream(); - } else if (SessionType.PCM.equals(serviceType)) { - stopAudioStream(); - } - if (serviceListeners != null && serviceListeners.containsKey(serviceType)) { CopyOnWriteArrayList<ISdlServiceListener> listeners = serviceListeners.get(serviceType); for (ISdlServiceListener listener : listeners) { @@ -215,86 +193,4 @@ public class SdlSession extends BaseSdlSession { @Override public void onAuthTokenReceived(String authToken) {/* Do nothing */ } - /* *********************************************************************************************************************************************************************** - * ***************************************************************** Fix after initial refactor ********************************************************************************* - *************************************************************************************************************************************************************************/ - //FIXME there is a lot of spaghetti code here that needs to be addressed. For first refactor the - // the goal is to only refactor SdlSession. Another PR should be opened to fix all the packetizer - // classes and method calls. - - //FIXME Move this logic to the related streaming manager - private AbstractPacketizer videoPacketizer; - private StreamPacketizer audioPacketizer; - - IStreamListener streamListener = new IStreamListener() { - @Override - public void sendStreamPacket(ProtocolMessage pm) { - sendMessage(pm); - } - }; - - private VideoStreamingProtocol getAcceptedProtocol() { - if (acceptedVideoParams != null) { - VideoStreamingFormat format = acceptedVideoParams.getFormat(); - if (format != null && format.getProtocol() != null) { - return format.getProtocol(); - } - } - //Returns default protocol if none are found - return new VideoStreamingParameters().getFormat().getProtocol(); - - } - - public IVideoStreamListener startVideoStream() { - VideoStreamingProtocol protocol = getAcceptedProtocol(); - try { - switch (protocol) { - case RAW: { - videoPacketizer = new StreamPacketizer(streamListener, null, SessionType.NAV, (byte) this.sessionId, this); - videoPacketizer.start(); - return (IVideoStreamListener) videoPacketizer; - } - case RTP: { - //FIXME why is this not an extension of StreamPacketizer? - videoPacketizer = new RTPH264Packetizer(streamListener, SessionType.NAV, (byte) this.sessionId, this); - videoPacketizer.start(); - return (IVideoStreamListener) videoPacketizer; - } - default: - DebugTool.logError(TAG, "Protocol " + protocol + " is not supported."); - return null; - } - } catch (IOException e) { - return null; - } - } - - public IAudioStreamListener startAudioStream() { - try { - audioPacketizer = new StreamPacketizer(streamListener, null, SessionType.PCM, (byte) this.sessionId, this); - audioPacketizer.start(); - return audioPacketizer; - } catch (IOException e) { - return null; - } - - } - - - public boolean stopVideoStream() { - if (videoPacketizer != null) { - videoPacketizer.stop(); - return true; - } - return false; - } - - public boolean stopAudioStream() { - if (audioPacketizer != null) { - audioPacketizer.stop(); - return true; - } - return false; - } - } diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java index 38bc357b6..f7cc7b7a5 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java @@ -45,6 +45,7 @@ import com.smartdevicelink.SdlConnection.SdlSession; import com.smartdevicelink.managers.CompletionListener;
import com.smartdevicelink.managers.StreamingStateMachine;
import com.smartdevicelink.managers.lifecycle.OnSystemCapabilityListener;
+import com.smartdevicelink.protocol.ProtocolMessage;
import com.smartdevicelink.protocol.enums.FunctionID;
import com.smartdevicelink.protocol.enums.SessionType;
import com.smartdevicelink.proxy.RPCNotification;
@@ -57,10 +58,13 @@ import com.smartdevicelink.proxy.rpc.enums.HMILevel; import com.smartdevicelink.proxy.rpc.enums.PredefinedWindows;
import com.smartdevicelink.proxy.rpc.enums.SystemCapabilityType;
import com.smartdevicelink.proxy.rpc.listeners.OnRPCNotificationListener;
+import com.smartdevicelink.streaming.IStreamListener;
+import com.smartdevicelink.streaming.StreamPacketizer;
import com.smartdevicelink.transport.utl.TransportRecord;
import com.smartdevicelink.util.DebugTool;
import com.smartdevicelink.util.Version;
+import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
@@ -91,6 +95,9 @@ public class AudioStreamManager extends BaseAudioStreamManager { private CompletionListener serviceCompletionListener;
// As the internal interface does not provide timeout we need to use a future task
private final Handler serviceCompletionHandler;
+ private StreamPacketizer audioPacketizer;
+ private SdlSession sdlSession = null;
+ private SessionType sessionType = null;
private final Runnable serviceCompletionTimeoutCallback = new Runnable() {
@Override
@@ -106,10 +113,12 @@ public class AudioStreamManager extends BaseAudioStreamManager { private final ISdlServiceListener serviceListener = new ISdlServiceListener() {
@Override
public void onServiceStarted(SdlSession session, SessionType type, boolean isEncrypted) {
+ sdlSession = session;
+ sessionType = type;
if (SessionType.PCM.equals(type)) {
serviceCompletionHandler.removeCallbacks(serviceCompletionTimeoutCallback);
- sdlAudioStream = session.startAudioStream();
+ sdlAudioStream = startAudioStream(session);
streamingStateMachine.transitionToState(StreamingStateMachine.STARTED);
if (serviceCompletionListener != null) {
@@ -125,7 +134,7 @@ public class AudioStreamManager extends BaseAudioStreamManager { if (SessionType.PCM.equals(type)) {
serviceCompletionHandler.removeCallbacks(serviceCompletionTimeoutCallback);
- session.stopAudioStream();
+ stopAudioStream();
sdlAudioStream = null;
streamingStateMachine.transitionToState(StreamingStateMachine.NONE);
@@ -142,6 +151,7 @@ public class AudioStreamManager extends BaseAudioStreamManager { if (SessionType.PCM.equals(type)) {
serviceCompletionHandler.removeCallbacks(serviceCompletionTimeoutCallback);
+ stopAudioStream();
streamingStateMachine.transitionToState(StreamingStateMachine.ERROR);
DebugTool.logError(TAG, "OnServiceError: " + reason);
streamingStateMachine.transitionToState(StreamingStateMachine.NONE);
@@ -338,7 +348,8 @@ public class AudioStreamManager extends BaseAudioStreamManager { streamingStateMachine.transitionToState(StreamingStateMachine.STOPPED);
serviceCompletionListener = completionListener;
serviceCompletionHandler.postDelayed(serviceCompletionTimeoutCallback, COMPLETION_TIMEOUT);
- internalInterface.stopAudioService();
+ stopAudioStream();
+ serviceListener.onServiceEnded(sdlSession, sessionType);
}
/**
@@ -490,4 +501,30 @@ public class AudioStreamManager extends BaseAudioStreamManager { // range of ENCODING_PCM_FLOAT audio data is [-1.0, 1.0].
int FLOAT = Float.SIZE >> 3;
}
+
+ protected IAudioStreamListener startAudioStream(final SdlSession session) {
+
+ IStreamListener streamListener = new IStreamListener() {
+ @Override
+ public void sendStreamPacket(ProtocolMessage pm) {
+ session.sendMessage(pm);
+ }
+ };
+
+ try {
+ audioPacketizer = new StreamPacketizer(streamListener, null, SessionType.PCM, (byte) session.getSessionId(), session);
+ audioPacketizer.start();
+ return audioPacketizer;
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ protected boolean stopAudioStream() {
+ if (audioPacketizer != null) {
+ audioPacketizer.stop();
+ return true;
+ }
+ return false;
+ }
}
diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java index 2fe65b2fc..ed3f5f219 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java @@ -225,25 +225,6 @@ public class LifecycleManager extends BaseLifecycleManager { } } - /** - * Closes the opened video service (serviceType 11) - * - * @return true if the video service is closed successfully, return false otherwise - */ - @Override - void endVideoStream() { - if (session == null) { - DebugTool.logWarning(TAG, "SdlSession is not created yet."); - return; - } - if (!session.getIsConnected()) { - DebugTool.logWarning(TAG, "Connection is not available."); - return; - } - - session.stopVideoStream(); - } - @Override void startAudioService(boolean isEncrypted) { if (session == null) { @@ -256,23 +237,4 @@ public class LifecycleManager extends BaseLifecycleManager { } session.startService(SessionType.PCM, isEncrypted); } - - /** - * Closes the opened audio service (serviceType 10) - * - * @return true if the audio service is closed successfully, return false otherwise - */ - @Override - void endAudioStream() { - if (session == null) { - DebugTool.logWarning(TAG, "SdlSession is not created yet."); - return; - } - if (!session.getIsConnected()) { - DebugTool.logWarning(TAG, "Connection is not available."); - return; - } - - session.stopAudioStream(); - } } diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamManager.java b/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamManager.java index 81db89049..a55cecb4d 100644 --- a/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamManager.java +++ b/android/sdl_android/src/main/java/com/smartdevicelink/managers/video/VideoStreamManager.java @@ -46,6 +46,7 @@ import com.smartdevicelink.managers.BaseSubManager; import com.smartdevicelink.managers.CompletionListener; import com.smartdevicelink.managers.StreamingStateMachine; import com.smartdevicelink.managers.lifecycle.OnSystemCapabilityListener; +import com.smartdevicelink.protocol.ProtocolMessage; import com.smartdevicelink.protocol.enums.FunctionID; import com.smartdevicelink.protocol.enums.SessionType; import com.smartdevicelink.proxy.RPCNotification; @@ -59,18 +60,25 @@ import com.smartdevicelink.proxy.rpc.OnTouchEvent; import com.smartdevicelink.proxy.rpc.TouchCoord; import com.smartdevicelink.proxy.rpc.TouchEvent; import com.smartdevicelink.proxy.rpc.VideoStreamingCapability; +import com.smartdevicelink.proxy.rpc.VideoStreamingFormat; import com.smartdevicelink.proxy.rpc.enums.HMILevel; import com.smartdevicelink.proxy.rpc.enums.PredefinedWindows; import com.smartdevicelink.proxy.rpc.enums.SystemCapabilityType; import com.smartdevicelink.proxy.rpc.enums.TouchType; +import com.smartdevicelink.proxy.rpc.enums.VideoStreamingProtocol; import com.smartdevicelink.proxy.rpc.enums.VideoStreamingState; import com.smartdevicelink.proxy.rpc.listeners.OnRPCNotificationListener; +import com.smartdevicelink.streaming.AbstractPacketizer; +import com.smartdevicelink.streaming.IStreamListener; +import com.smartdevicelink.streaming.StreamPacketizer; +import com.smartdevicelink.streaming.video.RTPH264Packetizer; import com.smartdevicelink.streaming.video.SdlRemoteDisplay; import com.smartdevicelink.streaming.video.VideoStreamingParameters; import com.smartdevicelink.transport.utl.TransportRecord; import com.smartdevicelink.util.DebugTool; import com.smartdevicelink.util.Version; +import java.io.IOException; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -95,6 +103,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { private boolean isTransportAvailable = false; private boolean hasStarted; private String vehicleMake = null; + private AbstractPacketizer videoPacketizer; // INTERNAL INTERFACES @@ -104,7 +113,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { if(SessionType.NAV.equals(type)){ if (session != null && session.getAcceptedVideoParams() != null) { parameters = session.getAcceptedVideoParams(); - VideoStreamManager.this.streamListener = session.startVideoStream(); + VideoStreamManager.this.streamListener = startVideoStream(session.getAcceptedVideoParams(), session); } if (VideoStreamManager.this.streamListener == null) { @@ -125,6 +134,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { @Override public void onServiceEnded(SdlSession session, SessionType type) { if(SessionType.NAV.equals(type)){ + stopVideoStream(); if(remoteDisplay!=null){ stopStreaming(); } @@ -136,6 +146,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { @Override public void onServiceError(SdlSession session, SessionType type, String reason) { DebugTool.logError(TAG, "Unable to start video service: " + reason); + stopVideoStream(); stateMachine.transitionToState(StreamingStateMachine.ERROR); transitionToState(BaseSubManager.ERROR); } @@ -156,7 +167,7 @@ public class VideoStreamManager extends BaseVideoStreamManager { } checkState(); if (hasStarted && (isHMIStateVideoStreamCapable(prevOnHMIStatus)) && (!isHMIStateVideoStreamCapable(currentOnHMIStatus))) { - internalInterface.stopVideoService(); + stopVideoStream(); } } } @@ -375,13 +386,13 @@ public class VideoStreamManager extends BaseVideoStreamManager { parameters = null; virtualDisplayEncoder = null; if (internalInterface != null) { - internalInterface.stopVideoService(); // Remove listeners internalInterface.removeServiceListener(SessionType.NAV, serviceListener); internalInterface.removeOnRPCNotificationListener(FunctionID.ON_TOUCH_EVENT, touchListener); internalInterface.removeOnRPCNotificationListener(FunctionID.ON_HMI_STATUS, hmiListener); } + stopVideoStream(); stateMachine.transitionToState(StreamingStateMachine.NONE); @@ -704,4 +715,57 @@ public class VideoStreamManager extends BaseVideoStreamManager { } } + private VideoStreamingProtocol getAcceptedProtocol(VideoStreamingParameters params) { + if (params != null) { + VideoStreamingFormat format = params.getFormat(); + if (format != null && format.getProtocol() != null) { + return format.getProtocol(); + } + } + //Returns default protocol if none are found + return new VideoStreamingParameters().getFormat().getProtocol(); + + } + + protected IVideoStreamListener startVideoStream(VideoStreamingParameters params, final SdlSession session) { + VideoStreamingProtocol protocol = getAcceptedProtocol(params); + + IStreamListener iStreamListener = new IStreamListener() { + @Override + public void sendStreamPacket(ProtocolMessage pm) { + session.sendMessage(pm); + } + }; + + try { + switch (protocol) { + case RAW: { + videoPacketizer = new StreamPacketizer(iStreamListener, null, SessionType.NAV, (byte) session.getSessionId(), session); + videoPacketizer.start(); + return (IVideoStreamListener) videoPacketizer; + } + case RTP: { + //FIXME why is this not an extension of StreamPacketizer? + videoPacketizer = new RTPH264Packetizer(iStreamListener, SessionType.NAV, (byte) session.getSessionId(), session); + videoPacketizer.start(); + return (IVideoStreamListener) videoPacketizer; + } + default: + DebugTool.logError(TAG, "Protocol " + protocol + " is not supported."); + return null; + } + } catch (IOException e) { + return null; + } + + } + + protected boolean stopVideoStream() { + if (videoPacketizer != null) { + videoPacketizer.stop(); + return true; + } + return false; + } + } diff --git a/android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java b/android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/android/sdl_android/src/main/java/com/smartdevicelink/proxy/SdlProxyBase.java |