123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /* global APP, config */
- var EventEmitter = require("events");
- var DesktopSharingEventTypes
- = require("../../service/desktopsharing/DesktopSharingEventTypes");
- var RTCBrowserType = require("../RTC/RTCBrowserType");
- var RTCEvents = require("../../service/RTC/RTCEvents");
- var ScreenObtainer = require("./ScreenObtainer");
-
- /**
- * Indicates that desktop stream is currently in use (for toggle purpose).
- * @type {boolean}
- */
- var isUsingScreenStream = false;
-
- /**
- * Indicates that switch stream operation is in progress and prevent from
- * triggering new events.
- * @type {boolean}
- */
- var switchInProgress = false;
-
- /**
- * Used to obtain the screen sharing stream from the browser.
- */
- var screenObtainer = new ScreenObtainer();
-
- var eventEmitter = new EventEmitter();
-
- function streamSwitchDone() {
- switchInProgress = false;
- eventEmitter.emit(
- DesktopSharingEventTypes.SWITCHING_DONE,
- isUsingScreenStream);
- }
-
- function newStreamCreated(stream) {
- eventEmitter.emit(DesktopSharingEventTypes.NEW_STREAM_CREATED,
- stream, isUsingScreenStream, streamSwitchDone);
- }
-
- function getVideoStreamFailed(error) {
- console.error("Failed to obtain the stream to switch to", error);
- switchInProgress = false;
- isUsingScreenStream = false;
- newStreamCreated(null);
- }
-
- function getDesktopStreamFailed(error) {
- console.error("Failed to obtain the stream to switch to", error);
- switchInProgress = false;
- }
-
- function onEndedHandler(stream) {
- if (!switchInProgress && isUsingScreenStream) {
- APP.desktopsharing.toggleScreenSharing();
- }
- //FIXME: to be verified
- if (stream.removeEventListener) {
- stream.removeEventListener('ended', onEndedHandler);
- } else {
- stream.detachEvent('ended', onEndedHandler);
- }
- }
-
- module.exports = {
- isUsingScreenStream: function () {
- return isUsingScreenStream;
- },
-
- /**
- * @returns {boolean} <tt>true</tt> if desktop sharing feature is available
- * and enabled.
- */
- isDesktopSharingEnabled: function () {
- return screenObtainer.isSupported();
- },
-
- init: function () {
- // Called when RTC finishes initialization
- APP.RTC.addListener(RTCEvents.RTC_READY,
- function() {
- screenObtainer.init(eventEmitter);
- eventEmitter.emit(DesktopSharingEventTypes.INIT);
- });
- },
-
- addListener: function (type, listener) {
- eventEmitter.on(type, listener);
- },
-
- removeListener: function (type, listener) {
- eventEmitter.removeListener(type, listener);
- },
-
- /*
- * Toggles screen sharing.
- */
- toggleScreenSharing: function () {
- if (switchInProgress) {
- console.warn("Switch in progress.");
- return;
- } else if (!screenObtainer.isSupported()) {
- console.warn("Cannot toggle screen sharing: not supported.");
- return;
- }
- switchInProgress = true;
-
- if (!isUsingScreenStream) {
- // Switch to desktop stream
- screenObtainer.obtainStream(
- function (stream) {
- // We now use screen stream
- isUsingScreenStream = true;
- // Hook 'ended' event to restore camera
- // when screen stream stops
- //FIXME: to be verified
- if (stream.addEventListener) {
- stream.addEventListener('ended', function () {
- onEndedHandler(stream);
- });
- } else {
- stream.attachEvent('ended', function () {
- onEndedHandler(stream);
- });
- }
- newStreamCreated(stream);
- },
- getDesktopStreamFailed);
- } else {
- // Disable screen stream
- APP.RTC.getUserMediaWithConstraints(
- ['video'],
- function (stream) {
- // We are now using camera stream
- isUsingScreenStream = false;
- newStreamCreated(stream);
- },
- getVideoStreamFailed,
- config.resolution || '360'
- );
- }
- },
- /*
- * Exports the event emitter to allow use by ScreenObtainer. Not for outside
- * use.
- */
- eventEmitter: eventEmitter
- };
|