synchronize public WebRTCWrapper methods so closes don’t race

This commit is contained in:
Daniel Gultsch 2020-04-29 09:10:15 +02:00
parent 0d4b175760
commit 333f509e53

View file

@ -158,7 +158,7 @@ public class WebRTCWrapper {
private EglBase eglBase = null; private EglBase eglBase = null;
private CapturerChoice capturerChoice; private CapturerChoice capturerChoice;
public WebRTCWrapper(final EventCallback eventCallback) { WebRTCWrapper(final EventCallback eventCallback) {
this.eventCallback = eventCallback; this.eventCallback = eventCallback;
} }
@ -175,7 +175,7 @@ public class WebRTCWrapper {
}); });
} }
public void initializePeerConnection(final Set<Media> media, final List<PeerConnection.IceServer> iceServers) throws InitializationException { synchronized void initializePeerConnection(final Set<Media> media, final List<PeerConnection.IceServer> iceServers) throws InitializationException {
Preconditions.checkState(this.eglBase != null); Preconditions.checkState(this.eglBase != null);
Preconditions.checkNotNull(media); Preconditions.checkNotNull(media);
Preconditions.checkArgument(media.size() > 0, "media can not be empty when initializing peer connection"); Preconditions.checkArgument(media.size() > 0, "media can not be empty when initializing peer connection");
@ -224,7 +224,7 @@ public class WebRTCWrapper {
this.peerConnection = peerConnection; this.peerConnection = peerConnection;
} }
public void close() { synchronized void close() {
final PeerConnection peerConnection = this.peerConnection; final PeerConnection peerConnection = this.peerConnection;
final CapturerChoice capturerChoice = this.capturerChoice; final CapturerChoice capturerChoice = this.capturerChoice;
final AppRTCAudioManager audioManager = this.appRTCAudioManager; final AppRTCAudioManager audioManager = this.appRTCAudioManager;
@ -259,7 +259,7 @@ public class WebRTCWrapper {
} }
} }
void verifyClosed() { synchronized void verifyClosed() {
if (this.peerConnection != null if (this.peerConnection != null
|| this.eglBase != null || this.eglBase != null
|| this.localVideoTrack != null || this.localVideoTrack != null
@ -286,7 +286,7 @@ public class WebRTCWrapper {
audioTrack.setEnabled(enabled); audioTrack.setEnabled(enabled);
} }
public boolean isVideoEnabled() { boolean isVideoEnabled() {
final VideoTrack videoTrack = this.localVideoTrack; final VideoTrack videoTrack = this.localVideoTrack;
if (videoTrack == null) { if (videoTrack == null) {
throw new IllegalStateException("Local video track does not exist"); throw new IllegalStateException("Local video track does not exist");
@ -294,7 +294,7 @@ public class WebRTCWrapper {
return videoTrack.enabled(); return videoTrack.enabled();
} }
public void setVideoEnabled(final boolean enabled) { void setVideoEnabled(final boolean enabled) {
final VideoTrack videoTrack = this.localVideoTrack; final VideoTrack videoTrack = this.localVideoTrack;
if (videoTrack == null) { if (videoTrack == null) {
throw new IllegalStateException("Local video track does not exist"); throw new IllegalStateException("Local video track does not exist");
@ -302,7 +302,7 @@ public class WebRTCWrapper {
videoTrack.setEnabled(enabled); videoTrack.setEnabled(enabled);
} }
public ListenableFuture<SessionDescription> createOffer() { ListenableFuture<SessionDescription> createOffer() {
return Futures.transformAsync(getPeerConnectionFuture(), peerConnection -> { return Futures.transformAsync(getPeerConnectionFuture(), peerConnection -> {
final SettableFuture<SessionDescription> future = SettableFuture.create(); final SettableFuture<SessionDescription> future = SettableFuture.create();
peerConnection.createOffer(new CreateSdpObserver() { peerConnection.createOffer(new CreateSdpObserver() {
@ -313,7 +313,6 @@ public class WebRTCWrapper {
@Override @Override
public void onCreateFailure(String s) { public void onCreateFailure(String s) {
Log.d(Config.LOGTAG, "create failure" + s);
future.setException(new IllegalStateException("Unable to create offer: " + s)); future.setException(new IllegalStateException("Unable to create offer: " + s));
} }
}, new MediaConstraints()); }, new MediaConstraints());
@ -321,7 +320,7 @@ public class WebRTCWrapper {
}, MoreExecutors.directExecutor()); }, MoreExecutors.directExecutor());
} }
public ListenableFuture<SessionDescription> createAnswer() { ListenableFuture<SessionDescription> createAnswer() {
return Futures.transformAsync(getPeerConnectionFuture(), peerConnection -> { return Futures.transformAsync(getPeerConnectionFuture(), peerConnection -> {
final SettableFuture<SessionDescription> future = SettableFuture.create(); final SettableFuture<SessionDescription> future = SettableFuture.create();
peerConnection.createAnswer(new CreateSdpObserver() { peerConnection.createAnswer(new CreateSdpObserver() {
@ -339,7 +338,7 @@ public class WebRTCWrapper {
}, MoreExecutors.directExecutor()); }, MoreExecutors.directExecutor());
} }
public ListenableFuture<Void> setLocalDescription(final SessionDescription sessionDescription) { ListenableFuture<Void> setLocalDescription(final SessionDescription sessionDescription) {
Log.d(EXTENDED_LOGGING_TAG, "setting local description:"); Log.d(EXTENDED_LOGGING_TAG, "setting local description:");
for (final String line : sessionDescription.description.split(eu.siacs.conversations.xmpp.jingle.SessionDescription.LINE_DIVIDER)) { for (final String line : sessionDescription.description.split(eu.siacs.conversations.xmpp.jingle.SessionDescription.LINE_DIVIDER)) {
Log.d(EXTENDED_LOGGING_TAG, line); Log.d(EXTENDED_LOGGING_TAG, line);
@ -363,7 +362,7 @@ public class WebRTCWrapper {
}, MoreExecutors.directExecutor()); }, MoreExecutors.directExecutor());
} }
public ListenableFuture<Void> setRemoteDescription(final SessionDescription sessionDescription) { ListenableFuture<Void> setRemoteDescription(final SessionDescription sessionDescription) {
Log.d(EXTENDED_LOGGING_TAG, "setting remote description:"); Log.d(EXTENDED_LOGGING_TAG, "setting remote description:");
for (final String line : sessionDescription.description.split(eu.siacs.conversations.xmpp.jingle.SessionDescription.LINE_DIVIDER)) { for (final String line : sessionDescription.description.split(eu.siacs.conversations.xmpp.jingle.SessionDescription.LINE_DIVIDER)) {
Log.d(EXTENDED_LOGGING_TAG, line); Log.d(EXTENDED_LOGGING_TAG, line);
@ -396,7 +395,7 @@ public class WebRTCWrapper {
} }
} }
public void addIceCandidate(IceCandidate iceCandidate) { void addIceCandidate(IceCandidate iceCandidate) {
requirePeerConnection().addIceCandidate(iceCandidate); requirePeerConnection().addIceCandidate(iceCandidate);
} }
@ -447,11 +446,11 @@ public class WebRTCWrapper {
return this.eglBase.getEglBaseContext(); return this.eglBase.getEglBaseContext();
} }
public Optional<VideoTrack> getLocalVideoTrack() { Optional<VideoTrack> getLocalVideoTrack() {
return Optional.fromNullable(this.localVideoTrack); return Optional.fromNullable(this.localVideoTrack);
} }
public Optional<VideoTrack> getRemoteVideoTrack() { Optional<VideoTrack> getRemoteVideoTrack() {
return Optional.fromNullable(this.remoteVideoTrack); return Optional.fromNullable(this.remoteVideoTrack);
} }
@ -471,7 +470,7 @@ public class WebRTCWrapper {
return context; return context;
} }
public AppRTCAudioManager getAudioManager() { AppRTCAudioManager getAudioManager() {
return appRTCAudioManager; return appRTCAudioManager;
} }
@ -512,7 +511,7 @@ public class WebRTCWrapper {
} }
} }
public static class InitializationException extends Exception { static class InitializationException extends Exception {
private InitializationException(String message) { private InitializationException(String message) {
super(message); super(message);
@ -523,12 +522,12 @@ public class WebRTCWrapper {
private final CameraVideoCapturer cameraVideoCapturer; private final CameraVideoCapturer cameraVideoCapturer;
private final CameraEnumerationAndroid.CaptureFormat captureFormat; private final CameraEnumerationAndroid.CaptureFormat captureFormat;
public CapturerChoice(CameraVideoCapturer cameraVideoCapturer, CameraEnumerationAndroid.CaptureFormat captureFormat) { CapturerChoice(CameraVideoCapturer cameraVideoCapturer, CameraEnumerationAndroid.CaptureFormat captureFormat) {
this.cameraVideoCapturer = cameraVideoCapturer; this.cameraVideoCapturer = cameraVideoCapturer;
this.captureFormat = captureFormat; this.captureFormat = captureFormat;
} }
public int getFrameRate() { int getFrameRate() {
return Math.max(captureFormat.framerate.min, Math.min(CAPTURING_MAX_FRAME_RATE, captureFormat.framerate.max)); return Math.max(captureFormat.framerate.min, Math.min(CAPTURING_MAX_FRAME_RATE, captureFormat.framerate.max));
} }
} }