Skip to content

Commit 707a0a9

Browse files
author
Robert Henigan
authored
Refactor/streaming calls (#1468)
* Refactor Streaming Calls to manager classes * Fix Unit Tests * Make methods protected * Remove stopAudioService References
1 parent d7661ac commit 707a0a9

9 files changed

Lines changed: 124 additions & 205 deletions

File tree

android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/audio/AudioStreamManagerTest.java

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
import android.media.MediaFormat;
66
import android.media.MediaPlayer;
77
import android.os.Build;
8-
import androidx.test.platform.app.InstrumentationRegistry;
98
import android.util.Log;
109

10+
import androidx.test.platform.app.InstrumentationRegistry;
11+
1112
import com.smartdevicelink.SdlConnection.SdlSession;
1213
import com.smartdevicelink.managers.CompletionListener;
1314
import com.smartdevicelink.managers.audio.AudioStreamManager.SampleType;
@@ -93,10 +94,6 @@ public Void answer(InvocationOnMock invocation) {
9394
Boolean encrypted = (Boolean) args[0];
9495
serviceListener.onServiceStarted(mockSession, SessionType.PCM, encrypted);
9596
break;
96-
case "stopAudioService":
97-
// parameters ()
98-
serviceListener.onServiceEnded(mockSession, SessionType.PCM);
99-
break;
10097
}
10198

10299
return null;
@@ -109,7 +106,6 @@ public Void answer(InvocationOnMock invocation) {
109106
doReturn(audioCapabilities).when(internalInterface).getCapability(SystemCapabilityType.PCM_STREAMING);
110107
doAnswer(audioServiceAnswer).when(internalInterface).addServiceListener(any(SessionType.class), any(ISdlServiceListener.class));
111108
doAnswer(audioServiceAnswer).when(internalInterface).startAudioService(any(Boolean.class));
112-
doAnswer(audioServiceAnswer).when(internalInterface).stopAudioService();
113109

114110
CompletionListener completionListener = new CompletionListener() {
115111
@Override
@@ -228,7 +224,7 @@ private void runFullAudioManagerDecodeFlowWithSquareSampleAudio(final int sample
228224
testFullAudioManagerDecodeFlowCorrectCounter = 0;
229225
testFullAudioManagerDecodeFlowWrongCounter = 0;
230226

231-
IAudioStreamListener audioStreamListener = new IAudioStreamListener() {
227+
final IAudioStreamListener audioStreamListener = new IAudioStreamListener() {
232228
@Override
233229
public void sendAudio(byte[] data, int offset, int length, long presentationTimeUs) throws ArrayIndexOutOfBoundsException {
234230
ByteBuffer buffer = ByteBuffer.wrap(data, offset, length);
@@ -270,7 +266,6 @@ public void sendAudio(ByteBuffer data, long presentationTimeUs, CompletionListen
270266
};
271267

272268
final SdlSession mockSession = mock(SdlSession.class);
273-
doReturn(audioStreamListener).when(mockSession).startAudioStream();
274269

275270
Answer<Void> audioServiceAnswer = new Answer<Void>() {
276271
ISdlServiceListener serviceListener = null;
@@ -292,10 +287,6 @@ public Void answer(InvocationOnMock invocation) {
292287
Boolean encrypted = (Boolean) args[0];
293288
serviceListener.onServiceStarted(mockSession, SessionType.PCM, encrypted);
294289
break;
295-
case "stopAudioService":
296-
// parameters ()
297-
serviceListener.onServiceEnded(mockSession, SessionType.PCM);
298-
break;
299290
}
300291

301292
return null;
@@ -307,7 +298,6 @@ public Void answer(InvocationOnMock invocation) {
307298
doReturn(audioCapabilities).when(internalInterface).getCapability(any(SystemCapabilityType.class));
308299
doAnswer(audioServiceAnswer).when(internalInterface).addServiceListener(any(SessionType.class), any(ISdlServiceListener.class));
309300
doAnswer(audioServiceAnswer).when(internalInterface).startAudioService(any(Boolean.class));
310-
doAnswer(audioServiceAnswer).when(internalInterface).stopAudioService();
311301

312302
CompletionListener fileCompletionListener = new CompletionListener() {
313303
@Override
@@ -325,7 +315,12 @@ public void onComplete(boolean success) {
325315

326316
final CompletionListener mockFileListener = spy(fileCompletionListener);
327317

328-
final AudioStreamManager manager = new AudioStreamManager(internalInterface, mContext);
318+
final AudioStreamManager manager = new AudioStreamManager(internalInterface, mContext) {
319+
@Override
320+
public IAudioStreamListener startAudioStream(SdlSession session) {
321+
return audioStreamListener;
322+
}
323+
};
329324
manager.startAudioStream(false, new CompletionListener() {
330325
@Override
331326
public void onComplete(boolean success) {
@@ -504,7 +499,6 @@ public void sendAudio(ByteBuffer data, long presentationTimeUs, CompletionListen
504499
};
505500

506501
final SdlSession mockSession = mock(SdlSession.class);
507-
doReturn(audioStreamListener).when(mockSession).startAudioStream();
508502

509503
Answer<Void> audioServiceAnswer = new Answer<Void>() {
510504
ISdlServiceListener serviceListener = null;
@@ -526,10 +520,6 @@ public Void answer(InvocationOnMock invocation) {
526520
Boolean encrypted = (Boolean) args[0];
527521
serviceListener.onServiceStarted(mockSession, SessionType.PCM, encrypted);
528522
break;
529-
case "stopAudioService":
530-
// parameters ()
531-
serviceListener.onServiceEnded(mockSession, SessionType.PCM);
532-
break;
533523
}
534524

535525
return null;
@@ -541,7 +531,6 @@ public Void answer(InvocationOnMock invocation) {
541531
doReturn(audioCapabilities).when(internalInterface).getCapability(any(SystemCapabilityType.class));
542532
doAnswer(audioServiceAnswer).when(internalInterface).addServiceListener(any(SessionType.class), any(ISdlServiceListener.class));
543533
doAnswer(audioServiceAnswer).when(internalInterface).startAudioService(any(Boolean.class));
544-
doAnswer(audioServiceAnswer).when(internalInterface).stopAudioService();
545534

546535
final MediaPlayer.OnCompletionListener mockPlayerCompletionListener = mock(MediaPlayer.OnCompletionListener.class);
547536
final MediaPlayer player = new MediaPlayer();
@@ -583,14 +572,11 @@ public void onComplete(boolean success) {
583572
public void testPlayRawAudio() {
584573
AudioPassThruCapabilities audioCapabilities = new AudioPassThruCapabilities(SamplingRate._16KHZ, BitsPerSample._16_BIT, AudioType.PCM);
585574

586-
IAudioStreamListener audioStreamListener = mock(IAudioStreamListener.class);
587-
575+
final IAudioStreamListener audioStreamListener = mock(IAudioStreamListener.class);
588576

589577
final CompletionListener completionListener = mock(CompletionListener.class);
590578

591579
final SdlSession mockSession = mock(SdlSession.class);
592-
doReturn(audioStreamListener).when(mockSession).startAudioStream();
593-
594580

595581
Answer<Void> audioServiceAnswer = new Answer<Void>() {
596582
ISdlServiceListener serviceListener = null;
@@ -623,7 +609,13 @@ public Void answer(InvocationOnMock invocation) {
623609
doAnswer(audioServiceAnswer).when(internalInterface).addServiceListener(any(SessionType.class), any(ISdlServiceListener.class));
624610
doAnswer(audioServiceAnswer).when(internalInterface).startAudioService(any(Boolean.class));
625611

626-
final AudioStreamManager manager = new AudioStreamManager(internalInterface, mContext);
612+
final AudioStreamManager manager = new AudioStreamManager(internalInterface, mContext) {
613+
@Override
614+
public IAudioStreamListener startAudioStream(SdlSession session) {
615+
return audioStreamListener;
616+
}
617+
};
618+
627619
manager.startAudioStream(false, new CompletionListener() {
628620
@Override
629621
public void onComplete(boolean success) {

android/sdl_android/src/androidTest/java/com/smartdevicelink/managers/lifecycle/SystemCapabilityManagerTests.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -959,12 +959,6 @@ public void removeServiceListener(SessionType serviceType, ISdlServiceListener s
959959
@Override
960960
public void startVideoService(VideoStreamingParameters parameters, boolean encrypted) { }
961961

962-
@Override
963-
public void stopVideoService() {}
964-
965-
@Override
966-
public void stopAudioService() {}
967-
968962
@Override
969963
public void sendRPCRequest(RPCRequest message) {}
970964

android/sdl_android/src/main/java/com/smartdevicelink/SdlConnection/SdlSession.java

Lines changed: 0 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -35,29 +35,18 @@
3535
import android.content.Context;
3636

3737
import com.smartdevicelink.exception.SdlException;
38-
import com.smartdevicelink.protocol.ProtocolMessage;
3938
import com.smartdevicelink.protocol.SdlPacket;
4039
import com.smartdevicelink.protocol.SdlProtocol;
4140
import com.smartdevicelink.protocol.SdlProtocolBase;
4241
import com.smartdevicelink.protocol.enums.SessionType;
43-
import com.smartdevicelink.proxy.interfaces.IAudioStreamListener;
4442
import com.smartdevicelink.proxy.interfaces.ISdlServiceListener;
45-
import com.smartdevicelink.proxy.interfaces.IVideoStreamListener;
46-
import com.smartdevicelink.proxy.rpc.VideoStreamingFormat;
47-
import com.smartdevicelink.proxy.rpc.enums.VideoStreamingProtocol;
48-
import com.smartdevicelink.streaming.AbstractPacketizer;
49-
import com.smartdevicelink.streaming.IStreamListener;
50-
import com.smartdevicelink.streaming.StreamPacketizer;
51-
import com.smartdevicelink.streaming.video.RTPH264Packetizer;
52-
import com.smartdevicelink.streaming.video.VideoStreamingParameters;
5343
import com.smartdevicelink.transport.MultiplexTransportConfig;
5444
import com.smartdevicelink.transport.TCPTransportConfig;
5545
import com.smartdevicelink.transport.enums.TransportType;
5646
import com.smartdevicelink.util.DebugTool;
5747
import com.smartdevicelink.util.MediaStreamingStatus;
5848
import com.smartdevicelink.util.Version;
5949

60-
import java.io.IOException;
6150
import java.lang.ref.WeakReference;
6251
import java.util.concurrent.CopyOnWriteArrayList;
6352

@@ -178,13 +167,8 @@ public void onServiceStarted(SdlPacket packet, SessionType serviceType, int sess
178167

179168
@Override
180169
public void onServiceEnded(SdlPacket packet, SessionType serviceType, int sessionID) {
181-
182170
if (SessionType.RPC.equals(serviceType)) {
183171
this.sessionListener.onSessionEnded(sessionID);
184-
} else if (SessionType.NAV.equals(serviceType)) {
185-
stopVideoStream();
186-
} else if (SessionType.PCM.equals(serviceType)) {
187-
stopAudioStream();
188172
}
189173

190174
if (serviceListeners != null && serviceListeners.containsKey(serviceType)) {
@@ -198,12 +182,6 @@ public void onServiceEnded(SdlPacket packet, SessionType serviceType, int sessio
198182

199183
@Override
200184
public void onServiceError(SdlPacket packet, SessionType serviceType, int sessionID, String error) {
201-
if (SessionType.NAV.equals(serviceType)) {
202-
stopVideoStream();
203-
} else if (SessionType.PCM.equals(serviceType)) {
204-
stopAudioStream();
205-
}
206-
207185
if (serviceListeners != null && serviceListeners.containsKey(serviceType)) {
208186
CopyOnWriteArrayList<ISdlServiceListener> listeners = serviceListeners.get(serviceType);
209187
for (ISdlServiceListener listener : listeners) {
@@ -215,86 +193,4 @@ public void onServiceError(SdlPacket packet, SessionType serviceType, int sessio
215193
@Override
216194
public void onAuthTokenReceived(String authToken) {/* Do nothing */ }
217195

218-
/* ***********************************************************************************************************************************************************************
219-
* ***************************************************************** Fix after initial refactor *********************************************************************************
220-
*************************************************************************************************************************************************************************/
221-
//FIXME there is a lot of spaghetti code here that needs to be addressed. For first refactor the
222-
// the goal is to only refactor SdlSession. Another PR should be opened to fix all the packetizer
223-
// classes and method calls.
224-
225-
//FIXME Move this logic to the related streaming manager
226-
private AbstractPacketizer videoPacketizer;
227-
private StreamPacketizer audioPacketizer;
228-
229-
IStreamListener streamListener = new IStreamListener() {
230-
@Override
231-
public void sendStreamPacket(ProtocolMessage pm) {
232-
sendMessage(pm);
233-
}
234-
};
235-
236-
private VideoStreamingProtocol getAcceptedProtocol() {
237-
if (acceptedVideoParams != null) {
238-
VideoStreamingFormat format = acceptedVideoParams.getFormat();
239-
if (format != null && format.getProtocol() != null) {
240-
return format.getProtocol();
241-
}
242-
}
243-
//Returns default protocol if none are found
244-
return new VideoStreamingParameters().getFormat().getProtocol();
245-
246-
}
247-
248-
public IVideoStreamListener startVideoStream() {
249-
VideoStreamingProtocol protocol = getAcceptedProtocol();
250-
try {
251-
switch (protocol) {
252-
case RAW: {
253-
videoPacketizer = new StreamPacketizer(streamListener, null, SessionType.NAV, (byte) this.sessionId, this);
254-
videoPacketizer.start();
255-
return (IVideoStreamListener) videoPacketizer;
256-
}
257-
case RTP: {
258-
//FIXME why is this not an extension of StreamPacketizer?
259-
videoPacketizer = new RTPH264Packetizer(streamListener, SessionType.NAV, (byte) this.sessionId, this);
260-
videoPacketizer.start();
261-
return (IVideoStreamListener) videoPacketizer;
262-
}
263-
default:
264-
DebugTool.logError(TAG, "Protocol " + protocol + " is not supported.");
265-
return null;
266-
}
267-
} catch (IOException e) {
268-
return null;
269-
}
270-
}
271-
272-
public IAudioStreamListener startAudioStream() {
273-
try {
274-
audioPacketizer = new StreamPacketizer(streamListener, null, SessionType.PCM, (byte) this.sessionId, this);
275-
audioPacketizer.start();
276-
return audioPacketizer;
277-
} catch (IOException e) {
278-
return null;
279-
}
280-
281-
}
282-
283-
284-
public boolean stopVideoStream() {
285-
if (videoPacketizer != null) {
286-
videoPacketizer.stop();
287-
return true;
288-
}
289-
return false;
290-
}
291-
292-
public boolean stopAudioStream() {
293-
if (audioPacketizer != null) {
294-
audioPacketizer.stop();
295-
return true;
296-
}
297-
return false;
298-
}
299-
300196
}

android/sdl_android/src/main/java/com/smartdevicelink/managers/audio/AudioStreamManager.java

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import com.smartdevicelink.managers.CompletionListener;
4646
import com.smartdevicelink.managers.StreamingStateMachine;
4747
import com.smartdevicelink.managers.lifecycle.OnSystemCapabilityListener;
48+
import com.smartdevicelink.protocol.ProtocolMessage;
4849
import com.smartdevicelink.protocol.enums.FunctionID;
4950
import com.smartdevicelink.protocol.enums.SessionType;
5051
import com.smartdevicelink.proxy.RPCNotification;
@@ -57,10 +58,13 @@
5758
import com.smartdevicelink.proxy.rpc.enums.PredefinedWindows;
5859
import com.smartdevicelink.proxy.rpc.enums.SystemCapabilityType;
5960
import com.smartdevicelink.proxy.rpc.listeners.OnRPCNotificationListener;
61+
import com.smartdevicelink.streaming.IStreamListener;
62+
import com.smartdevicelink.streaming.StreamPacketizer;
6063
import com.smartdevicelink.transport.utl.TransportRecord;
6164
import com.smartdevicelink.util.DebugTool;
6265
import com.smartdevicelink.util.Version;
6366

67+
import java.io.IOException;
6468
import java.lang.annotation.Retention;
6569
import java.lang.annotation.RetentionPolicy;
6670
import java.lang.ref.WeakReference;
@@ -91,6 +95,9 @@ public class AudioStreamManager extends BaseAudioStreamManager {
9195
private CompletionListener serviceCompletionListener;
9296
// As the internal interface does not provide timeout we need to use a future task
9397
private final Handler serviceCompletionHandler;
98+
private StreamPacketizer audioPacketizer;
99+
private SdlSession sdlSession = null;
100+
private SessionType sessionType = null;
94101

95102
private final Runnable serviceCompletionTimeoutCallback = new Runnable() {
96103
@Override
@@ -106,10 +113,12 @@ public void run() {
106113
private final ISdlServiceListener serviceListener = new ISdlServiceListener() {
107114
@Override
108115
public void onServiceStarted(SdlSession session, SessionType type, boolean isEncrypted) {
116+
sdlSession = session;
117+
sessionType = type;
109118
if (SessionType.PCM.equals(type)) {
110119
serviceCompletionHandler.removeCallbacks(serviceCompletionTimeoutCallback);
111120

112-
sdlAudioStream = session.startAudioStream();
121+
sdlAudioStream = startAudioStream(session);
113122
streamingStateMachine.transitionToState(StreamingStateMachine.STARTED);
114123

115124
if (serviceCompletionListener != null) {
@@ -125,7 +134,7 @@ public void onServiceEnded(SdlSession session, SessionType type) {
125134
if (SessionType.PCM.equals(type)) {
126135
serviceCompletionHandler.removeCallbacks(serviceCompletionTimeoutCallback);
127136

128-
session.stopAudioStream();
137+
stopAudioStream();
129138
sdlAudioStream = null;
130139
streamingStateMachine.transitionToState(StreamingStateMachine.NONE);
131140

@@ -142,6 +151,7 @@ public void onServiceError(SdlSession session, SessionType type, String reason)
142151
if (SessionType.PCM.equals(type)) {
143152
serviceCompletionHandler.removeCallbacks(serviceCompletionTimeoutCallback);
144153

154+
stopAudioStream();
145155
streamingStateMachine.transitionToState(StreamingStateMachine.ERROR);
146156
DebugTool.logError(TAG, "OnServiceError: " + reason);
147157
streamingStateMachine.transitionToState(StreamingStateMachine.NONE);
@@ -338,7 +348,8 @@ public void stopAudioStream(final CompletionListener completionListener) {
338348
streamingStateMachine.transitionToState(StreamingStateMachine.STOPPED);
339349
serviceCompletionListener = completionListener;
340350
serviceCompletionHandler.postDelayed(serviceCompletionTimeoutCallback, COMPLETION_TIMEOUT);
341-
internalInterface.stopAudioService();
351+
stopAudioStream();
352+
serviceListener.onServiceEnded(sdlSession, sessionType);
342353
}
343354

344355
/**
@@ -490,4 +501,30 @@ protected void onTransportUpdate(List<TransportRecord> connectedTransports, bool
490501
// range of ENCODING_PCM_FLOAT audio data is [-1.0, 1.0].
491502
int FLOAT = Float.SIZE >> 3;
492503
}
504+
505+
protected IAudioStreamListener startAudioStream(final SdlSession session) {
506+
507+
IStreamListener streamListener = new IStreamListener() {
508+
@Override
509+
public void sendStreamPacket(ProtocolMessage pm) {
510+
session.sendMessage(pm);
511+
}
512+
};
513+
514+
try {
515+
audioPacketizer = new StreamPacketizer(streamListener, null, SessionType.PCM, (byte) session.getSessionId(), session);
516+
audioPacketizer.start();
517+
return audioPacketizer;
518+
} catch (IOException e) {
519+
return null;
520+
}
521+
}
522+
523+
protected boolean stopAudioStream() {
524+
if (audioPacketizer != null) {
525+
audioPacketizer.stop();
526+
return true;
527+
}
528+
return false;
529+
}
493530
}

0 commit comments

Comments
 (0)