189 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Diff
		
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Diff
		
	
	
| diff --git a/syweb/webclient/app/components/matrix/matrix-call.js b/syweb/webclient/app/components/matrix/matrix-call.js
 | |
| index 9fbfff0..dc68077 100644
 | |
| --- a/syweb/webclient/app/components/matrix/matrix-call.js
 | |
| +++ b/syweb/webclient/app/components/matrix/matrix-call.js
 | |
| @@ -16,6 +16,45 @@ limitations under the License.
 | |
|  
 | |
|  'use strict';
 | |
|  
 | |
| +
 | |
| +function sendKeyframe(pc) {
 | |
| +    console.log('sendkeyframe', pc.iceConnectionState);
 | |
| +    if (pc.iceConnectionState !== 'connected') return; // safe...
 | |
| +    pc.setRemoteDescription(
 | |
| +        pc.remoteDescription,
 | |
| +        function () {
 | |
| +            pc.createAnswer(
 | |
| +                function (modifiedAnswer) {
 | |
| +                    pc.setLocalDescription(
 | |
| +                        modifiedAnswer,
 | |
| +                        function () {
 | |
| +                            // noop
 | |
| +                        },
 | |
| +                        function (error) {
 | |
| +                            console.log('triggerKeyframe setLocalDescription failed', error);
 | |
| +                            messageHandler.showError();
 | |
| +                        }
 | |
| +                    );
 | |
| +                },
 | |
| +                function (error) {
 | |
| +                    console.log('triggerKeyframe createAnswer failed', error);
 | |
| +                    messageHandler.showError();
 | |
| +                }
 | |
| +            );
 | |
| +        },
 | |
| +        function (error) {
 | |
| +            console.log('triggerKeyframe setRemoteDescription failed', error);
 | |
| +            messageHandler.showError();
 | |
| +        }
 | |
| +    );
 | |
| +} 
 | |
| +
 | |
| +
 | |
| +
 | |
| +
 | |
| +
 | |
| +
 | |
| +
 | |
|  var forAllVideoTracksOnStream = function(s, f) {
 | |
|      var tracks = s.getVideoTracks();
 | |
|      for (var i = 0; i < tracks.length; i++) {
 | |
| @@ -83,7 +122,7 @@ angular.module('MatrixCall', [])
 | |
|      }
 | |
|  
 | |
|      // FIXME: we should prevent any calls from being placed or accepted before this has finished
 | |
| -    MatrixCall.getTurnServer();
 | |
| +    //MatrixCall.getTurnServer();
 | |
|  
 | |
|      MatrixCall.CALL_TIMEOUT = 60000;
 | |
|      MatrixCall.FALLBACK_STUN_SERVER = 'stun:stun.l.google.com:19302';
 | |
| @@ -132,6 +171,22 @@ angular.module('MatrixCall', [])
 | |
|          pc.onsignalingstatechange = function() { self.onSignallingStateChanged(); };
 | |
|          pc.onicecandidate = function(c) { self.gotLocalIceCandidate(c); };
 | |
|          pc.onaddstream = function(s) { self.onAddStream(s); };
 | |
| +
 | |
| +        var datachan = pc.createDataChannel('RTCDataChannel', {
 | |
| +            reliable: false
 | |
| +        });
 | |
| +        console.log("data chan: "+datachan);
 | |
| +        datachan.onopen = function() {
 | |
| +            console.log("data channel open");
 | |
| +        };
 | |
| +        datachan.onmessage = function() {
 | |
| +            console.log("data channel message");
 | |
| +        };
 | |
| +        pc.ondatachannel = function(event) {
 | |
| +            console.log("have data channel");
 | |
| +            event.channel.binaryType = 'blob';
 | |
| +        };
 | |
| +
 | |
|          return pc;
 | |
|      }
 | |
|  
 | |
| @@ -200,6 +255,12 @@ angular.module('MatrixCall', [])
 | |
|          }, this.msg.lifetime - event.age);
 | |
|      };
 | |
|  
 | |
| +    MatrixCall.prototype.receivedInvite = function(event) {
 | |
| +        console.log("Got second invite for call "+this.call_id);
 | |
| +        this.peerConn.setRemoteDescription(new RTCSessionDescription(this.msg.offer), this.onSetRemoteDescriptionSuccess, this.onSetRemoteDescriptionError);
 | |
| +    };
 | |
| +    
 | |
| +
 | |
|      // perverse as it may seem, sometimes we want to instantiate a call with a hangup message
 | |
|      // (because when getting the state of the room on load, events come in reverse order and
 | |
|      // we want to remember that a call has been hung up)
 | |
| @@ -349,7 +410,7 @@ angular.module('MatrixCall', [])
 | |
|              'mandatory': {
 | |
|                  'OfferToReceiveAudio': true,
 | |
|                  'OfferToReceiveVideo': this.type == 'video'
 | |
| -            },
 | |
| +            }
 | |
|          };
 | |
|          this.peerConn.createAnswer(function(d) { self.createdAnswer(d); }, function(e) {}, constraints);
 | |
|          // This can't be in an apply() because it's called by a predecessor call under glare conditions :(
 | |
| @@ -359,8 +420,20 @@ angular.module('MatrixCall', [])
 | |
|      MatrixCall.prototype.gotLocalIceCandidate = function(event) {
 | |
|          if (event.candidate) {
 | |
|              console.log("Got local ICE "+event.candidate.sdpMid+" candidate: "+event.candidate.candidate);
 | |
| -            this.sendCandidate(event.candidate);
 | |
| -        }
 | |
| +            //this.sendCandidate(event.candidate);
 | |
| +        } else {
 | |
| +            console.log("have all candidates, sending answer");
 | |
| +            var content = {
 | |
| +                version: 0,
 | |
| +                call_id: this.call_id,
 | |
| +                answer: this.peerConn.localDescription
 | |
| +            };
 | |
| +            this.sendEventWithRetry('m.call.answer', content);
 | |
| +            var self = this;
 | |
| +            $rootScope.$apply(function() {
 | |
| +                self.state = 'connecting';
 | |
| +            });
 | |
| +	}
 | |
|      }
 | |
|  
 | |
|      MatrixCall.prototype.gotRemoteIceCandidate = function(cand) {
 | |
| @@ -418,15 +491,6 @@ angular.module('MatrixCall', [])
 | |
|          console.log("Created answer: "+description);
 | |
|          var self = this;
 | |
|          this.peerConn.setLocalDescription(description, function() {
 | |
| -            var content = {
 | |
| -                version: 0,
 | |
| -                call_id: self.call_id,
 | |
| -                answer: self.peerConn.localDescription
 | |
| -            };
 | |
| -            self.sendEventWithRetry('m.call.answer', content);
 | |
| -            $rootScope.$apply(function() {
 | |
| -                self.state = 'connecting';
 | |
| -            });
 | |
|          }, function() { console.log("Error setting local description!"); } );
 | |
|      };
 | |
|  
 | |
| @@ -448,6 +512,9 @@ angular.module('MatrixCall', [])
 | |
|              $rootScope.$apply(function() {
 | |
|                  self.state = 'connected';
 | |
|                  self.didConnect = true;
 | |
| +		/*$timeout(function() {
 | |
| +                    sendKeyframe(self.peerConn);
 | |
| +                }, 1000);*/
 | |
|              });
 | |
|          } else if (this.peerConn.iceConnectionState == 'failed') {
 | |
|              this.hangup('ice_failed');
 | |
| @@ -518,6 +585,7 @@ angular.module('MatrixCall', [])
 | |
|  
 | |
|      MatrixCall.prototype.onRemoteStreamEnded = function(event) {
 | |
|          console.log("Remote stream ended");
 | |
| +        return;
 | |
|          var self = this;
 | |
|          $rootScope.$apply(function() {
 | |
|              self.state = 'ended';
 | |
| diff --git a/syweb/webclient/app/components/matrix/matrix-phone-service.js b/syweb/webclient/app/components/matrix/matrix-phone-service.js
 | |
| index 55dbbf5..272fa27 100644
 | |
| --- a/syweb/webclient/app/components/matrix/matrix-phone-service.js
 | |
| +++ b/syweb/webclient/app/components/matrix/matrix-phone-service.js
 | |
| @@ -48,6 +48,13 @@ angular.module('matrixPhoneService', [])
 | |
|                  return;
 | |
|              }
 | |
|  
 | |
| +            // do we already have an entry for this call ID?
 | |
| +            var existingEntry = matrixPhoneService.allCalls[msg.call_id];
 | |
| +            if (existingEntry) {
 | |
| +                 existingEntry.receivedInvite(msg);
 | |
| +                 return;
 | |
| +            }
 | |
| +
 | |
|              var call = undefined;
 | |
|              if (!isLive) {
 | |
|                  // if this event wasn't live then this call may already be over
 | |
| @@ -108,7 +115,7 @@ angular.module('matrixPhoneService', [])
 | |
|                      call.hangup();
 | |
|                  }
 | |
|              } else {
 | |
| -                $rootScope.$broadcast(matrixPhoneService.INCOMING_CALL_EVENT, call);
 | |
| +                 $rootScope.$broadcast(matrixPhoneService.INCOMING_CALL_EVENT, call);
 | |
|              }
 | |
|          } else if (event.type == 'm.call.answer') {
 | |
|              var call = matrixPhoneService.allCalls[msg.call_id];
 |