123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- /* global $, JitsiMeetJS */
-
- var options = {
- hosts: {
- domain: 'jitsi-meet.example.com',
- muc: 'conference.jitsi-meet.example.com', // FIXME: use XEP-0030
- },
- bosh: '//jitsi-meet.example.com/http-bind', // FIXME: use xep-0156 for that
- clientNode: 'http://jitsi.org/jitsimeet', // The name of client node advertised in XEP-0115 'c' stanza
- };
-
- var confOptions = {
- openSctp: true
- };
-
- var isJoined = false;
-
- /**
- * Handles local tracks.
- * @param tracks Array with JitsiTrack objects
- */
- function onLocalTracks(tracks) {
- localTracks = tracks;
- for(var i = 0; i < localTracks.length; i++) {
- localTracks[i].addEventListener(JitsiMeetJS.events.track.TRACK_AUDIO_LEVEL_CHANGED,
- function(audioLevel) {
- console.log('Audio Level local: ' + audioLevel);
- });
- localTracks[i].addEventListener(JitsiMeetJS.events.track.TRACK_MUTE_CHANGED,
- function() {
- console.log('local track muted');
- });
- localTracks[i].addEventListener(JitsiMeetJS.events.track.LOCAL_TRACK_STOPPED,
- function() {
- console.log('local track stoped');
- });
- localTracks[i].addEventListener(JitsiMeetJS.events.track.TRACK_AUDIO_OUTPUT_CHANGED,
- function(deviceId) {
- console.log('track audio output device was changed to ' + deviceId);
- });
- if(localTracks[i].getType() == 'video') {
- $('body').append('<video autoplay=\'1\' id=\'localVideo' + i + '\' />');
- localTracks[i].attach($('#localVideo' + i)[0]);
- } else {
- $('body').append('<audio autoplay=\'1\' muted=\'true\' id=\'localAudio' + i + '\' />');
- localTracks[i].attach($('#localAudio' + i)[0]);
- }
- if(isJoined) {
- room.addTrack(localTracks[i]);
- }
- }
- }
-
- /**
- * Handles remote tracks
- * @param track JitsiTrack object
- */
- function onRemoteTrack(track) {
- if(track.isLocal()) {
- return;
- }
- var participant = track.getParticipantId();
- if(!remoteTracks[participant]) {
- remoteTracks[participant] = [];
- }
- var idx = remoteTracks[participant].push(track);
- track.addEventListener(JitsiMeetJS.events.track.TRACK_AUDIO_LEVEL_CHANGED,
- function(audioLevel) {
- console.log('Audio Level remote: ' + audioLevel);
- });
- track.addEventListener(JitsiMeetJS.events.track.TRACK_MUTE_CHANGED,
- function() {
- console.log('remote track muted');
- });
- track.addEventListener(JitsiMeetJS.events.track.LOCAL_TRACK_STOPPED,
- function() {
- console.log('remote track stoped');
- });
- track.addEventListener(JitsiMeetJS.events.track.TRACK_AUDIO_OUTPUT_CHANGED,
- function(deviceId) {
- console.log('track audio output device was changed to ' + deviceId);
- });
- var id = participant + track.getType() + idx;
- if(track.getType() == 'video') {
- $('body').append('<video autoplay=\'1\' id=\'' + participant + 'video' + idx + '\' />');
- } else {
- $('body').append('<audio autoplay=\'1\' id=\'' + participant + 'audio' + idx + '\' />');
- }
- track.attach($('#' + id)[0]);
- }
-
- /**
- * That function is executed when the conference is joined
- */
- function onConferenceJoined() {
- console.log('conference joined!');
- isJoined = true;
- for(var i = 0; i < localTracks.length; i++) {
- room.addTrack(localTracks[i]);
- }
- }
-
- function onUserLeft(id) {
- console.log('user left');
- if(!remoteTracks[id]) {
- return;
- }
- var tracks = remoteTracks[id];
- for(var i = 0; i < tracks.length; i++) {
- tracks[i].detach($('#' + id + tracks[i].getType()));
- }
- }
-
- /**
- * That function is called when connection is established successfully
- */
- function onConnectionSuccess() {
- room = connection.initJitsiConference('conference', confOptions);
- room.on(JitsiMeetJS.events.conference.TRACK_ADDED, onRemoteTrack);
- room.on(JitsiMeetJS.events.conference.TRACK_REMOVED, function(track) {
- console.log('track removed!!!' + track);
- });
- room.on(JitsiMeetJS.events.conference.CONFERENCE_JOINED, onConferenceJoined);
- room.on(JitsiMeetJS.events.conference.USER_JOINED, function(id) {
- console.log('user join'); remoteTracks[id] = [];
- });
- room.on(JitsiMeetJS.events.conference.USER_LEFT, onUserLeft);
- room.on(JitsiMeetJS.events.conference.TRACK_MUTE_CHANGED, function(track) {
- console.log(track.getType() + ' - ' + track.isMuted());
- });
- room.on(JitsiMeetJS.events.conference.DISPLAY_NAME_CHANGED, function(userID, displayName) {
- console.log(userID + ' - ' + displayName);
- });
- room.on(JitsiMeetJS.events.conference.TRACK_AUDIO_LEVEL_CHANGED,
- function(userID, audioLevel) {
- console.log(userID + ' - ' + audioLevel);
- });
- room.on(JitsiMeetJS.events.conference.RECORDER_STATE_CHANGED, function() {
- console.log(room.isRecordingSupported() + ' - '
- + room.getRecordingState() + ' - '
- + room.getRecordingURL());
- });
- room.on(JitsiMeetJS.events.conference.PHONE_NUMBER_CHANGED, function() {
- console.log(
- room.getPhoneNumber() + ' - '
- + room.getPhonePin());
- });
- room.join();
- }
-
- /**
- * This function is called when the connection fail.
- */
- function onConnectionFailed() {
- console.error('Connection Failed!');
- }
-
- /**
- * This function is called when the connection fail.
- */
- function onDeviceListChanged(devices) {
- console.info('current devices', devices);
- }
-
- /**
- * This function is called when we disconnect.
- */
- function disconnect() {
- console.log('disconnect!');
- connection.removeEventListener(JitsiMeetJS.events.connection.CONNECTION_ESTABLISHED, onConnectionSuccess);
- connection.removeEventListener(JitsiMeetJS.events.connection.CONNECTION_FAILED, onConnectionFailed);
- connection.removeEventListener(JitsiMeetJS.events.connection.CONNECTION_DISCONNECTED, disconnect);
- }
-
- function unload() {
- for(var i = 0; i < localTracks.length; i++) {
- localTracks[i].stop();
- }
- room.leave();
- connection.disconnect();
- }
-
- var isVideo = true;
- function switchVideo() { // eslint-disable-line no-unused-vars
- isVideo = !isVideo;
- if(localTracks[1]) {
- localTracks[1].dispose();
- localTracks.pop();
- }
- JitsiMeetJS.createLocalTracks({devices: isVideo ? ['video'] : ['desktop']})
- .then(function(tracks) {
- localTracks.push(tracks[0]);
- localTracks[1].addEventListener(JitsiMeetJS.events.track.TRACK_MUTE_CHANGED,
- function() {
- console.log('local track muted');
- });
- localTracks[1].addEventListener(JitsiMeetJS.events.track.LOCAL_TRACK_STOPPED,
- function() {
- console.log('local track stoped');
- });
- localTracks[1].attach($('#localVideo1')[0]);
- room.addTrack(localTracks[1]);
- }).catch(function(error) {
- console.log(error);
- });
- }
-
- function changeAudioOutput(selected) { // eslint-disable-line no-unused-vars
- JitsiMeetJS.mediaDevices.setAudioOutputDevice(selected.value);
- }
-
- $(window).bind('beforeunload', unload);
- $(window).bind('unload', unload);
-
- // JitsiMeetJS.setLogLevel(JitsiMeetJS.logLevels.ERROR);
- var initOptions = {
- disableAudioLevels: true,
- // The ID of the jidesha extension for Chrome.
- desktopSharingChromeExtId: 'mbocklcggfhnbahlnepmldehdhpjfcjp',
- // Whether desktop sharing should be disabled on Chrome.
- desktopSharingChromeDisabled: false,
- // The media sources to use when using screen sharing with the Chrome
- // extension.
- desktopSharingChromeSources: ['screen', 'window'],
- // Required version of Chrome extension
- desktopSharingChromeMinExtVersion: '0.1',
-
- // The ID of the jidesha extension for Firefox. If null, we assume that no
- // extension is required.
- desktopSharingFirefoxExtId: null,
- // Whether desktop sharing should be disabled on Firefox.
- desktopSharingFirefoxDisabled: true,
- // The maximum version of Firefox which requires a jidesha extension.
- // Example: if set to 41, we will require the extension for Firefox versions
- // up to and including 41. On Firefox 42 and higher, we will run without the
- // extension.
- // If set to -1, an extension will be required for all versions of Firefox.
- desktopSharingFirefoxMaxVersionExtRequired: -1,
- // The URL to the Firefox extension for desktop sharing.
- desktopSharingFirefoxExtensionURL: null
- };
- JitsiMeetJS.init(initOptions).then(function() {
- connection = new JitsiMeetJS.JitsiConnection(null, null, options);
-
- connection.addEventListener(JitsiMeetJS.events.connection.CONNECTION_ESTABLISHED, onConnectionSuccess);
- connection.addEventListener(JitsiMeetJS.events.connection.CONNECTION_FAILED, onConnectionFailed);
- connection.addEventListener(JitsiMeetJS.events.connection.CONNECTION_DISCONNECTED, disconnect);
-
- JitsiMeetJS.mediaDevices.addEventListener(JitsiMeetJS.events.mediaDevices.DEVICE_LIST_CHANGED, onDeviceListChanged);
-
- connection.connect();
- JitsiMeetJS.createLocalTracks({devices: ['audio', 'video']})
- .then(onLocalTracks).catch(function(error) {
- throw error;
- });
- }).catch(function(error) {
- console.log(error);
- });
-
- if (JitsiMeetJS.mediaDevices.isDeviceChangeAvailable('output')) {
- JitsiMeetJS.mediaDevices.enumerateDevices(function(devices) {
- var audioOutputDevices = devices.filter(function(d) {
- return d.kind === 'audiooutput';
- });
-
- if (audioOutputDevices.length > 1) {
- $('#audioOutputSelect').html(
- audioOutputDevices.map(function(d) {
- return '<option value="' + d.deviceId + '">' + d.label + '</option>';
- }).join('\n')
- );
-
- $('#audioOutputSelectWrapper').show();
- }
- });
- }
-
- var connection = null;
- var room = null;
- var localTracks = [];
- var remoteTracks = {};
|