synchronize public WebRTCWrapper methods so closes don’t race
This commit is contained in:
parent
0d4b175760
commit
333f509e53
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue