bigscreen-player 8.9.1 → 8.10.1

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.
@@ -1,5 +1,5 @@
1
1
  import { fromXML, generateISD, renderHTML } from 'smp-imsc';
2
- import { f as findSegmentTemplate, L as LoadUrl, a as DebugToolInstance, P as Plugins, U as Utils, D as DOMHelpers } from './main-7b498fab.js';
2
+ import { f as findSegmentTemplate, L as LoadUrl, a as DebugToolInstance, P as Plugins, U as Utils, D as DOMHelpers } from './main-774dbe30.js';
3
3
 
4
4
  const SEGMENTS_BUFFER_SIZE = 3;
5
5
  const LOAD_ERROR_COUNT_MAX = 3;
@@ -1,4 +1,4 @@
1
- import { D as DOMHelpers, a as DebugToolInstance, P as Plugins, L as LoadUrl, T as TransportControlPosition } from './main-7b498fab.js';
1
+ import { D as DOMHelpers, a as DebugToolInstance, P as Plugins, L as LoadUrl, T as TransportControlPosition } from './main-774dbe30.js';
2
2
 
3
3
  /**
4
4
  * Safely checks if an attribute exists on an element.
@@ -5961,7 +5961,7 @@ BasicStrategy.getLiveSupport = () => LiveSupport.SEEKABLE;
5961
5961
  function StrategyPicker() {
5962
5962
  return new Promise((resolve, reject) => {
5963
5963
  if (window.bigscreenPlayer.playbackStrategy === PlaybackStrategy.MSE) {
5964
- return import('./msestrategy-4bf7955f.js')
5964
+ return import('./msestrategy-33edd320.js')
5965
5965
  .then(({ default: MSEStrategy }) => resolve(MSEStrategy))
5966
5966
  .catch(() => {
5967
5967
  reject({ error: "strategyDynamicLoadError" });
@@ -5979,7 +5979,8 @@ function PlayerComponent(
5979
5979
  mediaSources,
5980
5980
  windowType,
5981
5981
  stateUpdateCallback,
5982
- errorCallback
5982
+ errorCallback,
5983
+ callBroadcastMixADCallbacks
5983
5984
  ) {
5984
5985
  const transferFormat = bigscreenPlayerData.media.transferFormat;
5985
5986
 
@@ -6003,7 +6004,9 @@ function PlayerComponent(
6003
6004
  mediaKind,
6004
6005
  playbackElement,
6005
6006
  bigscreenPlayerData.media.isUHD,
6006
- bigscreenPlayerData.media.playerSettings
6007
+ bigscreenPlayerData.media.playerSettings,
6008
+ bigscreenPlayerData.enableBroadcastMixAD,
6009
+ callBroadcastMixADCallbacks
6007
6010
  );
6008
6011
 
6009
6012
  playbackStrategy.addEventCallback(this, eventCallback);
@@ -6064,6 +6067,22 @@ function PlayerComponent(
6064
6067
  return playbackStrategy && playbackStrategy.getSeekableRange()
6065
6068
  }
6066
6069
 
6070
+ function isBroadcastMixADAvailable() {
6071
+ return playbackStrategy && playbackStrategy.isBroadcastMixADAvailable?.()
6072
+ }
6073
+
6074
+ function isBroadcastMixADEnabled() {
6075
+ return playbackStrategy && playbackStrategy.isBroadcastMixADEnabled?.()
6076
+ }
6077
+
6078
+ function setBroadcastMixADOn() {
6079
+ playbackStrategy && playbackStrategy.setBroadcastMixADOn?.();
6080
+ }
6081
+
6082
+ function setBroadcastMixADOff() {
6083
+ playbackStrategy && playbackStrategy.setBroadcastMixADOff?.();
6084
+ }
6085
+
6067
6086
  function isPaused() {
6068
6087
  return playbackStrategy && playbackStrategy.isPaused()
6069
6088
  }
@@ -6369,6 +6388,10 @@ function PlayerComponent(
6369
6388
  getPlayerElement,
6370
6389
  isPaused,
6371
6390
  tearDown,
6391
+ isBroadcastMixADAvailable,
6392
+ isBroadcastMixADEnabled,
6393
+ setBroadcastMixADOn,
6394
+ setBroadcastMixADOff,
6372
6395
  }
6373
6396
  }
6374
6397
 
@@ -6384,49 +6407,54 @@ const PauseTriggers = {
6384
6407
  DEVICE: 3,
6385
6408
  };
6386
6409
 
6387
- var Version = "8.9.1";
6388
-
6389
- var sourceList;
6390
- var source;
6391
- var cdn;
6392
-
6393
- var timeUpdateCallbacks = [];
6394
- var subtitleCallbacks = [];
6395
- var stateChangeCallbacks = [];
6396
-
6397
- var currentTime;
6398
- var isSeeking;
6399
- var seekableRange;
6400
- var duration;
6401
- var liveWindowStart;
6402
- var pausedState = true;
6403
- var endedState;
6404
- var mediaKind;
6405
- var windowType;
6406
- var subtitlesAvailable;
6407
- var subtitlesEnabled;
6408
- var subtitlesHidden;
6409
- var endOfStream;
6410
- var canSeekState;
6411
- var canPauseState;
6412
- var shallowClone;
6413
- var mockModes = {
6410
+ var Version = "8.10.1";
6411
+
6412
+ /* eslint-disable no-use-before-define */
6413
+
6414
+ let sourceList;
6415
+ let source;
6416
+ let cdn;
6417
+
6418
+ let timeUpdateCallbacks = [];
6419
+ let subtitleCallbacks = [];
6420
+ let stateChangeCallbacks = [];
6421
+ let broadcastMixADCallbacks = [];
6422
+
6423
+ let currentTime;
6424
+ let isSeeking;
6425
+ let seekableRange;
6426
+ let duration;
6427
+ let liveWindowStart;
6428
+ let pausedState = true;
6429
+ let endedState;
6430
+ let mediaKind;
6431
+ let windowType;
6432
+ let subtitlesAvailable;
6433
+ let subtitlesEnabled;
6434
+ let subtitlesHidden;
6435
+ let broadcastMixADAvailable;
6436
+ let broadcastMixADEnabled;
6437
+ let endOfStream;
6438
+ let canSeekState;
6439
+ let canPauseState;
6440
+ let shallowClone;
6441
+ const mockModes = {
6414
6442
  NONE: 0,
6415
6443
  PLAIN: 1,
6416
6444
  JASMINE: 2,
6417
6445
  };
6418
- var mockStatus = { currentlyMocked: false, mode: mockModes.NONE };
6419
- var initialised;
6420
- var fatalErrorBufferingTimeout;
6446
+ let mockStatus = { currentlyMocked: false, mode: mockModes.NONE };
6447
+ let initialised;
6448
+ let fatalErrorBufferingTimeout;
6421
6449
 
6422
- var autoProgress;
6423
- var autoProgressInterval;
6424
- var initialBuffering = false;
6450
+ let autoProgress;
6451
+ let autoProgressInterval;
6452
+ let initialBuffering = false;
6425
6453
 
6426
- var liveWindowData;
6427
- var manifestError;
6454
+ let liveWindowData;
6455
+ let manifestError;
6428
6456
 
6429
- var excludedFuncs = [
6457
+ let excludedFuncs = [
6430
6458
  "getDebugLogs",
6431
6459
  "mock",
6432
6460
  "mockJasmine",
@@ -6442,10 +6470,10 @@ var excludedFuncs = [
6442
6470
  ];
6443
6471
 
6444
6472
  function startProgress(progressCause) {
6445
- setTimeout(function () {
6473
+ setTimeout(() => {
6446
6474
  if (!autoProgressInterval) {
6447
6475
  mockingHooks.changeState(MediaState.PLAYING, progressCause);
6448
- autoProgressInterval = setInterval(function () {
6476
+ autoProgressInterval = setInterval(() => {
6449
6477
  if (windowType !== WindowTypes.STATIC && seekableRange.start && seekableRange.end) {
6450
6478
  seekableRange.start += 0.5;
6451
6479
  seekableRange.end += 0.5;
@@ -6471,7 +6499,7 @@ function mock(BigscreenPlayer, opts) {
6471
6499
  autoProgress = opts && opts.autoProgress;
6472
6500
 
6473
6501
  if (opts && opts.excludedFuncs) {
6474
- excludedFuncs = excludedFuncs.concat(opts.excludedFuncs);
6502
+ excludedFuncs = [...excludedFuncs, ...opts.excludedFuncs];
6475
6503
  }
6476
6504
 
6477
6505
  if (mockStatus.currentlyMocked) {
@@ -6480,15 +6508,15 @@ function mock(BigscreenPlayer, opts) {
6480
6508
  shallowClone = Utils.clone(BigscreenPlayer);
6481
6509
 
6482
6510
  // Divert existing functions
6483
- for (var func in BigscreenPlayer) {
6511
+ for (const func in BigscreenPlayer) {
6484
6512
  if (BigscreenPlayer[func] && mockFunctions[func]) {
6485
6513
  BigscreenPlayer[func] = mockFunctions[func];
6486
6514
  } else if (!Utils.contains(excludedFuncs, func)) {
6487
- throw new Error(func + " was not mocked or included in the exclusion list")
6515
+ throw new Error(`${func} was not mocked or included in the exclusion list`)
6488
6516
  }
6489
6517
  }
6490
6518
  // Add extra functions
6491
- for (var hook in mockingHooks) {
6519
+ for (const hook in mockingHooks) {
6492
6520
  BigscreenPlayer[hook] = mockingHooks[hook];
6493
6521
  }
6494
6522
  mockStatus = { currentlyMocked: true, mode: mockModes.PLAIN };
@@ -6498,23 +6526,22 @@ function mockJasmine(BigscreenPlayer, opts) {
6498
6526
  autoProgress = opts && opts.autoProgress;
6499
6527
 
6500
6528
  if (opts && opts.excludedFuncs) {
6501
- excludedFuncs = excludedFuncs.concat(opts.excludedFuncs);
6529
+ excludedFuncs = [...excludedFuncs, ...opts.excludedFuncs];
6502
6530
  }
6503
6531
 
6504
6532
  if (mockStatus.currentlyMocked) {
6505
6533
  throw new Error("mockJasmine() was called while BigscreenPlayer was already mocked")
6506
6534
  }
6507
6535
 
6508
- for (var fn in BigscreenPlayer) {
6536
+ for (const fn in BigscreenPlayer) {
6509
6537
  if (BigscreenPlayer[fn] && mockFunctions[fn]) {
6510
- // eslint-disable-next-line no-undef
6511
6538
  spyOn(BigscreenPlayer, fn).and.callFake(mockFunctions[fn]);
6512
6539
  } else if (!Utils.contains(excludedFuncs, fn)) {
6513
- throw new Error(fn + " was not mocked or included in the exclusion list")
6540
+ throw new Error(`${fn} was not mocked or included in the exclusion list`)
6514
6541
  }
6515
6542
  }
6516
6543
 
6517
- for (var hook in mockingHooks) {
6544
+ for (const hook in mockingHooks) {
6518
6545
  BigscreenPlayer[hook] = mockingHooks[hook];
6519
6546
  }
6520
6547
  mockStatus = { currentlyMocked: true, mode: mockModes.JASMINE };
@@ -6526,12 +6553,12 @@ function unmock(BigscreenPlayer) {
6526
6553
  }
6527
6554
 
6528
6555
  // Remove extra functions
6529
- for (var hook in mockingHooks) {
6556
+ for (const hook in mockingHooks) {
6530
6557
  delete BigscreenPlayer[hook];
6531
6558
  }
6532
6559
  // Undo divert existing functions (plain mock only)
6533
6560
  if (mockStatus.mode === mockModes.PLAIN) {
6534
- for (var func in shallowClone) {
6561
+ for (const func in shallowClone) {
6535
6562
  BigscreenPlayer[func] = shallowClone[func];
6536
6563
  }
6537
6564
  }
@@ -6543,11 +6570,11 @@ function unmock(BigscreenPlayer) {
6543
6570
  }
6544
6571
 
6545
6572
  function callSubtitlesCallbacks(enabled) {
6546
- CallCallbacks(subtitleCallbacks, { enabled: enabled });
6573
+ CallCallbacks(subtitleCallbacks, { enabled });
6547
6574
  }
6548
6575
 
6549
- var mockFunctions = {
6550
- init: function (playbackElement, bigscreenPlayerData, newWindowType, enableSubtitles, callbacks) {
6576
+ const mockFunctions = {
6577
+ init(playbackElement, bigscreenPlayerData, newWindowType, enableSubtitles, callbacks) {
6551
6578
  currentTime = (bigscreenPlayerData && bigscreenPlayerData.initialPlaybackTime) || 0;
6552
6579
  liveWindowStart = undefined;
6553
6580
  pausedState = true;
@@ -6556,6 +6583,8 @@ var mockFunctions = {
6556
6583
  windowType = newWindowType || WindowTypes.STATIC;
6557
6584
  subtitlesAvailable = true;
6558
6585
  subtitlesEnabled = enableSubtitles;
6586
+ broadcastMixADAvailable = false;
6587
+ broadcastMixADEnabled = false;
6559
6588
  canSeekState = true;
6560
6589
  canPauseState = true;
6561
6590
  sourceList = bigscreenPlayerData && bigscreenPlayerData.media && bigscreenPlayerData.media.urls;
@@ -6588,34 +6617,35 @@ var mockFunctions = {
6588
6617
  callbacks.onSuccess();
6589
6618
  }
6590
6619
  },
6591
- registerForTimeUpdates: function (callback) {
6620
+ registerForTimeUpdates(callback) {
6592
6621
  timeUpdateCallbacks.push(callback);
6593
6622
  return callback
6594
6623
  },
6595
- unregisterForTimeUpdates: function (callback) {
6596
- timeUpdateCallbacks = timeUpdateCallbacks.filter(function (existingCallback) {
6597
- return callback !== existingCallback
6598
- });
6624
+ unregisterForTimeUpdates(callback) {
6625
+ timeUpdateCallbacks = timeUpdateCallbacks.filter((existingCallback) => callback !== existingCallback);
6599
6626
  },
6600
- registerForSubtitleChanges: function (callback) {
6627
+ registerForSubtitleChanges(callback) {
6601
6628
  subtitleCallbacks.push(callback);
6602
6629
  return callback
6603
6630
  },
6604
- unregisterForSubtitleChanges: function (callback) {
6605
- subtitleCallbacks = subtitleCallbacks.filter(function (existingCallback) {
6606
- return callback !== existingCallback
6607
- });
6631
+ unregisterForSubtitleChanges(callback) {
6632
+ subtitleCallbacks = subtitleCallbacks.filter((existingCallback) => callback !== existingCallback);
6633
+ },
6634
+ registerForBroadcastMixADChanges(callback) {
6635
+ broadcastMixADCallbacks.push(callback);
6636
+ return callback
6637
+ },
6638
+ unregisterForBroadcastMixADChanges(callback) {
6639
+ broadcastMixADCallbacks = broadcastMixADCallbacks.filter((existingCallback) => callback !== existingCallback);
6608
6640
  },
6609
- registerForStateChanges: function (callback) {
6641
+ registerForStateChanges(callback) {
6610
6642
  stateChangeCallbacks.push(callback);
6611
6643
  return callback
6612
6644
  },
6613
- unregisterForStateChanges: function (callback) {
6614
- stateChangeCallbacks = stateChangeCallbacks.filter(function (existingCallback) {
6615
- return callback !== existingCallback
6616
- });
6645
+ unregisterForStateChanges(callback) {
6646
+ stateChangeCallbacks = stateChangeCallbacks.filter((existingCallback) => callback !== existingCallback);
6617
6647
  },
6618
- setCurrentTime: function (time) {
6648
+ setCurrentTime(time) {
6619
6649
  currentTime = time;
6620
6650
  isSeeking = true;
6621
6651
  if (autoProgress) {
@@ -6627,86 +6657,93 @@ var mockFunctions = {
6627
6657
  mockingHooks.progressTime(currentTime);
6628
6658
  }
6629
6659
  },
6630
- getCurrentTime: function () {
6660
+ getCurrentTime() {
6631
6661
  return currentTime
6632
6662
  },
6633
- getMediaKind: function () {
6663
+ getMediaKind() {
6634
6664
  return mediaKind
6635
6665
  },
6636
- getWindowType: function () {
6666
+ getWindowType() {
6637
6667
  return windowType
6638
6668
  },
6639
- getSeekableRange: function () {
6669
+ getSeekableRange() {
6640
6670
  return seekableRange
6641
6671
  },
6642
- getDuration: function () {
6672
+ getDuration() {
6643
6673
  return duration
6644
6674
  },
6645
- isPaused: function () {
6675
+ isPaused() {
6646
6676
  return pausedState
6647
6677
  },
6648
- isEnded: function () {
6678
+ isEnded() {
6649
6679
  return endedState
6650
6680
  },
6651
- play: function () {
6681
+ play() {
6652
6682
  if (autoProgress) {
6653
6683
  startProgress("other");
6654
6684
  } else {
6655
6685
  mockingHooks.changeState(MediaState.PLAYING, "other");
6656
6686
  }
6657
6687
  },
6658
- pause: function (opts) {
6688
+ pause(opts) {
6659
6689
  mockingHooks.changeState(MediaState.PAUSED, "other", opts);
6660
6690
  },
6661
- setSubtitlesEnabled: function (value) {
6691
+ setSubtitlesEnabled(value) {
6662
6692
  subtitlesEnabled = value;
6663
6693
  callSubtitlesCallbacks(value);
6664
6694
  },
6665
- isSubtitlesEnabled: function () {
6695
+ isSubtitlesEnabled() {
6666
6696
  return subtitlesEnabled
6667
6697
  },
6668
- isSubtitlesAvailable: function () {
6698
+ isSubtitlesAvailable() {
6669
6699
  return subtitlesAvailable
6670
6700
  },
6671
- customiseSubtitles: function () {},
6672
- renderSubtitleExample: function () {},
6673
- setTransportControlsPosition: function (position) {},
6674
- canSeek: function () {
6701
+ customiseSubtitles() {},
6702
+ renderSubtitleExample() {},
6703
+ setBroadcastMixADEnabled(value) {
6704
+ broadcastMixADEnabled = value;
6705
+ },
6706
+ isBroadcastMixADEnabled() {
6707
+ return broadcastMixADEnabled
6708
+ },
6709
+ isBroadcastMixADAvailable() {
6710
+ return broadcastMixADAvailable
6711
+ },
6712
+ setTransportControlsPosition() {},
6713
+ canSeek() {
6675
6714
  return canSeekState
6676
6715
  },
6677
- canPause: function () {
6716
+ canPause() {
6678
6717
  return canPauseState
6679
6718
  },
6680
- convertVideoTimeSecondsToEpochMs: function (seconds) {
6719
+ convertVideoTimeSecondsToEpochMs(seconds) {
6681
6720
  return liveWindowStart ? liveWindowStart + seconds * 1000 : undefined
6682
6721
  },
6683
- transitions: function () {
6722
+ transitions() {
6684
6723
  return {
6685
- canBePaused: function () {
6724
+ canBePaused() {
6686
6725
  return true
6687
6726
  },
6688
- canBeginSeek: function () {
6727
+ canBeginSeek() {
6689
6728
  return true
6690
6729
  },
6691
6730
  }
6692
6731
  },
6693
- isPlayingAtLiveEdge: function () {
6732
+ isPlayingAtLiveEdge() {
6694
6733
  return false
6695
6734
  },
6696
- resize: function () {
6735
+ resize() {
6697
6736
  subtitlesHidden = this.isSubtitlesEnabled();
6698
6737
  this.setSubtitlesEnabled(subtitlesHidden);
6699
6738
  },
6700
- clearResize: function () {
6739
+ clearResize() {
6701
6740
  this.setSubtitlesEnabled(subtitlesHidden);
6702
6741
  },
6703
- getPlayerElement: function () {
6704
- return
6705
- },
6706
- getFrameworkVersion: function () {
6742
+ getPlayerElement() {},
6743
+ getFrameworkVersion() {
6707
6744
  return Version
6708
6745
  },
6709
- tearDown: function () {
6746
+ tearDown() {
6710
6747
  manifestError = false;
6711
6748
  if (!initialised) {
6712
6749
  return
@@ -6733,13 +6770,13 @@ var mockFunctions = {
6733
6770
 
6734
6771
  initialised = false;
6735
6772
  },
6736
- registerPlugin: function (plugin) {
6773
+ registerPlugin(plugin) {
6737
6774
  Plugins.registerPlugin(plugin);
6738
6775
  },
6739
- unregisterPlugin: function (plugin) {
6776
+ unregisterPlugin(plugin) {
6740
6777
  Plugins.unregisterPlugin(plugin);
6741
6778
  },
6742
- getLiveWindowData: function () {
6779
+ getLiveWindowData() {
6743
6780
  if (windowType === WindowTypes.STATIC) {
6744
6781
  return {}
6745
6782
  }
@@ -6752,9 +6789,9 @@ var mockFunctions = {
6752
6789
  },
6753
6790
  };
6754
6791
 
6755
- var mockingHooks = {
6756
- changeState: function (state, eventTrigger, opts) {
6757
- var pauseTrigger = opts && opts.userPause === false ? PauseTriggers.APP : PauseTriggers.USER;
6792
+ const mockingHooks = {
6793
+ changeState(state, eventTrigger, opts) {
6794
+ const pauseTrigger = opts && opts.userPause === false ? PauseTriggers.APP : PauseTriggers.USER;
6758
6795
 
6759
6796
  pausedState = state === MediaState.PAUSED || state === MediaState.STOPPED || state === MediaState.ENDED;
6760
6797
  endedState = state === MediaState.ENDED;
@@ -6787,7 +6824,7 @@ var mockingHooks = {
6787
6824
  );
6788
6825
  }
6789
6826
 
6790
- var stateObject = { state: state };
6827
+ const stateObject = { state };
6791
6828
  if (state === MediaState.PAUSED) {
6792
6829
  stateObject.trigger = pauseTrigger;
6793
6830
  endOfStream = false;
@@ -6805,51 +6842,51 @@ var mockingHooks = {
6805
6842
  CallCallbacks(stateChangeCallbacks, stateObject);
6806
6843
 
6807
6844
  if (autoProgress) {
6808
- if (state !== MediaState.PLAYING) {
6809
- stopProgress();
6810
- } else {
6845
+ if (state === MediaState.PLAYING) {
6811
6846
  startProgress();
6847
+ } else {
6848
+ stopProgress();
6812
6849
  }
6813
6850
  }
6814
6851
  },
6815
- progressTime: function (time) {
6852
+ progressTime(time) {
6816
6853
  currentTime = time;
6817
6854
  CallCallbacks(timeUpdateCallbacks, {
6818
6855
  currentTime: time,
6819
- endOfStream: endOfStream,
6856
+ endOfStream,
6820
6857
  });
6821
6858
  },
6822
- setEndOfStream: function (isEndOfStream) {
6859
+ setEndOfStream(isEndOfStream) {
6823
6860
  endOfStream = isEndOfStream;
6824
6861
  },
6825
- setDuration: function (mediaDuration) {
6862
+ setDuration(mediaDuration) {
6826
6863
  duration = mediaDuration;
6827
6864
  },
6828
- setSeekableRange: function (newSeekableRange) {
6865
+ setSeekableRange(newSeekableRange) {
6829
6866
  seekableRange = newSeekableRange;
6830
6867
  },
6831
- setMediaKind: function (kind) {
6868
+ setMediaKind(kind) {
6832
6869
  mediaKind = kind;
6833
6870
  },
6834
- setWindowType: function (type) {
6871
+ setWindowType(type) {
6835
6872
  windowType = type;
6836
6873
  },
6837
- setCanSeek: function (value) {
6874
+ setCanSeek(value) {
6838
6875
  canSeekState = value;
6839
6876
  },
6840
- setCanPause: function (value) {
6877
+ setCanPause(value) {
6841
6878
  canPauseState = value;
6842
6879
  },
6843
- setLiveWindowStart: function (value) {
6880
+ setLiveWindowStart(value) {
6844
6881
  liveWindowStart = value;
6845
6882
  },
6846
- setSubtitlesAvailable: function (value) {
6883
+ setSubtitlesAvailable(value) {
6847
6884
  subtitlesAvailable = value;
6848
6885
  },
6849
- getSource: function () {
6886
+ getSource() {
6850
6887
  return source
6851
6888
  },
6852
- triggerError: function () {
6889
+ triggerError() {
6853
6890
  fatalErrorBufferingTimeout = false;
6854
6891
  Plugins.interface.onError(
6855
6892
  new PluginData({
@@ -6861,10 +6898,10 @@ var mockingHooks = {
6861
6898
  this.changeState(MediaState.WAITING);
6862
6899
  stopProgress();
6863
6900
  },
6864
- triggerManifestError: function () {
6901
+ triggerManifestError() {
6865
6902
  manifestError = true;
6866
6903
  },
6867
- triggerErrorHandled: function () {
6904
+ triggerErrorHandled() {
6868
6905
  if (sourceList && sourceList.length > 1) {
6869
6906
  sourceList.shift();
6870
6907
  source = sourceList[0].url;
@@ -6885,7 +6922,7 @@ var mockingHooks = {
6885
6922
  status: PluginEnums.STATUS.FAILOVER,
6886
6923
  stateType: PluginEnums.TYPE.ERROR,
6887
6924
  isBufferingTimeoutError: fatalErrorBufferingTimeout,
6888
- cdn: cdn,
6925
+ cdn,
6889
6926
  })
6890
6927
  );
6891
6928
 
@@ -6894,18 +6931,18 @@ var mockingHooks = {
6894
6931
  startProgress();
6895
6932
  }
6896
6933
  },
6897
- setInitialBuffering: function (value) {
6934
+ setInitialBuffering(value) {
6898
6935
  initialBuffering = value;
6899
6936
  },
6900
- setLiveWindowData: function (newLiveWindowData) {
6937
+ setLiveWindowData(newLiveWindowData) {
6901
6938
  liveWindowData = newLiveWindowData;
6902
6939
  },
6903
6940
  };
6904
6941
 
6905
6942
  var MockBigscreenPlayer = {
6906
- mock: mock,
6907
- unmock: unmock,
6908
- mockJasmine: mockJasmine,
6943
+ mock,
6944
+ unmock,
6945
+ mockJasmine,
6909
6946
  };
6910
6947
 
6911
6948
  function durationToSeconds(duration) {
@@ -7735,7 +7772,7 @@ function Subtitles(mediaPlayer, autoStart, playbackElement, defaultStyleOpts, me
7735
7772
 
7736
7773
  if (available()) {
7737
7774
  if (useLegacySubs) {
7738
- import('./legacysubtitles-9f94b60a.js')
7775
+ import('./legacysubtitles-dac98ca0.js')
7739
7776
  .then(({ default: LegacySubtitles }) => {
7740
7777
  subtitlesContainer = LegacySubtitles(mediaPlayer, autoStart, playbackElement, mediaSources, defaultStyleOpts);
7741
7778
  callback(subtitlesEnabled);
@@ -7744,7 +7781,7 @@ function Subtitles(mediaPlayer, autoStart, playbackElement, defaultStyleOpts, me
7744
7781
  Plugins.interface.onSubtitlesDynamicLoadError();
7745
7782
  });
7746
7783
  } else {
7747
- import('./imscsubtitles-e2151ee1.js')
7784
+ import('./imscsubtitles-7553075b.js')
7748
7785
  .then(({ default: IMSCSubtitles }) => {
7749
7786
  subtitlesContainer = IMSCSubtitles(mediaPlayer, autoStart, playbackElement, mediaSources, defaultStyleOpts);
7750
7787
  callback(subtitlesEnabled);
@@ -7845,6 +7882,7 @@ function BigscreenPlayer() {
7845
7882
  let stateChangeCallbacks = [];
7846
7883
  let timeUpdateCallbacks = [];
7847
7884
  let subtitleCallbacks = [];
7885
+ let broadcastMixADCallbacks = [];
7848
7886
 
7849
7887
  let playerReadyCallback;
7850
7888
  let playerErrorCallback;
@@ -7953,7 +7991,8 @@ function BigscreenPlayer() {
7953
7991
  mediaSources,
7954
7992
  windowType,
7955
7993
  mediaStateUpdateCallback,
7956
- playerErrorCallback
7994
+ playerErrorCallback,
7995
+ callBroadcastMixADCallbacks
7957
7996
  );
7958
7997
 
7959
7998
  subtitles = Subtitles(
@@ -8001,6 +8040,10 @@ function BigscreenPlayer() {
8001
8040
  return subtitles ? subtitles.available() : false
8002
8041
  }
8003
8042
 
8043
+ function callBroadcastMixADCallbacks(enabled) {
8044
+ CallCallbacks(broadcastMixADCallbacks, { enabled });
8045
+ }
8046
+
8004
8047
  return /** @alias module:bigscreenplayer/bigscreenplayer */ {
8005
8048
  /**
8006
8049
  * Call first to initialise bigscreen player for playback.
@@ -8075,6 +8118,7 @@ function BigscreenPlayer() {
8075
8118
  stateChangeCallbacks = [];
8076
8119
  timeUpdateCallbacks = [];
8077
8120
  subtitleCallbacks = [];
8121
+ broadcastMixADCallbacks = [];
8078
8122
  endOfStream = undefined;
8079
8123
  mediaKind = undefined;
8080
8124
  pauseTrigger = undefined;
@@ -8151,6 +8195,28 @@ function BigscreenPlayer() {
8151
8195
  }
8152
8196
  },
8153
8197
 
8198
+ /**
8199
+ * Pass a function to be called whenever BroadcastMixAD is enabled or disabled.
8200
+ * @function
8201
+ * @param {Function} callback
8202
+ */
8203
+ registerForBroadcastMixADChanges: (callback) => {
8204
+ broadcastMixADCallbacks.push(callback);
8205
+ return callback
8206
+ },
8207
+
8208
+ /**
8209
+ * Unregisters a previously registered callback for changes to BroadcastMixAD.
8210
+ * @function
8211
+ * @param {Function} callback
8212
+ */
8213
+ unregisterForBroadcastMixADChanges: (callback) => {
8214
+ const indexOf = broadcastMixADCallbacks.indexOf(callback);
8215
+ if (indexOf !== -1) {
8216
+ broadcastMixADCallbacks.splice(indexOf, 1);
8217
+ }
8218
+ },
8219
+
8154
8220
  /**
8155
8221
  * Sets the current time of the media asset.
8156
8222
  * @function
@@ -8373,6 +8439,25 @@ function BigscreenPlayer() {
8373
8439
  }
8374
8440
  },
8375
8441
 
8442
+ /**
8443
+ * @function
8444
+ * @returns {boolean} true if there if an AD track is available
8445
+ */
8446
+ isBroadcastMixADAvailable: () => playerComponent && playerComponent.isBroadcastMixADAvailable(),
8447
+
8448
+ /**
8449
+ * @function
8450
+ * @returns {boolean} true if there is an the AD audio track is current being used
8451
+ */
8452
+ isBroadcastMixADEnabled: () => playerComponent && playerComponent.isBroadcastMixADEnabled(),
8453
+
8454
+ /**
8455
+ * @function
8456
+ */
8457
+ setBroadcastMixADEnabled: (enabled) => {
8458
+ enabled ? playerComponent.setBroadcastMixADOn() : playerComponent.setBroadcastMixADOff();
8459
+ },
8460
+
8376
8461
  /**
8377
8462
  *
8378
8463
  * An enum may be used to set the on-screen position of any transport controls
@@ -122,6 +122,18 @@ declare function BigscreenPlayer(): {
122
122
  * @param {Function} callback
123
123
  */
124
124
  unregisterForSubtitleChanges: (callback: Function) => void;
125
+ /**
126
+ * Pass a function to be called whenever BroadcastMixAD is enabled or disabled.
127
+ * @function
128
+ * @param {Function} callback
129
+ */
130
+ registerForBroadcastMixADChanges: (callback: Function) => Function;
131
+ /**
132
+ * Unregisters a previously registered callback for changes to BroadcastMixAD.
133
+ * @function
134
+ * @param {Function} callback
135
+ */
136
+ unregisterForBroadcastMixADChanges: (callback: Function) => void;
125
137
  /**
126
138
  * Sets the current time of the media asset.
127
139
  * @function
@@ -259,6 +271,20 @@ declare function BigscreenPlayer(): {
259
271
  * Clear the example subtitle string
260
272
  */
261
273
  clearSubtitleExample: () => void;
274
+ /**
275
+ * @function
276
+ * @returns {boolean} true if there if an AD track is available
277
+ */
278
+ isBroadcastMixADAvailable: () => boolean;
279
+ /**
280
+ * @function
281
+ * @returns {boolean} true if there is an the AD audio track is current being used
282
+ */
283
+ isBroadcastMixADEnabled: () => boolean;
284
+ /**
285
+ * @function
286
+ */
287
+ setBroadcastMixADEnabled: (enabled: any) => void;
262
288
  /**
263
289
  *
264
290
  * An enum may be used to set the on-screen position of any transport controls
package/dist/esm/main.js CHANGED
@@ -1 +1 @@
1
- export { B as BigscreenPlayer, a as DebugTool, E as EntryCategory, c as LiveSupport, M as MediaKinds, g as MediaState, h as MockBigscreenPlayer, b as PauseTriggers, i as PlaybackStrategy, j as TransferFormat, T as TransportControlPosition, W as WindowTypes, k as isMessage, l as isMetric, m as isTrace } from './main-7b498fab.js';
1
+ export { B as BigscreenPlayer, a as DebugTool, E as EntryCategory, c as LiveSupport, M as MediaKinds, g as MediaState, h as MockBigscreenPlayer, b as PauseTriggers, i as PlaybackStrategy, j as TransferFormat, T as TransportControlPosition, W as WindowTypes, k as isMessage, l as isMetric, m as isTrace } from './main-774dbe30.js';
@@ -1,5 +1,5 @@
1
1
  import { MediaPlayer } from 'dashjs/index_mediaplayerOnly';
2
- import { W as WindowTypes, U as Utils, b as PauseTriggers, c as LiveSupport, M as MediaKinds, a as DebugToolInstance, d as TimeUtils, e as DynamicWindowUtils, g as MediaState, P as Plugins, D as DOMHelpers } from './main-7b498fab.js';
2
+ import { W as WindowTypes, U as Utils, b as PauseTriggers, c as LiveSupport, M as MediaKinds, a as DebugToolInstance, d as TimeUtils, e as DynamicWindowUtils, g as MediaState, P as Plugins, D as DOMHelpers } from './main-774dbe30.js';
3
3
 
4
4
  function filter(manifest, representationOptions) {
5
5
  const constantFps = representationOptions.constantFps;
@@ -175,7 +175,16 @@ const DEFAULT_SETTINGS = {
175
175
  seekDurationPadding: 1.1,
176
176
  };
177
177
 
178
- function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD, customPlayerSettings) {
178
+ function MSEStrategy(
179
+ mediaSources,
180
+ windowType,
181
+ mediaKind,
182
+ playbackElement,
183
+ isUHD,
184
+ customPlayerSettings,
185
+ enableBroadcastMixAD,
186
+ callBroadcastMixADCallbacks
187
+ ) {
179
188
  let mediaPlayer;
180
189
  let mediaElement;
181
190
 
@@ -253,6 +262,7 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
253
262
  STREAM_INITIALIZED: "streamInitialized",
254
263
  FRAGMENT_CONTENT_LENGTH_MISMATCH: "fragmentContentLengthMismatch",
255
264
  QUOTA_EXCEEDED: "quotaExceeded",
265
+ CURRENT_TRACK_CHANGED: "currentTrackChanged",
256
266
  };
257
267
 
258
268
  function onLoadedMetaData() {
@@ -600,6 +610,16 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
600
610
  Plugins.interface.onFragmentContentLengthMismatch(event);
601
611
  }
602
612
 
613
+ function onCurrentTrackChanged(event) {
614
+ const mediaType = event.newMediaInfo.type;
615
+ DebugToolInstance.info(
616
+ `${mediaType} track changed.${
617
+ mediaType === "audio" ? (isBroadcastMixADEnabled() ? " BroadcastMixAD on." : " BroadcastMixAD off.") : ""
618
+ }`
619
+ );
620
+ callBroadcastMixADCallbacks(isBroadcastMixADEnabled());
621
+ }
622
+
603
623
  function publishMediaState(mediaState) {
604
624
  for (let index = 0; index < eventCallbacks.length; index++) {
605
625
  eventCallbacks[index](mediaState);
@@ -672,6 +692,14 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
672
692
  mediaPlayer = MediaPlayer().create();
673
693
  mediaPlayer.updateSettings(dashSettings);
674
694
  mediaPlayer.initialize(mediaElement, null, true);
695
+
696
+ if (enableBroadcastMixAD) {
697
+ mediaPlayer.setInitialMediaSettingsFor("audio", {
698
+ role: "alternate",
699
+ accessibility: { schemeIdUri: "urn:tva:metadata:cs:AudioPurposeCS:2007", value: "1" },
700
+ });
701
+ }
702
+
675
703
  modifySource(playbackTime);
676
704
  }
677
705
 
@@ -719,6 +747,7 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
719
747
  mediaPlayer.on(DashJSEvents.GAP_JUMP_TO_END, onGapJump);
720
748
  mediaPlayer.on(DashJSEvents.QUOTA_EXCEEDED, onQuotaExceeded);
721
749
  mediaPlayer.on(DashJSEvents.MANIFEST_LOADING_FINISHED, manifestLoadingFinished);
750
+ mediaPlayer.on(DashJSEvents.CURRENT_TRACK_CHANGED, onCurrentTrackChanged);
722
751
  }
723
752
 
724
753
  function manifestLoadingFinished(event) {
@@ -809,6 +838,43 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
809
838
  );
810
839
  }
811
840
 
841
+ function isTrackBroadcastMixAD(track) {
842
+ return (
843
+ track.roles.includes("alternate") &&
844
+ track.accessibilitiesWithSchemeIdUri.some(
845
+ (scheme) => scheme.schemeIdUri === "urn:tva:metadata:cs:AudioPurposeCS:2007" && scheme.value === "1"
846
+ )
847
+ )
848
+ }
849
+
850
+ function getBroadcastMixADTrack() {
851
+ const audioTracks = mediaPlayer.getTracksFor("audio");
852
+ return audioTracks.find((track) => isTrackBroadcastMixAD(track))
853
+ }
854
+
855
+ function isBroadcastMixADAvailable() {
856
+ const audioTracks = mediaPlayer.getTracksFor("audio");
857
+ return audioTracks.some((track) => isTrackBroadcastMixAD(track))
858
+ }
859
+
860
+ function isBroadcastMixADEnabled() {
861
+ const currentAudioTrack = mediaPlayer.getCurrentTrackFor("audio");
862
+ return currentAudioTrack ? isTrackBroadcastMixAD(currentAudioTrack) : false
863
+ }
864
+
865
+ function setBroadcastMixADOff() {
866
+ const audioTracks = mediaPlayer.getTracksFor("audio");
867
+ const mainTrack = audioTracks.find((track) => track.roles.includes("main"));
868
+ mediaPlayer.setCurrentTrack(mainTrack);
869
+ }
870
+
871
+ function setBroadcastMixADOn() {
872
+ const ADTrack = getBroadcastMixADTrack();
873
+ if (ADTrack) {
874
+ mediaPlayer.setCurrentTrack(ADTrack);
875
+ }
876
+ }
877
+
812
878
  function cleanUpMediaPlayer() {
813
879
  if (mediaPlayer) {
814
880
  mediaPlayer.destroy();
@@ -827,6 +893,7 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
827
893
  mediaPlayer.off(DashJSEvents.GAP_JUMP, onGapJump);
828
894
  mediaPlayer.off(DashJSEvents.GAP_JUMP_TO_END, onGapJump);
829
895
  mediaPlayer.off(DashJSEvents.QUOTA_EXCEEDED, onQuotaExceeded);
896
+ mediaPlayer.off(DashJSEvents.TRACK_CHANGE_RENDERED, onCurrentTrackChanged);
830
897
 
831
898
  mediaPlayer = undefined;
832
899
  }
@@ -866,6 +933,10 @@ function MSEStrategy(mediaSources, windowType, mediaKind, playbackElement, isUHD
866
933
  load,
867
934
  getSeekableRange,
868
935
  getCurrentTime,
936
+ isBroadcastMixADAvailable,
937
+ isBroadcastMixADEnabled,
938
+ setBroadcastMixADOn,
939
+ setBroadcastMixADOff,
869
940
  getDuration,
870
941
  getPlayerElement: () => mediaElement,
871
942
  tearDown: () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigscreen-player",
3
- "version": "8.9.1",
3
+ "version": "8.10.1",
4
4
  "type": "module",
5
5
  "description": "Simplified media playback for bigscreen devices.",
6
6
  "main": "dist/esm/main.js",