OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2014 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 package org.appspot.apprtc; | 11 package org.appspot.apprtc; |
12 | 12 |
13 import android.content.Context; | 13 import android.content.Context; |
14 import android.os.ParcelFileDescriptor; | 14 import android.os.ParcelFileDescriptor; |
15 import android.os.Environment; | 15 import android.os.Environment; |
16 import android.util.Log; | 16 import android.util.Log; |
17 | 17 |
18 import org.appspot.apprtc.AppRTCClient.SignalingParameters; | 18 import org.appspot.apprtc.AppRTCClient.SignalingParameters; |
19 import org.appspot.apprtc.util.LooperExecutor; | 19 import org.appspot.apprtc.util.LooperExecutor; |
| 20 import org.webrtc.AudioTrack; |
20 import org.webrtc.CameraEnumerationAndroid; | 21 import org.webrtc.CameraEnumerationAndroid; |
21 import org.webrtc.DataChannel; | 22 import org.webrtc.DataChannel; |
22 import org.webrtc.EglBase; | 23 import org.webrtc.EglBase; |
23 import org.webrtc.IceCandidate; | 24 import org.webrtc.IceCandidate; |
24 import org.webrtc.Logging; | 25 import org.webrtc.Logging; |
25 import org.webrtc.MediaCodecVideoEncoder; | 26 import org.webrtc.MediaCodecVideoEncoder; |
26 import org.webrtc.MediaConstraints; | 27 import org.webrtc.MediaConstraints; |
27 import org.webrtc.MediaConstraints.KeyValuePair; | 28 import org.webrtc.MediaConstraints.KeyValuePair; |
28 import org.webrtc.MediaStream; | 29 import org.webrtc.MediaStream; |
29 import org.webrtc.PeerConnection; | 30 import org.webrtc.PeerConnection; |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 private PeerConnectionEvents events; | 118 private PeerConnectionEvents events; |
118 private boolean isInitiator; | 119 private boolean isInitiator; |
119 private SessionDescription localSdp; // either offer or answer SDP | 120 private SessionDescription localSdp; // either offer or answer SDP |
120 private MediaStream mediaStream; | 121 private MediaStream mediaStream; |
121 private int numberOfCameras; | 122 private int numberOfCameras; |
122 private VideoCapturerAndroid videoCapturer; | 123 private VideoCapturerAndroid videoCapturer; |
123 // enableVideo is set to true if video should be rendered and sent. | 124 // enableVideo is set to true if video should be rendered and sent. |
124 private boolean renderVideo; | 125 private boolean renderVideo; |
125 private VideoTrack localVideoTrack; | 126 private VideoTrack localVideoTrack; |
126 private VideoTrack remoteVideoTrack; | 127 private VideoTrack remoteVideoTrack; |
| 128 // enableAudio is set to true if audio should be sent. |
| 129 private boolean enableAudio; |
| 130 private AudioTrack localAudioTrack; |
127 | 131 |
128 /** | 132 /** |
129 * Peer connection parameters. | 133 * Peer connection parameters. |
130 */ | 134 */ |
131 public static class PeerConnectionParameters { | 135 public static class PeerConnectionParameters { |
132 public final boolean videoCallEnabled; | 136 public final boolean videoCallEnabled; |
133 public final boolean loopback; | 137 public final boolean loopback; |
134 public final boolean tracing; | 138 public final boolean tracing; |
135 public final int videoWidth; | 139 public final int videoWidth; |
136 public final int videoHeight; | 140 public final int videoHeight; |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 preferIsac = false; | 249 preferIsac = false; |
246 videoSourceStopped = false; | 250 videoSourceStopped = false; |
247 isError = false; | 251 isError = false; |
248 queuedRemoteCandidates = null; | 252 queuedRemoteCandidates = null; |
249 localSdp = null; // either offer or answer SDP | 253 localSdp = null; // either offer or answer SDP |
250 mediaStream = null; | 254 mediaStream = null; |
251 videoCapturer = null; | 255 videoCapturer = null; |
252 renderVideo = true; | 256 renderVideo = true; |
253 localVideoTrack = null; | 257 localVideoTrack = null; |
254 remoteVideoTrack = null; | 258 remoteVideoTrack = null; |
| 259 enableAudio = true; |
| 260 localAudioTrack = null; |
255 statsTimer = new Timer(); | 261 statsTimer = new Timer(); |
256 | 262 |
257 executor.execute(new Runnable() { | 263 executor.execute(new Runnable() { |
258 @Override | 264 @Override |
259 public void run() { | 265 public void run() { |
260 createPeerConnectionFactoryInternal(context); | 266 createPeerConnectionFactoryInternal(context); |
261 } | 267 } |
262 }); | 268 }); |
263 } | 269 } |
264 | 270 |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 Log.d(TAG, "Opening camera: " + cameraDeviceName); | 491 Log.d(TAG, "Opening camera: " + cameraDeviceName); |
486 videoCapturer = VideoCapturerAndroid.create(cameraDeviceName, null, | 492 videoCapturer = VideoCapturerAndroid.create(cameraDeviceName, null, |
487 peerConnectionParameters.captureToTexture ? renderEGLContext : null); | 493 peerConnectionParameters.captureToTexture ? renderEGLContext : null); |
488 if (videoCapturer == null) { | 494 if (videoCapturer == null) { |
489 reportError("Failed to open camera"); | 495 reportError("Failed to open camera"); |
490 return; | 496 return; |
491 } | 497 } |
492 mediaStream.addTrack(createVideoTrack(videoCapturer)); | 498 mediaStream.addTrack(createVideoTrack(videoCapturer)); |
493 } | 499 } |
494 | 500 |
495 mediaStream.addTrack(factory.createAudioTrack( | 501 mediaStream.addTrack(createAudioTrack()); |
496 AUDIO_TRACK_ID, | |
497 factory.createAudioSource(audioConstraints))); | |
498 peerConnection.addStream(mediaStream); | 502 peerConnection.addStream(mediaStream); |
499 | 503 |
500 if (peerConnectionParameters.aecDump) { | 504 if (peerConnectionParameters.aecDump) { |
501 try { | 505 try { |
502 aecDumpFileDescriptor = ParcelFileDescriptor.open( | 506 aecDumpFileDescriptor = ParcelFileDescriptor.open( |
503 new File("/sdcard/Download/audio.aecdump"), | 507 new File("/sdcard/Download/audio.aecdump"), |
504 ParcelFileDescriptor.MODE_READ_WRITE | | 508 ParcelFileDescriptor.MODE_READ_WRITE | |
505 ParcelFileDescriptor.MODE_CREATE | | 509 ParcelFileDescriptor.MODE_CREATE | |
506 ParcelFileDescriptor.MODE_TRUNCATE); | 510 ParcelFileDescriptor.MODE_TRUNCATE); |
507 factory.startAecDump(aecDumpFileDescriptor.getFd(), -1); | 511 factory.startAecDump(aecDumpFileDescriptor.getFd(), -1); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 } | 602 } |
599 }, 0, periodMs); | 603 }, 0, periodMs); |
600 } catch (Exception e) { | 604 } catch (Exception e) { |
601 Log.e(TAG, "Can not schedule statistics timer", e); | 605 Log.e(TAG, "Can not schedule statistics timer", e); |
602 } | 606 } |
603 } else { | 607 } else { |
604 statsTimer.cancel(); | 608 statsTimer.cancel(); |
605 } | 609 } |
606 } | 610 } |
607 | 611 |
| 612 public void setAudioEnabled(final boolean enable) { |
| 613 executor.execute(new Runnable() { |
| 614 @Override |
| 615 public void run() { |
| 616 enableAudio = enable; |
| 617 if (localAudioTrack != null) { |
| 618 localAudioTrack.setEnabled(enableAudio); |
| 619 } |
| 620 } |
| 621 }); |
| 622 } |
| 623 |
608 public void setVideoEnabled(final boolean enable) { | 624 public void setVideoEnabled(final boolean enable) { |
609 executor.execute(new Runnable() { | 625 executor.execute(new Runnable() { |
610 @Override | 626 @Override |
611 public void run() { | 627 public void run() { |
612 renderVideo = enable; | 628 renderVideo = enable; |
613 if (localVideoTrack != null) { | 629 if (localVideoTrack != null) { |
614 localVideoTrack.setEnabled(renderVideo); | 630 localVideoTrack.setEnabled(renderVideo); |
615 } | 631 } |
616 if (remoteVideoTrack != null) { | 632 if (remoteVideoTrack != null) { |
617 remoteVideoTrack.setEnabled(renderVideo); | 633 remoteVideoTrack.setEnabled(renderVideo); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
742 @Override | 758 @Override |
743 public void run() { | 759 public void run() { |
744 if (!isError) { | 760 if (!isError) { |
745 events.onPeerConnectionError(errorMessage); | 761 events.onPeerConnectionError(errorMessage); |
746 isError = true; | 762 isError = true; |
747 } | 763 } |
748 } | 764 } |
749 }); | 765 }); |
750 } | 766 } |
751 | 767 |
| 768 private AudioTrack createAudioTrack() { |
| 769 localAudioTrack = factory.createAudioTrack( |
| 770 AUDIO_TRACK_ID, |
| 771 factory.createAudioSource(audioConstraints)); |
| 772 localAudioTrack.setEnabled(enableAudio); |
| 773 return localAudioTrack; |
| 774 } |
| 775 |
752 private VideoTrack createVideoTrack(VideoCapturerAndroid capturer) { | 776 private VideoTrack createVideoTrack(VideoCapturerAndroid capturer) { |
753 videoSource = factory.createVideoSource(capturer, videoConstraints); | 777 videoSource = factory.createVideoSource(capturer, videoConstraints); |
754 | 778 |
755 localVideoTrack = factory.createVideoTrack(VIDEO_TRACK_ID, videoSource); | 779 localVideoTrack = factory.createVideoTrack(VIDEO_TRACK_ID, videoSource); |
756 localVideoTrack.setEnabled(renderVideo); | 780 localVideoTrack.setEnabled(renderVideo); |
757 localVideoTrack.addRenderer(new VideoRenderer(localRender)); | 781 localVideoTrack.addRenderer(new VideoRenderer(localRender)); |
758 return localVideoTrack; | 782 return localVideoTrack; |
759 } | 783 } |
760 | 784 |
761 private static String setStartBitrate(String codec, boolean isVideoCodec, | 785 private static String setStartBitrate(String codec, boolean isVideoCodec, |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1108 public void onCreateFailure(final String error) { | 1132 public void onCreateFailure(final String error) { |
1109 reportError("createSDP error: " + error); | 1133 reportError("createSDP error: " + error); |
1110 } | 1134 } |
1111 | 1135 |
1112 @Override | 1136 @Override |
1113 public void onSetFailure(final String error) { | 1137 public void onSetFailure(final String error) { |
1114 reportError("setSDP error: " + error); | 1138 reportError("setSDP error: " + error); |
1115 } | 1139 } |
1116 } | 1140 } |
1117 } | 1141 } |
OLD | NEW |