|
|
@@ -3,6 +3,7 @@ import {
|
|
3
|
3
|
sendAnalytics
|
|
4
|
4
|
} from '../../analytics';
|
|
5
|
5
|
import { JitsiTrackErrors, JitsiTrackEvents } from '../lib-jitsi-meet';
|
|
|
6
|
+import { showErrorNotification, showNotification } from '../../notifications';
|
|
6
|
7
|
import {
|
|
7
|
8
|
CAMERA_FACING_MODE,
|
|
8
|
9
|
MEDIA_TYPE,
|
|
|
@@ -17,11 +18,12 @@ import {
|
|
17
|
18
|
TRACK_ADDED,
|
|
18
|
19
|
TRACK_CREATE_CANCELED,
|
|
19
|
20
|
TRACK_CREATE_ERROR,
|
|
|
21
|
+ TRACK_NO_DATA_FROM_SOURCE,
|
|
20
|
22
|
TRACK_REMOVED,
|
|
21
|
23
|
TRACK_UPDATED,
|
|
22
|
24
|
TRACK_WILL_CREATE
|
|
23
|
25
|
} from './actionTypes';
|
|
24
|
|
-import { createLocalTracksF, getLocalTrack, getLocalTracks } from './functions';
|
|
|
26
|
+import { createLocalTracksF, getLocalTrack, getLocalTracks, getTrackByJitsiTrack } from './functions';
|
|
25
|
27
|
|
|
26
|
28
|
const logger = require('jitsi-meet-logger').getLogger(__filename);
|
|
27
|
29
|
|
|
|
@@ -189,6 +191,55 @@ export function destroyLocalTracks() {
|
|
189
|
191
|
};
|
|
190
|
192
|
}
|
|
191
|
193
|
|
|
|
194
|
+/**
|
|
|
195
|
+ * Signals that the passed JitsiLocalTrack has triggered a no data from source event.
|
|
|
196
|
+ *
|
|
|
197
|
+ * @param {JitsiLocalTrack} track - The track.
|
|
|
198
|
+ * @returns {{
|
|
|
199
|
+* type: TRACK_NO_DATA_FROM_SOURCE,
|
|
|
200
|
+* track: Track
|
|
|
201
|
+* }}
|
|
|
202
|
+*/
|
|
|
203
|
+export function noDataFromSource(track) {
|
|
|
204
|
+ return {
|
|
|
205
|
+ type: TRACK_NO_DATA_FROM_SOURCE,
|
|
|
206
|
+ track
|
|
|
207
|
+ };
|
|
|
208
|
+}
|
|
|
209
|
+
|
|
|
210
|
+/**
|
|
|
211
|
+ * Displays a no data from source video error if needed.
|
|
|
212
|
+ *
|
|
|
213
|
+ * @param {JitsiLocalTrack} jitsiTrack - The track.
|
|
|
214
|
+ * @returns {Function}
|
|
|
215
|
+ */
|
|
|
216
|
+export function showNoDataFromSourceVideoError(jitsiTrack) {
|
|
|
217
|
+ return (dispatch, getState) => {
|
|
|
218
|
+ let notificationInfo;
|
|
|
219
|
+
|
|
|
220
|
+ const track = getTrackByJitsiTrack(getState()['features/base/tracks'], jitsiTrack);
|
|
|
221
|
+
|
|
|
222
|
+ if (!track) {
|
|
|
223
|
+ return;
|
|
|
224
|
+ }
|
|
|
225
|
+
|
|
|
226
|
+ if (track.isReceivingData) {
|
|
|
227
|
+ notificationInfo = undefined;
|
|
|
228
|
+ } else {
|
|
|
229
|
+ const notificationAction = showErrorNotification({
|
|
|
230
|
+ descriptionKey: 'dialog.cameraNotSendingData',
|
|
|
231
|
+ titleKey: 'dialog.cameraNotSendingDataTitle'
|
|
|
232
|
+ });
|
|
|
233
|
+
|
|
|
234
|
+ dispatch(notificationAction);
|
|
|
235
|
+ notificationInfo = {
|
|
|
236
|
+ uid: notificationAction.uid
|
|
|
237
|
+ };
|
|
|
238
|
+ }
|
|
|
239
|
+ dispatch(trackNoDataFromSourceNotificationInfoChanged(jitsiTrack, notificationInfo));
|
|
|
240
|
+ };
|
|
|
241
|
+}
|
|
|
242
|
+
|
|
192
|
243
|
/**
|
|
193
|
244
|
* Signals that the local participant is ending screensharing or beginning the
|
|
194
|
245
|
* screensharing flow.
|
|
|
@@ -288,7 +339,8 @@ export function trackAdded(track) {
|
|
288
|
339
|
|
|
289
|
340
|
// participantId
|
|
290
|
341
|
const local = track.isLocal();
|
|
291
|
|
- let participantId;
|
|
|
342
|
+ const mediaType = track.getType();
|
|
|
343
|
+ let isReceivingData, noDataFromSourceNotificationInfo, participantId;
|
|
292
|
344
|
|
|
293
|
345
|
if (local) {
|
|
294
|
346
|
const participant = getLocalParticipant(getState);
|
|
|
@@ -296,18 +348,40 @@ export function trackAdded(track) {
|
|
296
|
348
|
if (participant) {
|
|
297
|
349
|
participantId = participant.id;
|
|
298
|
350
|
}
|
|
|
351
|
+
|
|
|
352
|
+ isReceivingData = track.isReceivingData();
|
|
|
353
|
+ track.on(JitsiTrackEvents.NO_DATA_FROM_SOURCE, () => dispatch(noDataFromSource({ jitsiTrack: track })));
|
|
|
354
|
+ if (!isReceivingData) {
|
|
|
355
|
+ if (mediaType === MEDIA_TYPE.AUDIO) {
|
|
|
356
|
+ const notificationAction = showNotification({
|
|
|
357
|
+ descriptionKey: 'dialog.micNotSendingData',
|
|
|
358
|
+ titleKey: 'dialog.micNotSendingDataTitle'
|
|
|
359
|
+ });
|
|
|
360
|
+
|
|
|
361
|
+ dispatch(notificationAction);
|
|
|
362
|
+ noDataFromSourceNotificationInfo = { uid: notificationAction.uid };
|
|
|
363
|
+ } else {
|
|
|
364
|
+ const timeout = setTimeout(() => dispatch(showNoDataFromSourceVideoError(track)), 5000);
|
|
|
365
|
+
|
|
|
366
|
+ noDataFromSourceNotificationInfo = { timeout };
|
|
|
367
|
+ }
|
|
|
368
|
+
|
|
|
369
|
+ }
|
|
299
|
370
|
} else {
|
|
300
|
371
|
participantId = track.getParticipantId();
|
|
|
372
|
+ isReceivingData = true;
|
|
301
|
373
|
}
|
|
302
|
374
|
|
|
303
|
375
|
return dispatch({
|
|
304
|
376
|
type: TRACK_ADDED,
|
|
305
|
377
|
track: {
|
|
306
|
378
|
jitsiTrack: track,
|
|
|
379
|
+ isReceivingData,
|
|
307
|
380
|
local,
|
|
308
|
|
- mediaType: track.getType(),
|
|
|
381
|
+ mediaType,
|
|
309
|
382
|
mirror: _shouldMirror(track),
|
|
310
|
383
|
muted: track.isMuted(),
|
|
|
384
|
+ noDataFromSourceNotificationInfo,
|
|
311
|
385
|
participantId,
|
|
312
|
386
|
videoStarted: false,
|
|
313
|
387
|
videoType: track.videoType
|
|
|
@@ -336,6 +410,26 @@ export function trackMutedChanged(track) {
|
|
336
|
410
|
};
|
|
337
|
411
|
}
|
|
338
|
412
|
|
|
|
413
|
+/**
|
|
|
414
|
+ * Create an action for when a track's no data from source notification information changes.
|
|
|
415
|
+ *
|
|
|
416
|
+ * @param {JitsiLocalTrack} track - JitsiTrack instance.
|
|
|
417
|
+ * @param {Object} noDataFromSourceNotificationInfo - Information about no data from source notification.
|
|
|
418
|
+ * @returns {{
|
|
|
419
|
+ * type: TRACK_UPDATED,
|
|
|
420
|
+ * track: Track
|
|
|
421
|
+ * }}
|
|
|
422
|
+ */
|
|
|
423
|
+export function trackNoDataFromSourceNotificationInfoChanged(track, noDataFromSourceNotificationInfo) {
|
|
|
424
|
+ return {
|
|
|
425
|
+ type: TRACK_UPDATED,
|
|
|
426
|
+ track: {
|
|
|
427
|
+ jitsiTrack: track,
|
|
|
428
|
+ noDataFromSourceNotificationInfo
|
|
|
429
|
+ }
|
|
|
430
|
+ };
|
|
|
431
|
+}
|
|
|
432
|
+
|
|
339
|
433
|
/**
|
|
340
|
434
|
* Create an action for when a track has been signaled for removal from the
|
|
341
|
435
|
* conference.
|
|
|
@@ -349,6 +443,7 @@ export function trackMutedChanged(track) {
|
|
349
|
443
|
export function trackRemoved(track) {
|
|
350
|
444
|
track.removeAllListeners(JitsiTrackEvents.TRACK_MUTE_CHANGED);
|
|
351
|
445
|
track.removeAllListeners(JitsiTrackEvents.TRACK_VIDEOTYPE_CHANGED);
|
|
|
446
|
+ track.removeAllListeners(JitsiTrackEvents.NO_DATA_FROM_SOURCE);
|
|
352
|
447
|
|
|
353
|
448
|
return {
|
|
354
|
449
|
type: TRACK_REMOVED,
|