From ceea7b7ed6400f7c437feb361f315b74ae57a0a1 Mon Sep 17 00:00:00 2001 From: gcampes <gabrieldecampes@gmail.com> Date: Thu, 12 Oct 2017 09:50:23 -0300 Subject: [PATCH] Implements audio transfer from echo test --- .../api/2.0/audio/client/bridge/sip.js | 33 ++++++++++++++++++- .../audio/audio-modal/container.jsx | 3 +- .../components/audio/audio-test/container.jsx | 2 +- .../imports/ui/components/audio/service.js | 3 ++ .../ui/services/audio-manager/index.js | 9 +++++ 5 files changed, 46 insertions(+), 4 deletions(-) diff --git a/bigbluebutton-html5/imports/api/2.0/audio/client/bridge/sip.js b/bigbluebutton-html5/imports/api/2.0/audio/client/bridge/sip.js index 11d4d1269c..8b1ec01a05 100644 --- a/bigbluebutton-html5/imports/api/2.0/audio/client/bridge/sip.js +++ b/bigbluebutton-html5/imports/api/2.0/audio/client/bridge/sip.js @@ -1,4 +1,6 @@ import BaseAudioBridge from './base'; +import { Tracker } from 'meteor/tracker'; +import VoiceUsers from '/imports/api/2.0/voice-users'; const STUN_TURN_FETCH_URL = Meteor.settings.public.media.stunTurnServersFetchAddress; const MEDIA_TAG = Meteor.settings.public.media.mediaTag; @@ -66,7 +68,7 @@ export default class SIPBridge extends BaseAudioBridge { joinAudio({ isListenOnly, extension, inputStream }, managerCallback) { return new Promise((resolve, reject) => { - const callExtension = extension || this.userData.voiceBridge; + const callExtension = extension + this.userData.voiceBridge || this.userData.voiceBridge; const callback = (message) => { managerCallback(message).then(resolve); @@ -82,6 +84,32 @@ export default class SIPBridge extends BaseAudioBridge { }); } + transferCall(onTransferStart, onTransferSuccess) { + return new Promise((resolve) => { + onTransferStart(); + this.currentSession.dtmf(1); + + Tracker.autorun((c) => { + const selector = { meetingId: this.userData.meetingId, intId: this.userData.userId }; + const query = VoiceUsers.find(selector); + console.log(selector); + window.Kappa = query; + + query.observeChanges({ + changed: (id, fields) => { + console.log('changed', fields); + if (fields.joined) { + console.log('LUL', fields.joined); + onTransferSuccess(); + c.stop(); + resolve(); + } + }, + }); + }); + }) + } + exitAudio() { return new Promise((resolve) => { this.currentSession.on('bye', () => { @@ -119,6 +147,9 @@ export default class SIPBridge extends BaseAudioBridge { this.userAgent = new window.SIP.UA({ uri: `sip:${encodeURIComponent(username)}@${server}`, wsServers: `${(protocol === 'https:' ? 'wss://' : 'ws://')}${server}/ws`, + log: { + builtinEnabled: false, + }, displayName: username, register: false, traceSip: true, diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx index bb0f6df2bd..71829e62cb 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-modal/container.jsx @@ -13,8 +13,7 @@ export default withModalMounter(createContainer(({ mountModal }) => }, joinMicrophone: () => { console.log('JOIN MIC FROM CONTAINER'); - Service.exitAudio().then(() => Service.joinMicrophone()) - .then(() => mountModal(null)); + Service.transferCall().then(() => mountModal(null)); }, joinListenOnly: () => { Service.joinListenOnly().then(() => mountModal(null)) diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-test/container.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-test/container.jsx index 088fa1c7b3..4db17c5389 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-test/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-test/container.jsx @@ -14,7 +14,7 @@ export default createContainer(() => ({ handlePlayAudioSample: (deviceId) => { console.log('handle play audio sample', deviceId); const sound = new Audio('resources/sounds/audioSample.mp3'); - sound.setSinkId(deviceId); + if (deviceId) sound.setSinkId(deviceId); sound.play(); }, }), AudioTestContainer); diff --git a/bigbluebutton-html5/imports/ui/components/audio/service.js b/bigbluebutton-html5/imports/ui/components/audio/service.js index 007682bab3..9c5f76a79a 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/service.js +++ b/bigbluebutton-html5/imports/ui/components/audio/service.js @@ -5,6 +5,7 @@ import Meetings from '/imports/api/2.0/meetings'; const init = () => { console.log('Running audio service init.'); + const meetingId = Auth.meetingID; const userId = Auth.userID; const sessionToken = Auth.sessionToken; const User = Users.findOne({ userId }); @@ -16,6 +17,7 @@ const init = () => { const microphoneLockEnforced = false; const userData = { + meetingId, userId, sessionToken, username, @@ -29,6 +31,7 @@ const init = () => { export default { init, exitAudio: () => AudioManager.exitAudio(), + transferCall: () => AudioManager.transferCall(), joinListenOnly: () => AudioManager.joinAudio({ isListenOnly: true }), joinMicrophone: () => AudioManager.joinAudio(), joinEchoTest: () => AudioManager.joinAudio({ isEchoTest: true }), diff --git a/bigbluebutton-html5/imports/ui/services/audio-manager/index.js b/bigbluebutton-html5/imports/ui/services/audio-manager/index.js index eb60fa0f12..3a7c20e558 100644 --- a/bigbluebutton-html5/imports/ui/services/audio-manager/index.js +++ b/bigbluebutton-html5/imports/ui/services/audio-manager/index.js @@ -110,6 +110,10 @@ class AudioManager { return this.bridge.exitAudio() } + transferCall() { + return this.bridge.transferCall(this.onTransferStart.bind(this), this.onAudioJoin.bind(this)); + } + toggleMuteMicrophone() { console.log('toggleMuteMicrophone', this); makeCall('toggleSelfVoice').then((res) => { @@ -137,6 +141,11 @@ class AudioManager { console.log('onAudioJoin', this); } + onTransferStart() { + this.isEchoTest = false; + this.isConnecting = true; + } + onAudioExit() { this.isConnected = false; this.isConnecting = false; -- GitLab