Преглед на файлове

Merge pull request #538 from jitsi/remote_control

Remote control
dev1
virtuacoplenny преди 8 години
родител
ревизия
cac41a6057
променени са 3 файла, в които са добавени 74 реда и са изтрити 29 реда
  1. 3
    1
      modules/RTC/JitsiLocalTrack.js
  2. 6
    3
      modules/RTC/RTCUtils.js
  3. 65
    25
      modules/RTC/ScreenObtainer.js

+ 3
- 1
modules/RTC/JitsiLocalTrack.js Целия файл

73
             resolution,
73
             resolution,
74
             deviceId,
74
             deviceId,
75
             facingMode,
75
             facingMode,
76
-            sourceId
76
+            sourceId,
77
+            sourceType
77
         } = trackInfo;
78
         } = trackInfo;
78
 
79
 
79
         super(
80
         super(
97
         this.dontFireRemoveEvent = false;
98
         this.dontFireRemoveEvent = false;
98
         this.resolution = resolution;
99
         this.resolution = resolution;
99
         this.sourceId = sourceId;
100
         this.sourceId = sourceId;
101
+        this.sourceType = sourceType;
100
 
102
 
101
         // FIXME: currently firefox is ignoring our constraints about
103
         // FIXME: currently firefox is ignoring our constraints about
102
         // resolutions so we do not store it, to avoid wrong reporting of local
104
         // resolutions so we do not store it, to avoid wrong reporting of local

+ 6
- 3
modules/RTC/RTCUtils.js Целия файл

629
     }
629
     }
630
 
630
 
631
     if (desktopStream) {
631
     if (desktopStream) {
632
-        const { stream, sourceId } = desktopStream;
632
+        const { stream, sourceId, sourceType } = desktopStream;
633
 
633
 
634
         res.push({
634
         res.push({
635
             stream,
635
             stream,
636
             sourceId,
636
             sourceId,
637
+            sourceType,
637
             track: stream.getVideoTracks()[0],
638
             track: stream.getVideoTracks()[0],
638
             mediaType: MediaType.VIDEO,
639
             mediaType: MediaType.VIDEO,
639
             videoType: VideoType.DESKTOP
640
             videoType: VideoType.DESKTOP
1061
     obtainAudioAndVideoPermissions(options = {}) {
1062
     obtainAudioAndVideoPermissions(options = {}) {
1062
         const self = this;
1063
         const self = this;
1063
 
1064
 
1064
-        const dsOptions = options.desktopSharingExtensionExternalInstallation;
1065
-
1065
+        const dsOptions = {
1066
+            ...options.desktopSharingExtensionExternalInstallation,
1067
+            desktopSharingSources: options.desktopSharingSources
1068
+        };
1066
 
1069
 
1067
         return new Promise((resolve, reject) => {
1070
         return new Promise((resolve, reject) => {
1068
             const successCallback = function(stream) {
1071
             const successCallback = function(stream) {

+ 65
- 25
modules/RTC/ScreenObtainer.js Целия файл

116
                     });
116
                     });
117
             };
117
             };
118
         } else if (RTCBrowserType.isElectron()) {
118
         } else if (RTCBrowserType.isElectron()) {
119
-            obtainDesktopStream = (_, onSuccess, onFailure) => {
120
-                if (window.JitsiMeetScreenObtainer
121
-                    && window.JitsiMeetScreenObtainer.openDesktopPicker) {
122
-                    window.JitsiMeetScreenObtainer.openDesktopPicker(
123
-                        streamId =>
124
-                            onGetStreamResponse(
125
-                                { streamId },
126
-                                onSuccess,
127
-                                onFailure
128
-                            ),
129
-                        err => onFailure(new JitsiTrackError(
130
-                            JitsiTrackErrors.ELECTRON_DESKTOP_PICKER_ERROR,
131
-                            err
132
-                        ))
133
-                    );
134
-                } else {
135
-                    onFailure(new JitsiTrackError(
136
-                        JitsiTrackErrors.ELECTRON_DESKTOP_PICKER_NOT_FOUND));
137
-                }
138
-            };
119
+            obtainDesktopStream = this.obtainScreenOnElectron;
139
         } else if (RTCBrowserType.isTemasysPluginUsed()) {
120
         } else if (RTCBrowserType.isTemasysPluginUsed()) {
140
             // XXX Don't require Temasys unless it's to be used because it
121
             // XXX Don't require Temasys unless it's to be used because it
141
             // doesn't run on React Native, for example.
122
             // doesn't run on React Native, for example.
256
             new JitsiTrackError(JitsiTrackErrors.FIREFOX_EXTENSION_NEEDED));
237
             new JitsiTrackError(JitsiTrackErrors.FIREFOX_EXTENSION_NEEDED));
257
     },
238
     },
258
 
239
 
240
+    /**
241
+     * Obtains a screen capture stream on Electron.
242
+     *
243
+     * @param {Object} [options] - Screen sharing options.
244
+     * @param {Array<string>} [options.desktopSharingSources] - Array with the
245
+     * sources that have to be displayed in the desktop picker window ('screen',
246
+     * 'window', etc.).
247
+     * @param onSuccess - Success callback.
248
+     * @param onFailure - Failure callback.
249
+     */
250
+    obtainScreenOnElectron(options = {}, onSuccess, onFailure) {
251
+        if (window.JitsiMeetScreenObtainer
252
+            && window.JitsiMeetScreenObtainer.openDesktopPicker) {
253
+            window.JitsiMeetScreenObtainer.openDesktopPicker(
254
+                {
255
+                    desktopSharingSources:
256
+                        options.desktopSharingSources
257
+                            || this.options.desktopSharingChromeSources
258
+                },
259
+                (streamId, streamType) =>
260
+                    onGetStreamResponse(
261
+                        {
262
+                            streamId,
263
+                            streamType
264
+                        },
265
+                        onSuccess,
266
+                        onFailure
267
+                    ),
268
+                err => onFailure(new JitsiTrackError(
269
+                    JitsiTrackErrors.ELECTRON_DESKTOP_PICKER_ERROR,
270
+                    err
271
+                ))
272
+            );
273
+        } else {
274
+            onFailure(new JitsiTrackError(
275
+                JitsiTrackErrors.ELECTRON_DESKTOP_PICKER_NOT_FOUND));
276
+        }
277
+    },
278
+
259
     /**
279
     /**
260
      * Asks Chrome extension to call chooseDesktopMedia and gets chrome
280
      * Asks Chrome extension to call chooseDesktopMedia and gets chrome
261
      * 'desktop' stream for returned stream token.
281
      * 'desktop' stream for returned stream token.
262
      */
282
      */
263
     obtainScreenFromExtension(options, streamCallback, failCallback) {
283
     obtainScreenFromExtension(options, streamCallback, failCallback) {
284
+        const {
285
+            desktopSharingChromeExtId,
286
+            desktopSharingChromeSources
287
+        } = this.options;
288
+
289
+        const gumOptions = {
290
+            desktopSharingChromeExtId,
291
+            desktopSharingChromeSources:
292
+                options.desktopSharingSources
293
+                    || desktopSharingChromeSources
294
+        };
295
+
264
         if (chromeExtInstalled) {
296
         if (chromeExtInstalled) {
265
-            doGetStreamFromExtension(this.options, streamCallback,
297
+            doGetStreamFromExtension(
298
+                gumOptions,
299
+                streamCallback,
266
                 failCallback);
300
                 failCallback);
267
         } else {
301
         } else {
268
             if (chromeExtUpdateRequired) {
302
             if (chromeExtUpdateRequired) {
285
                         // available.
319
                         // available.
286
                         waitForExtensionAfterInstall(this.options, 200, 10)
320
                         waitForExtensionAfterInstall(this.options, 200, 10)
287
                             .then(() => {
321
                             .then(() => {
288
-                                doGetStreamFromExtension(this.options,
289
-                                    streamCallback, failCallback);
322
+                                doGetStreamFromExtension(
323
+                                    gumOptions,
324
+                                    streamCallback,
325
+                                    failCallback);
290
                             })
326
                             })
291
                             .catch(() => {
327
                             .catch(() => {
292
                                 this.handleExtensionInstallationError(options,
328
                                 this.handleExtensionInstallationError(options,
570
  * @param {Function} onSuccess - callback for success.
606
  * @param {Function} onSuccess - callback for success.
571
  * @param {Function} onFailure - callback for failure.
607
  * @param {Function} onFailure - callback for failure.
572
  */
608
  */
573
-function onGetStreamResponse({ streamId, error }, onSuccess, onFailure) {
609
+function onGetStreamResponse(
610
+        { streamId, streamType, error },
611
+        onSuccess,
612
+        onFailure) {
574
     if (streamId) {
613
     if (streamId) {
575
         gumFunction(
614
         gumFunction(
576
             [ 'desktop' ],
615
             [ 'desktop' ],
577
             stream => onSuccess({
616
             stream => onSuccess({
578
                 stream,
617
                 stream,
579
-                sourceId: streamId
618
+                sourceId: streamId,
619
+                sourceType: streamType
580
             }),
620
             }),
581
             onFailure,
621
             onFailure,
582
             { desktopStream: streamId });
622
             { desktopStream: streamId });

Loading…
Отказ
Запис