您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

desktopsharing.js 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /* global APP, JitsiMeetJS, config */
  2. var EventEmitter = require("events");
  3. import DSEvents from '../../service/desktopsharing/DesktopSharingEventTypes';
  4. const TrackEvents = JitsiMeetJS.events.track;
  5. /**
  6. * Indicates that desktop stream is currently in use (for toggle purpose).
  7. * @type {boolean}
  8. */
  9. var isUsingScreenStream = false;
  10. /**
  11. * Indicates that switch stream operation is in progress and prevent from
  12. * triggering new events.
  13. * @type {boolean}
  14. */
  15. var switchInProgress = false;
  16. /**
  17. * true if desktop sharing is enabled and false otherwise.
  18. */
  19. var isEnabled = false;
  20. var eventEmitter = new EventEmitter();
  21. function streamSwitchDone() {
  22. switchInProgress = false;
  23. eventEmitter.emit(DSEvents.SWITCHING_DONE, isUsingScreenStream);
  24. }
  25. function newStreamCreated(track) {
  26. eventEmitter.emit(DSEvents.NEW_STREAM_CREATED, track, streamSwitchDone);
  27. }
  28. function getVideoStreamFailed() {
  29. console.error("Failed to obtain the stream to switch to");
  30. switchInProgress = false;
  31. isUsingScreenStream = false;
  32. newStreamCreated(null);
  33. }
  34. function getDesktopStreamFailed() {
  35. console.error("Failed to obtain the stream to switch to");
  36. switchInProgress = false;
  37. }
  38. function onEndedHandler() {
  39. if (!switchInProgress && isUsingScreenStream) {
  40. APP.desktopsharing.toggleScreenSharing();
  41. }
  42. }
  43. module.exports = {
  44. isUsingScreenStream: function () {
  45. return isUsingScreenStream;
  46. },
  47. /**
  48. * Initializes the desktop sharing module.
  49. * @param {boolean} <tt>true</tt> if desktop sharing feature is available
  50. * and enabled.
  51. */
  52. init: function (enabled) {
  53. isEnabled = enabled;
  54. },
  55. /**
  56. * @returns {boolean} <tt>true</tt> if desktop sharing feature is available
  57. * and enabled.
  58. */
  59. isDesktopSharingEnabled: function () {
  60. return isEnabled;
  61. },
  62. addListener: function (type, listener) {
  63. eventEmitter.on(type, listener);
  64. },
  65. removeListener: function (type, listener) {
  66. eventEmitter.removeListener(type, listener);
  67. },
  68. /*
  69. * Toggles screen sharing.
  70. */
  71. toggleScreenSharing: function () {
  72. if (switchInProgress) {
  73. console.warn("Switch in progress.");
  74. return;
  75. } else if (!this.isDesktopSharingEnabled()) {
  76. console.warn("Cannot toggle screen sharing: not supported.");
  77. return;
  78. }
  79. switchInProgress = true;
  80. let type;
  81. if (!isUsingScreenStream) {
  82. // Switch to desktop stream
  83. type = "desktop";
  84. } else {
  85. type = "video";
  86. }
  87. APP.createLocalTracks(type).then(function (tracks) {
  88. if (!tracks.length) {
  89. if (type === 'desktop') {
  90. getDesktopStreamFailed();
  91. } else {
  92. getVideoStreamFailed();
  93. }
  94. return;
  95. }
  96. let stream = tracks[0];
  97. // We now use screen stream
  98. isUsingScreenStream = type === "desktop";
  99. if (isUsingScreenStream) {
  100. stream.on(TrackEvents.TRACK_STOPPED, onEndedHandler);
  101. }
  102. newStreamCreated(stream);
  103. });
  104. },
  105. /*
  106. * Exports the event emitter to allow use by ScreenObtainer. Not for outside
  107. * use.
  108. */
  109. eventEmitter: eventEmitter
  110. };