@checksub_team/peaks_timeline 1.4.18 → 1.4.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@checksub_team/peaks_timeline",
3
- "version": "1.4.18",
3
+ "version": "1.4.21",
4
4
  "description": "JavaScript UI component for displaying audio waveforms",
5
5
  "main": "./peaks.js",
6
6
  "types": "./peaks.js.d.ts",
package/peaks.js CHANGED
@@ -15561,6 +15561,9 @@ module.exports = function (Colors, EventEmitter, TimelineSegments, TimelineSourc
15561
15561
  Peaks.prototype.allowInteractions = function (forSources, forSegments) {
15562
15562
  return this.view.allowInteractions(forSources, forSegments);
15563
15563
  };
15564
+ Peaks.prototype.checkOverlapping = function (segment, message) {
15565
+ return this.view.getSegmentsGroup().checkOverlapping(segment, message);
15566
+ };
15564
15567
  Peaks.prototype._addWindowResizeHandler = function () {
15565
15568
  this._onResize = this._onResize.bind(this);
15566
15569
  window.addEventListener('resize', this._onResize);
@@ -16560,6 +16563,7 @@ module.exports = function (Konva, SegmentMarker) {
16560
16563
  };
16561
16564
  SegmentShape.prototype._onSegmentDragStart = function () {
16562
16565
  this._view.setCursor('grab');
16566
+ this._group.checkOverlapping(this._segment, 'overlapping before dragging');
16563
16567
  this._mouseDownX = this._view.getPointerPosition().x;
16564
16568
  this._initialStartTime = this._segment.startTime;
16565
16569
  this._initialStartPixel = this._view.timeToPixels(this._initialStartTime);
@@ -16569,6 +16573,7 @@ module.exports = function (Konva, SegmentMarker) {
16569
16573
  };
16570
16574
  SegmentShape.prototype._onSegmentDragEnd = function () {
16571
16575
  this._view.setCursor('pointer');
16576
+ this._group.checkOverlapping(this._segment, 'overlapping after dragging');
16572
16577
  this._peaks.emit('segments.dragend', this._segment);
16573
16578
  };
16574
16579
  SegmentShape.prototype._onSegmentHandleDrag = function () {
@@ -16576,10 +16581,12 @@ module.exports = function (Konva, SegmentMarker) {
16576
16581
  };
16577
16582
  SegmentShape.prototype._onSegmentHandleDragStart = function (segmentMarker) {
16578
16583
  var startMarker = segmentMarker.isStartMarker();
16584
+ this._group.checkOverlapping(this._segment, 'overlapping before dragging');
16579
16585
  this._peaks.emit('segments.dragstart', this._segment, startMarker);
16580
16586
  };
16581
16587
  SegmentShape.prototype._onSegmentHandleDragEnd = function (segmentMarker) {
16582
16588
  var startMarker = segmentMarker.isStartMarker();
16589
+ this._group.checkOverlapping(this._segment, 'overlapping after dragging');
16583
16590
  this._peaks.emit('segments.dragend', this._segment, startMarker);
16584
16591
  };
16585
16592
  SegmentShape.prototype.fitToView = function () {
@@ -16621,7 +16628,7 @@ module.exports = function (Utils) {
16621
16628
  }
16622
16629
  if (options.endTime < 0) {
16623
16630
  options.endTime = 0;
16624
- } else if (options.endTime < options.startTime + peaks.options.minSegmentSize) {
16631
+ } else if (options.endTime - options.startTime < peaks.options.minSegmentSize) {
16625
16632
  options.endTime = options.startTime + peaks.options.minSegmentSize;
16626
16633
  }
16627
16634
  options.startTime = Utils.roundTime(options.startTime);
@@ -16747,6 +16754,7 @@ module.exports = function (Utils) {
16747
16754
  };
16748
16755
  Utils.extend(opts, options);
16749
16756
  validateSegment(this._peaks, opts, 'update()');
16757
+ this._peaks.checkOverlapping(this, 'overlapping before manual update');
16750
16758
  this._startTime = opts.startTime;
16751
16759
  this._endTime = opts.endTime;
16752
16760
  this._labelText = opts.labelText;
@@ -16755,6 +16763,7 @@ module.exports = function (Utils) {
16755
16763
  this._handleTextColor = opts.handleTextColor;
16756
16764
  this._opacity = opts.opacity;
16757
16765
  this._editable = opts.editable;
16766
+ this._peaks.checkOverlapping(this, 'overlapping after manual update');
16758
16767
  this._peaks.emit('segment.updated', this);
16759
16768
  };
16760
16769
  Segment.prototype.isVisible = function (startTime, endTime) {
@@ -16775,6 +16784,7 @@ module.exports = function (SegmentShape, Utils, Konva) {
16775
16784
  this._segmentShapes = {};
16776
16785
  this._group = new Konva.Group();
16777
16786
  this._updatedSegments = [];
16787
+ this._overlappingSegments = [];
16778
16788
  this._isMagnetized = false;
16779
16789
  this._peaks.on('segment.updated', this._onSegmentsUpdate.bind(this));
16780
16790
  this._peaks.on('segments.add', this._onSegmentsAdd.bind(this));
@@ -16824,6 +16834,7 @@ module.exports = function (SegmentShape, Utils, Konva) {
16824
16834
  return activeSegment;
16825
16835
  };
16826
16836
  SegmentsGroup.prototype._onSegmentsUpdate = function (segment) {
16837
+ this._overlappingSegments = [];
16827
16838
  if (this._segments[segment.id]) {
16828
16839
  var redraw = false;
16829
16840
  var segmentShape = this._segmentShapes[segment.id];
@@ -16849,6 +16860,7 @@ module.exports = function (SegmentShape, Utils, Konva) {
16849
16860
  SegmentsGroup.prototype._onSegmentUpdated = function () {
16850
16861
  this._peaks.emit('segments.updated', this._updatedSegments);
16851
16862
  this._updatedSegments = [];
16863
+ this._overlappingSegments = [];
16852
16864
  };
16853
16865
  SegmentsGroup.prototype._onSegmentsAdd = function (segments) {
16854
16866
  var self = this;
@@ -17046,12 +17058,25 @@ module.exports = function (SegmentShape, Utils, Konva) {
17046
17058
  this._draw();
17047
17059
  }
17048
17060
  };
17061
+ SegmentsGroup.prototype.checkOverlapping = function (segment, message) {
17062
+ if (this._segments[segment.id].prevSegmentId && this._segments[this._segments[segment.id].prevSegmentId].segment.endTime > segment.startTime || this._segments[segment.id].nextSegmentId && this._segments[this._segments[segment.id].nextSegmentId].segment.startTime < segment.endTime) {
17063
+ if (!this._overlappingSegments.includes(segment.id)) {
17064
+ this._peaks.emit('segments.overlap', {
17065
+ message: message,
17066
+ segment: segment,
17067
+ prevSegment: this._segments[segment.id].prevSegmentId ? this._segments[this._segments[segment.id].prevSegmentId].segment : null,
17068
+ nextSegment: this._segments[segment.id].nextSegmentId ? this._segments[this._segments[segment.id].nextSegmentId].segment : null
17069
+ });
17070
+ this._overlappingSegments.push(segment.id);
17071
+ }
17072
+ }
17073
+ };
17049
17074
  SegmentsGroup.prototype.manageCollision = function (segment, newStartX, newEndX) {
17050
17075
  var newStartTime = null;
17051
17076
  var newEndTime = null;
17052
17077
  var startLimited = false;
17053
17078
  var endLimited = false;
17054
- var segmentMagnetThreshold, width;
17079
+ var segmentMagnetThreshold, width, previousSegment, nextSegment, newXs;
17055
17080
  if (this._isMagnetized) {
17056
17081
  segmentMagnetThreshold = this._view.pixelsToTime(this._peaks.options.segmentMagnetThreshold);
17057
17082
  if (newStartX !== null && newEndX !== null) {
@@ -17061,7 +17086,7 @@ module.exports = function (SegmentShape, Utils, Konva) {
17061
17086
  if (newStartX !== null) {
17062
17087
  newStartTime = this._view.pixelsToTime(newStartX);
17063
17088
  if (this._segments[segment.id].prevSegmentId) {
17064
- var previousSegment = this._segments[this._segments[segment.id].prevSegmentId].segment;
17089
+ previousSegment = this._segments[this._segments[segment.id].prevSegmentId].segment;
17065
17090
  if (this._isMagnetized) {
17066
17091
  if (newStartTime < previousSegment.endTime + segmentMagnetThreshold) {
17067
17092
  newStartX = this._view.timeToPixels(previousSegment.endTime);
@@ -17073,14 +17098,20 @@ module.exports = function (SegmentShape, Utils, Konva) {
17073
17098
  endX: newEndX
17074
17099
  };
17075
17100
  }
17076
- } else if (segment.startTime > newStartTime) {
17101
+ } else if (segment.startTime >= newStartTime) {
17077
17102
  if (newStartTime < previousSegment.endTime) {
17078
17103
  if (previousSegment.startTime + previousSegment.minSize > newStartTime) {
17079
17104
  newStartTime = previousSegment.startTime + previousSegment.minSize;
17080
17105
  startLimited = true;
17081
17106
  }
17082
17107
  if (previousSegment.endTime !== newStartTime) {
17083
- previousSegment.endTime = newStartTime;
17108
+ newXs = this.manageCollision(previousSegment, this._view.timeToPixels(previousSegment.startTime), this._view.timeToPixels(newStartTime));
17109
+ if (newXs.startX !== null) {
17110
+ previousSegment.startTime = this._view.pixelsToTime(newXs.startX);
17111
+ }
17112
+ if (newXs.endX !== null) {
17113
+ previousSegment.endTime = this._view.pixelsToTime(newXs.endX);
17114
+ }
17084
17115
  this._updateSegment(previousSegment);
17085
17116
  this.addToUpdatedSegments(previousSegment);
17086
17117
  }
@@ -17096,7 +17127,7 @@ module.exports = function (SegmentShape, Utils, Konva) {
17096
17127
  if (newEndX !== null) {
17097
17128
  newEndTime = this._view.pixelsToTime(newEndX);
17098
17129
  if (this._segments[segment.id].nextSegmentId) {
17099
- var nextSegment = this._segments[this._segments[segment.id].nextSegmentId].segment;
17130
+ nextSegment = this._segments[this._segments[segment.id].nextSegmentId].segment;
17100
17131
  if (this._isMagnetized) {
17101
17132
  if (newEndTime > nextSegment.startTime - segmentMagnetThreshold) {
17102
17133
  newEndX = this._view.timeToPixels(nextSegment.startTime);
@@ -17108,14 +17139,20 @@ module.exports = function (SegmentShape, Utils, Konva) {
17108
17139
  endX: newEndX
17109
17140
  };
17110
17141
  }
17111
- } else if (segment.endTime < newEndTime) {
17142
+ } else if (segment.endTime <= newEndTime) {
17112
17143
  if (newEndTime > nextSegment.startTime) {
17113
17144
  if (nextSegment.endTime - nextSegment.minSize < newEndTime) {
17114
17145
  newEndTime = nextSegment.endTime - nextSegment.minSize;
17115
17146
  endLimited = true;
17116
17147
  }
17117
17148
  if (nextSegment.startTime !== newEndTime) {
17118
- nextSegment.startTime = newEndTime;
17149
+ newXs = this.manageCollision(nextSegment, this._view.timeToPixels(newEndTime), this._view.timeToPixels(nextSegment.endTime));
17150
+ if (newXs.startX !== null) {
17151
+ nextSegment.startTime = this._view.pixelsToTime(newXs.startX);
17152
+ }
17153
+ if (newXs.endX !== null) {
17154
+ nextSegment.endTime = this._view.pixelsToTime(newXs.endX);
17155
+ }
17119
17156
  this._updateSegment(nextSegment);
17120
17157
  this.addToUpdatedSegments(nextSegment);
17121
17158
  }
@@ -17125,7 +17162,15 @@ module.exports = function (SegmentShape, Utils, Konva) {
17125
17162
  }
17126
17163
  }
17127
17164
  if (newStartTime !== null && newEndTime !== null) {
17128
- if (newEndTime - newStartTime < segment.minSize) {
17165
+ if (Utils.roundTime(newEndTime - newStartTime) < segment.minSize) {
17166
+ if (previousSegment && nextSegment) {
17167
+ if (Utils.roundTime(nextSegment.startTime - previousSegment.endTime) < segment.minSize) {
17168
+ return {
17169
+ startX: null,
17170
+ endX: null
17171
+ };
17172
+ }
17173
+ }
17129
17174
  if (startLimited) {
17130
17175
  newEndTime = newStartTime + segment.minSize;
17131
17176
  } else if (endLimited) {
@@ -17133,11 +17178,11 @@ module.exports = function (SegmentShape, Utils, Konva) {
17133
17178
  }
17134
17179
  }
17135
17180
  } else if (newStartTime !== null) {
17136
- if (segment.endTime - newStartTime < segment.minSize) {
17181
+ if (Utils.roundTime(segment.endTime - newStartTime) < segment.minSize) {
17137
17182
  newStartTime = segment.endTime - segment.minSize;
17138
17183
  }
17139
17184
  } else if (newEndTime !== null) {
17140
- if (newEndTime - segment.startTime < segment.minSize) {
17185
+ if (Utils.roundTime(newEndTime - segment.startTime) < segment.minSize) {
17141
17186
  newEndTime = segment.startTime + segment.minSize;
17142
17187
  }
17143
17188
  }
package/src/main.js CHANGED
@@ -622,6 +622,12 @@ define([
622
622
  .allowInteractions(forSources, forSegments);
623
623
  };
624
624
 
625
+ Peaks.prototype.checkOverlapping = function(segment, message) {
626
+ return this.view
627
+ .getSegmentsGroup()
628
+ .checkOverlapping(segment, message);
629
+ };
630
+
625
631
  Peaks.prototype._addWindowResizeHandler = function() {
626
632
  this._onResize = this._onResize.bind(this);
627
633
  window.addEventListener('resize', this._onResize);
@@ -272,6 +272,8 @@ define([
272
272
  SegmentShape.prototype._onSegmentDragStart = function() {
273
273
  this._view.setCursor('grab');
274
274
 
275
+ this._group.checkOverlapping(this._segment, 'overlapping before dragging');
276
+
275
277
  this._mouseDownX = this._view.getPointerPosition().x;
276
278
  this._initialStartTime = this._segment.startTime;
277
279
  this._initialStartPixel = this._view.timeToPixels(this._initialStartTime);
@@ -284,6 +286,8 @@ define([
284
286
  SegmentShape.prototype._onSegmentDragEnd = function() {
285
287
  this._view.setCursor('pointer');
286
288
 
289
+ this._group.checkOverlapping(this._segment, 'overlapping after dragging');
290
+
287
291
  this._peaks.emit('segments.dragend', this._segment);
288
292
  };
289
293
 
@@ -302,6 +306,8 @@ define([
302
306
  SegmentShape.prototype._onSegmentHandleDragStart = function(segmentMarker) {
303
307
  var startMarker = segmentMarker.isStartMarker();
304
308
 
309
+ this._group.checkOverlapping(this._segment, 'overlapping before dragging');
310
+
305
311
  this._peaks.emit('segments.dragstart', this._segment, startMarker);
306
312
  };
307
313
 
@@ -312,6 +318,8 @@ define([
312
318
  SegmentShape.prototype._onSegmentHandleDragEnd = function(segmentMarker) {
313
319
  var startMarker = segmentMarker.isStartMarker();
314
320
 
321
+ this._group.checkOverlapping(this._segment, 'overlapping after dragging');
322
+
315
323
  this._peaks.emit('segments.dragend', this._segment, startMarker);
316
324
  };
317
325
 
package/src/segment.js CHANGED
@@ -24,7 +24,6 @@ define([
24
24
 
25
25
  options.startTime = Utils.roundTime(options.startTime);
26
26
  options.endTime = Utils.roundTime(options.endTime);
27
-
28
27
  if (options.startTime < 0) {
29
28
  options.startTime = 0;
30
29
  }
@@ -32,20 +31,13 @@ define([
32
31
  if (options.endTime < 0) {
33
32
  options.endTime = 0;
34
33
  }
35
- else if (options.endTime < options.startTime + peaks.options.minSegmentSize) {
34
+ else if (options.endTime - options.startTime < peaks.options.minSegmentSize) {
36
35
  options.endTime = options.startTime + peaks.options.minSegmentSize;
37
36
  }
38
37
 
39
38
  options.startTime = Utils.roundTime(options.startTime);
40
39
  options.endTime = Utils.roundTime(options.endTime);
41
40
 
42
- // if (options.endTime <= options.startTime) {
43
- // // eslint-disable-next-line max-len
44
- // throw new RangeError(
45
- // 'peaks.segments.' + context + ': endTime should be greater than startTime'
46
- // );
47
- // }
48
-
49
41
  if (options.opacity < 0 || options.opacity > 1) {
50
42
  // eslint-disable-next-line max-len
51
43
  throw new RangeError('peaks.segments.' + context + ': opacity should be between 0 and 1');
@@ -199,6 +191,8 @@ define([
199
191
 
200
192
  validateSegment(this._peaks, opts, 'update()');
201
193
 
194
+ this._peaks.checkOverlapping(this, 'overlapping before manual update');
195
+
202
196
  this._startTime = opts.startTime;
203
197
  this._endTime = opts.endTime;
204
198
  this._labelText = opts.labelText;
@@ -208,6 +202,8 @@ define([
208
202
  this._opacity = opts.opacity;
209
203
  this._editable = opts.editable;
210
204
 
205
+ this._peaks.checkOverlapping(this, 'overlapping after manual update');
206
+
211
207
  this._peaks.emit('segment.updated', this);
212
208
  };
213
209
 
@@ -41,6 +41,7 @@ define([
41
41
  this._group = new Konva.Group();
42
42
 
43
43
  this._updatedSegments = [];
44
+ this._overlappingSegments = [];
44
45
 
45
46
  this._isMagnetized = false;
46
47
 
@@ -113,6 +114,8 @@ define([
113
114
  };
114
115
 
115
116
  SegmentsGroup.prototype._onSegmentsUpdate = function(segment) {
117
+ this._overlappingSegments = [];
118
+
116
119
  if (this._segments[segment.id]) {
117
120
  var redraw = false;
118
121
  var segmentShape = this._segmentShapes[segment.id];
@@ -143,6 +146,7 @@ define([
143
146
  SegmentsGroup.prototype._onSegmentUpdated = function() {
144
147
  this._peaks.emit('segments.updated', this._updatedSegments);
145
148
  this._updatedSegments = [];
149
+ this._overlappingSegments = [];
146
150
  };
147
151
 
148
152
  SegmentsGroup.prototype._onSegmentsAdd = function(segments) {
@@ -460,12 +464,31 @@ define([
460
464
  }
461
465
  };
462
466
 
467
+ SegmentsGroup.prototype.checkOverlapping = function(segment, message) {
468
+ /* eslint-disable max-len */
469
+ if ((this._segments[segment.id].prevSegmentId
470
+ && this._segments[this._segments[segment.id].prevSegmentId].segment.endTime > segment.startTime)
471
+ || (this._segments[segment.id].nextSegmentId
472
+ && this._segments[this._segments[segment.id].nextSegmentId].segment.startTime < segment.endTime)) {
473
+ if (!this._overlappingSegments.includes(segment.id)) {
474
+ this._peaks.emit('segments.overlap', {
475
+ message: message,
476
+ segment: segment,
477
+ prevSegment: this._segments[segment.id].prevSegmentId ? this._segments[this._segments[segment.id].prevSegmentId].segment : null,
478
+ nextSegment: this._segments[segment.id].nextSegmentId ? this._segments[this._segments[segment.id].nextSegmentId].segment : null
479
+ });
480
+ this._overlappingSegments.push(segment.id);
481
+ }
482
+ }
483
+ /* eslint-enable max-len */
484
+ };
485
+
463
486
  SegmentsGroup.prototype.manageCollision = function(segment, newStartX, newEndX) {
464
487
  var newStartTime = null;
465
488
  var newEndTime = null;
466
489
  var startLimited = false;
467
490
  var endLimited = false;
468
- var segmentMagnetThreshold, width;
491
+ var segmentMagnetThreshold, width, previousSegment, nextSegment, newXs;
469
492
 
470
493
  if (this._isMagnetized) {
471
494
  segmentMagnetThreshold = this._view.pixelsToTime(
@@ -483,7 +506,7 @@ define([
483
506
 
484
507
  if (this._segments[segment.id].prevSegmentId) {
485
508
  // there is another segment to the left
486
- var previousSegment = this._segments[this._segments[segment.id].prevSegmentId].segment;
509
+ previousSegment = this._segments[this._segments[segment.id].prevSegmentId].segment;
487
510
 
488
511
  if (this._isMagnetized) {
489
512
  if (newStartTime < previousSegment.endTime + segmentMagnetThreshold) {
@@ -498,7 +521,7 @@ define([
498
521
  };
499
522
  }
500
523
  }
501
- else if (segment.startTime > newStartTime) {
524
+ else if (segment.startTime >= newStartTime) {
502
525
  // startMarker moved to the left
503
526
  if (newStartTime < previousSegment.endTime) {
504
527
  // there is collision
@@ -508,7 +531,19 @@ define([
508
531
  }
509
532
 
510
533
  if (previousSegment.endTime !== newStartTime) {
511
- previousSegment.endTime = newStartTime;
534
+ newXs = this.manageCollision(
535
+ previousSegment,
536
+ this._view.timeToPixels(previousSegment.startTime),
537
+ this._view.timeToPixels(newStartTime)
538
+ );
539
+
540
+ if (newXs.startX !== null) {
541
+ previousSegment.startTime = this._view.pixelsToTime(newXs.startX);
542
+ }
543
+
544
+ if (newXs.endX !== null) {
545
+ previousSegment.endTime = this._view.pixelsToTime(newXs.endX);
546
+ }
512
547
  this._updateSegment(previousSegment);
513
548
  this.addToUpdatedSegments(previousSegment);
514
549
  }
@@ -529,7 +564,7 @@ define([
529
564
 
530
565
  if (this._segments[segment.id].nextSegmentId) {
531
566
  // there is another segment to the right
532
- var nextSegment = this._segments[this._segments[segment.id].nextSegmentId].segment;
567
+ nextSegment = this._segments[this._segments[segment.id].nextSegmentId].segment;
533
568
 
534
569
  if (this._isMagnetized) {
535
570
  if (newEndTime > nextSegment.startTime - segmentMagnetThreshold) {
@@ -544,7 +579,7 @@ define([
544
579
  };
545
580
  }
546
581
  }
547
- else if (segment.endTime < newEndTime) {
582
+ else if (segment.endTime <= newEndTime) {
548
583
  // endMarker moved to the right
549
584
  if (newEndTime > nextSegment.startTime) {
550
585
  // there is collision
@@ -554,7 +589,19 @@ define([
554
589
  }
555
590
 
556
591
  if (nextSegment.startTime !== newEndTime) {
557
- nextSegment.startTime = newEndTime;
592
+ newXs = this.manageCollision(
593
+ nextSegment,
594
+ this._view.timeToPixels(newEndTime),
595
+ this._view.timeToPixels(nextSegment.endTime)
596
+ );
597
+
598
+ if (newXs.startX !== null) {
599
+ nextSegment.startTime = this._view.pixelsToTime(newXs.startX);
600
+ }
601
+
602
+ if (newXs.endX !== null) {
603
+ nextSegment.endTime = this._view.pixelsToTime(newXs.endX);
604
+ }
558
605
  this._updateSegment(nextSegment);
559
606
  this.addToUpdatedSegments(nextSegment);
560
607
  }
@@ -568,7 +615,16 @@ define([
568
615
 
569
616
  // Check for minimal size of segment
570
617
  if (newStartTime !== null && newEndTime !== null) {
571
- if (newEndTime - newStartTime < segment.minSize) {
618
+ if (Utils.roundTime(newEndTime - newStartTime) < segment.minSize) {
619
+ if (previousSegment && nextSegment) {
620
+ if (Utils.roundTime(nextSegment.startTime - previousSegment.endTime) < segment.minSize) {
621
+ return {
622
+ startX: null,
623
+ endX: null
624
+ };
625
+ }
626
+ }
627
+
572
628
  if (startLimited) {
573
629
  newEndTime = newStartTime + segment.minSize;
574
630
  }
@@ -578,12 +634,12 @@ define([
578
634
  }
579
635
  }
580
636
  else if (newStartTime !== null) {
581
- if (segment.endTime - newStartTime < segment.minSize) {
637
+ if (Utils.roundTime(segment.endTime - newStartTime) < segment.minSize) {
582
638
  newStartTime = segment.endTime - segment.minSize;
583
639
  }
584
640
  }
585
641
  else if (newEndTime !== null) {
586
- if (newEndTime - segment.startTime < segment.minSize) {
642
+ if (Utils.roundTime(newEndTime - segment.startTime) < segment.minSize) {
587
643
  newEndTime = segment.startTime + segment.minSize;
588
644
  }
589
645
  }