senza-sdk 4.2.51-6aee9e6.0 → 4.2.51-77d7fb8.0
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/dist/bundle.js +1 -1
- package/package.json +1 -1
- package/src/remotePlayer.js +113 -242
- package/src/utils.js +2 -4
package/package.json
CHANGED
package/src/remotePlayer.js
CHANGED
|
@@ -695,7 +695,7 @@ class RemotePlayer extends EventTarget {
|
|
|
695
695
|
return Promise.resolve(undefined);
|
|
696
696
|
}
|
|
697
697
|
|
|
698
|
-
_play() {
|
|
698
|
+
_play(streamType = StreamType.AUDIO) {
|
|
699
699
|
if (window.cefQuery) {
|
|
700
700
|
const FCID = getFCID();
|
|
701
701
|
const logger = sdkLogger.withFields({ FCID });
|
|
@@ -719,7 +719,7 @@ class RemotePlayer extends EventTarget {
|
|
|
719
719
|
if (this._remotePlayerApiVersion >= 2) {
|
|
720
720
|
if (this._isAudioSyncEnabled()) {
|
|
721
721
|
message.switchMode = SwitchMode.SEAMLESS;
|
|
722
|
-
message.streamType =
|
|
722
|
+
message.streamType = streamType;
|
|
723
723
|
waitForResponse = true;
|
|
724
724
|
} else {
|
|
725
725
|
logger.log("remotePlayer play request ignored and will be sent with the lifecycle.moveToBackground()");
|
|
@@ -817,6 +817,52 @@ class RemotePlayer extends EventTarget {
|
|
|
817
817
|
return Promise.resolve(undefined);
|
|
818
818
|
}
|
|
819
819
|
|
|
820
|
+
_stop(streamType = StreamType.AUDIO) {
|
|
821
|
+
if (window.cefQuery) {
|
|
822
|
+
this._changePlayMode(false);
|
|
823
|
+
const FCID = getFCID();
|
|
824
|
+
const logger = sdkLogger.withFields({ FCID });
|
|
825
|
+
logger.log(`remotePlayer stop: sending stop action for streamType ${streamType}`);
|
|
826
|
+
const message = {
|
|
827
|
+
type: "remotePlayer.stop",
|
|
828
|
+
class: "remotePlayer",
|
|
829
|
+
action: "stop",
|
|
830
|
+
streamType: streamType,
|
|
831
|
+
fcid: FCID
|
|
832
|
+
};
|
|
833
|
+
const request = { target: "TC", waitForResponse: true, message: JSON.stringify(message) };
|
|
834
|
+
return new Promise((resolve, reject) => {
|
|
835
|
+
let timerId = 0;
|
|
836
|
+
const timeBeforeSendingRequest = Date.now();
|
|
837
|
+
const queryId = window.cefQuery({
|
|
838
|
+
request: JSON.stringify(request),
|
|
839
|
+
persistent: false,
|
|
840
|
+
onSuccess: () => {
|
|
841
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
842
|
+
logger.withFields({ duration }).log(`stop completed successfully after ${duration} ms`);
|
|
843
|
+
timerId = clearTimer(timerId);
|
|
844
|
+
resolve();
|
|
845
|
+
},
|
|
846
|
+
onFailure: (code, msg) => {
|
|
847
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
848
|
+
logger.withFields({ duration }).log(`stop failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
|
|
849
|
+
timerId = clearTimer(timerId);
|
|
850
|
+
reject(new RemotePlayerError(code, msg));
|
|
851
|
+
}
|
|
852
|
+
});
|
|
853
|
+
logger.log(`window.cefQuery for stop returned query id ${queryId}`);
|
|
854
|
+
const timeout = this._remotePlayerConfirmationTimeout + 1000;
|
|
855
|
+
timerId = setTimeout(() => {
|
|
856
|
+
logger.log(`stop reached timeout of ${timeout} ms, canceling query id ${queryId}`);
|
|
857
|
+
window.cefQueryCancel(queryId);
|
|
858
|
+
reject(new RemotePlayerError(6000, `stop reached timeout of ${timeout} ms`));
|
|
859
|
+
}, timeout, queryId);
|
|
860
|
+
});
|
|
861
|
+
}
|
|
862
|
+
sdkLogger.error("remotePlayer play: window.cefQuery is undefined");
|
|
863
|
+
return Promise.resolve(undefined);
|
|
864
|
+
}
|
|
865
|
+
|
|
820
866
|
/** In order to support a seamless switch between the video in the UI and ABR, the web application must
|
|
821
867
|
* register the video element being used for the currently played video before calling the load and play apis.
|
|
822
868
|
* @param {object} video The video element currently playing video in the web application
|
|
@@ -1235,8 +1281,7 @@ class RemotePlayer extends EventTarget {
|
|
|
1235
1281
|
case 2:
|
|
1236
1282
|
return this._selectAudioTrackV2(audioTrackId, prevSelectedAudioTrack);
|
|
1237
1283
|
default:
|
|
1238
|
-
this.
|
|
1239
|
-
return this._atomicSetAudioLanguage();
|
|
1284
|
+
return this._atomicSetAudioLanguage(audioTrackId, prevSelectedAudioTrack);
|
|
1240
1285
|
}
|
|
1241
1286
|
}
|
|
1242
1287
|
|
|
@@ -1283,11 +1328,10 @@ class RemotePlayer extends EventTarget {
|
|
|
1283
1328
|
* Available only from v3 and on
|
|
1284
1329
|
*
|
|
1285
1330
|
* @param {string} audioTrackId - The ID of the audio track to select.
|
|
1286
|
-
* @param {string} prevSelectedAudioTrack - The previously selected audio track ID.
|
|
1287
1331
|
* @returns {Promise<void>} Resolves when the operation is complete.
|
|
1288
1332
|
* */
|
|
1289
|
-
async _selectAudioTrackV3(audioTrackId
|
|
1290
|
-
sdkLogger.log(`remotePlayer _selectAudioTrackV3:
|
|
1333
|
+
async _selectAudioTrackV3(audioTrackId) {
|
|
1334
|
+
sdkLogger.log(`remotePlayer _selectAudioTrackV3: audioTrackId=${audioTrackId} isPlaying=${this._isPlaying}`);
|
|
1291
1335
|
if (window.cefQuery) {
|
|
1292
1336
|
const FCID = getFCID();
|
|
1293
1337
|
const logger = sdkLogger.withFields({ FCID });
|
|
@@ -1373,8 +1417,7 @@ class RemotePlayer extends EventTarget {
|
|
|
1373
1417
|
case 2:
|
|
1374
1418
|
return this._selectTextTrackV2(textTrackId, prevSelectedTextTrack);
|
|
1375
1419
|
default:
|
|
1376
|
-
this.
|
|
1377
|
-
return this._atomicSetSubtitleLanguage();
|
|
1420
|
+
return this._atomicSetSubtitleLanguage(textTrackId, prevSelectedTextTrack);
|
|
1378
1421
|
}
|
|
1379
1422
|
}
|
|
1380
1423
|
|
|
@@ -1421,11 +1464,9 @@ class RemotePlayer extends EventTarget {
|
|
|
1421
1464
|
* Available only from v3 and on
|
|
1422
1465
|
*
|
|
1423
1466
|
* @param {string} textTrackId - The ID of the text track to select.
|
|
1424
|
-
* @param {string} prevSelectedTextTrack - The previously selected text track ID.
|
|
1425
1467
|
* @returns {Promise<void>} Resolves when the operation is complete.
|
|
1426
1468
|
* */
|
|
1427
|
-
async _selectTextTrackV3(textTrackId
|
|
1428
|
-
sdkLogger.log(`remotePlayer _selectTextTrackV3: prevAudioTrack=${prevSelectedTextTrack} textTrackId=${textTrackId} isPlaying=${this._isPlaying}`);
|
|
1469
|
+
async _selectTextTrackV3(textTrackId) {
|
|
1429
1470
|
if (window.cefQuery) {
|
|
1430
1471
|
const FCID = getFCID();
|
|
1431
1472
|
const logger = sdkLogger.withFields({ FCID });
|
|
@@ -1435,7 +1476,7 @@ class RemotePlayer extends EventTarget {
|
|
|
1435
1476
|
class: "remotePlayer",
|
|
1436
1477
|
action: "setSubtitleLanguage",
|
|
1437
1478
|
fcid: FCID,
|
|
1438
|
-
language: textTrackId
|
|
1479
|
+
language: textTrackId
|
|
1439
1480
|
};
|
|
1440
1481
|
const request = { target: "TC", waitForResponse: true, message: JSON.stringify(message) };
|
|
1441
1482
|
return new Promise((resolve, reject) => {
|
|
@@ -1701,271 +1742,101 @@ class RemotePlayer extends EventTarget {
|
|
|
1701
1742
|
sdkLogger.info("Seeking: local video element seeking end");
|
|
1702
1743
|
}
|
|
1703
1744
|
|
|
1704
|
-
async
|
|
1705
|
-
|
|
1706
|
-
if (this._remotePlayerApiVersion >= 2) {
|
|
1707
|
-
return new Promise((resolve, reject) => {
|
|
1708
|
-
const FCID = getFCID();
|
|
1709
|
-
const logger = sdkLogger.withFields({ FCID });
|
|
1710
|
-
logger.log(`remotePlayer _stopAudio: sending stop action remotePlayer._isPlaying=${remotePlayer._isPlaying}`);
|
|
1711
|
-
const message = {
|
|
1712
|
-
type: "remotePlayer.stop",
|
|
1713
|
-
class: "remotePlayer",
|
|
1714
|
-
action: "stop",
|
|
1715
|
-
streamType: StreamType.AUDIO,
|
|
1716
|
-
fcid: FCID
|
|
1717
|
-
};
|
|
1718
|
-
let timerId = 0;
|
|
1719
|
-
const timeBeforeSendingRequest = Date.now();
|
|
1720
|
-
const queryId = window.cefQuery({
|
|
1721
|
-
request: JSON.stringify({ target: "TC", waitForResponse: true, internalAction: "uiActive", message: JSON.stringify(message) }),
|
|
1722
|
-
persistent: false,
|
|
1723
|
-
onSuccess: () => {
|
|
1724
|
-
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1725
|
-
logger.withFields({ duration }).log(`stop audio completed successfully after ${duration} ms`);
|
|
1726
|
-
this._inTransition = false;
|
|
1727
|
-
timerId = clearTimer(timerId);
|
|
1728
|
-
resolve(true);
|
|
1729
|
-
},
|
|
1730
|
-
onFailure: (code, msg) => {
|
|
1731
|
-
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1732
|
-
logger.withFields({ duration }).log(`stop audio failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
|
|
1733
|
-
this._inTransition = false;
|
|
1734
|
-
timerId = clearTimer(timerId);
|
|
1735
|
-
reject(new SenzaError(code, msg));
|
|
1736
|
-
}
|
|
1737
|
-
});
|
|
1738
|
-
logger.log(`window.cefQuery for stop audio returned query id ${queryId}`);
|
|
1739
|
-
const timeout = this._remotePlayerConfirmationTimeout + 1000;
|
|
1740
|
-
timerId = setTimeout(() => {
|
|
1741
|
-
logger.log(`stop audio reached timeout of ${timeout} ms, canceling query id ${queryId}`);
|
|
1742
|
-
this._inTransition = false;
|
|
1743
|
-
window.cefQueryCancel(queryId);
|
|
1744
|
-
reject(new SenzaError(6000, `stop audio reached timeout of ${timeout} ms`));
|
|
1745
|
-
}, timeout, queryId);
|
|
1746
|
-
});
|
|
1747
|
-
}
|
|
1748
|
-
}
|
|
1745
|
+
async _atomicSetAudioLanguage(audioTrackId, prevSelectedAudioTrack) {
|
|
1746
|
+
this._targetSetAudioPlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
|
|
1749
1747
|
|
|
1750
|
-
|
|
1748
|
+
sdkLogger.log(`remotePlayer _atomicSetAudioLanguage: prevAudioTrack=${prevSelectedAudioTrack} audioTrackId=${audioTrackId} isPlaying=${this._isPlaying} targetState=${this._targetSetAudioPlayingState}`);
|
|
1751
1749
|
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
if (this._remotePlayerApiVersion >= 2) {
|
|
1755
|
-
return new Promise((resolve, reject) => {
|
|
1756
|
-
const FCID = getFCID();
|
|
1757
|
-
const logger = sdkLogger.withFields({ FCID });
|
|
1758
|
-
logger.log(`remotePlayer _stopSubtitle: sending stop action remotePlayer._isPlaying=${remotePlayer._isPlaying}`);
|
|
1759
|
-
const message = {
|
|
1760
|
-
type: "remotePlayer.stop",
|
|
1761
|
-
class: "remotePlayer",
|
|
1762
|
-
action: "stop",
|
|
1763
|
-
streamType: StreamType.SUBTITLE,
|
|
1764
|
-
fcid: FCID
|
|
1765
|
-
};
|
|
1766
|
-
let timerId = 0;
|
|
1767
|
-
const timeBeforeSendingRequest = Date.now();
|
|
1768
|
-
const queryId = window.cefQuery({
|
|
1769
|
-
request: JSON.stringify({ target: "TC", waitForResponse: true, internalAction: "uiActive", message: JSON.stringify(message) }),
|
|
1770
|
-
persistent: false,
|
|
1771
|
-
onSuccess: () => {
|
|
1772
|
-
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1773
|
-
logger.withFields({ duration }).log(`stop subtitle completed successfully after ${duration} ms`);
|
|
1774
|
-
this._inTransition = false;
|
|
1775
|
-
timerId = clearTimer(timerId);
|
|
1776
|
-
resolve(true);
|
|
1777
|
-
},
|
|
1778
|
-
onFailure: (code, msg) => {
|
|
1779
|
-
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1780
|
-
logger.withFields({ duration }).log(`stop subtitle failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
|
|
1781
|
-
this._inTransition = false;
|
|
1782
|
-
timerId = clearTimer(timerId);
|
|
1783
|
-
reject(new SenzaError(code, msg));
|
|
1784
|
-
}
|
|
1785
|
-
});
|
|
1786
|
-
logger.log(`window.cefQuery for stop returned query id ${queryId}`);
|
|
1787
|
-
const timeout = this._remotePlayerConfirmationTimeout + 1000;
|
|
1788
|
-
timerId = setTimeout(() => {
|
|
1789
|
-
logger.log(`stop reached timeout of ${timeout} ms, canceling query id ${queryId}`);
|
|
1790
|
-
window.cefQueryCancel(queryId);
|
|
1791
|
-
reject(new SenzaError(6000, `stop reached timeout of ${timeout} ms`));
|
|
1792
|
-
}, timeout, queryId);
|
|
1793
|
-
});
|
|
1794
|
-
}
|
|
1795
|
-
}
|
|
1796
|
-
|
|
1797
|
-
}
|
|
1750
|
+
this._abortSetAudioLanguage = false;
|
|
1751
|
+
this._isSetAudioByApplication = true;
|
|
1798
1752
|
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
};
|
|
1824
|
-
} else {
|
|
1825
|
-
request = message;
|
|
1826
|
-
}
|
|
1827
|
-
let timerId = 0;
|
|
1828
|
-
const timeBeforeSendingRequest = Date.now();
|
|
1829
|
-
const queryId = window.cefQuery({
|
|
1830
|
-
request: JSON.stringify(request),
|
|
1831
|
-
persistent: false,
|
|
1832
|
-
onSuccess: () => {
|
|
1833
|
-
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1834
|
-
logger.withFields({ duration }).log(`play subtitle completed successfully after ${duration} ms`);
|
|
1835
|
-
this._inTransition = false;
|
|
1836
|
-
timerId = clearTimer(timerId);
|
|
1837
|
-
resolve();
|
|
1838
|
-
},
|
|
1839
|
-
onFailure: (code, msg) => {
|
|
1840
|
-
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1841
|
-
logger.withFields({ duration }).log(`play subtitle failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
|
|
1842
|
-
this._inTransition = false;
|
|
1843
|
-
timerId = clearTimer(timerId);
|
|
1844
|
-
reject(new SenzaError(code, msg));
|
|
1845
|
-
}
|
|
1846
|
-
});
|
|
1847
|
-
if (this._remotePlayerApiVersion >= 2) {
|
|
1848
|
-
logger.log(`window.cefQuery for play subtitle returned query id ${queryId}`);
|
|
1849
|
-
const timeout = this._remotePlayerConfirmationTimeout + 1000;
|
|
1850
|
-
timerId = setTimeout(() => {
|
|
1851
|
-
logger.log(`play subtitle reached timeout of ${timeout} ms, canceling query id ${queryId}`);
|
|
1852
|
-
this._inTransition = false;
|
|
1853
|
-
window.cefQueryCancel(queryId);
|
|
1854
|
-
reject(new SenzaError(6000, `play subtitle reached timeout of ${timeout} ms`));
|
|
1855
|
-
}, timeout, queryId);
|
|
1753
|
+
let state = SetAudioLanguageState.INIT;
|
|
1754
|
+
let res;
|
|
1755
|
+
|
|
1756
|
+
while (!this._abortSetAudioLanguage && state !== SetAudioLanguageState.DONE) {
|
|
1757
|
+
try {
|
|
1758
|
+
switch(state) {
|
|
1759
|
+
case SetAudioLanguageState.INIT:
|
|
1760
|
+
// always stop stream before changing language to flush current segments
|
|
1761
|
+
// because we cannot differentiate if player is paused/stopped
|
|
1762
|
+
state = SetAudioLanguageState.STOPPED;
|
|
1763
|
+
break;
|
|
1764
|
+
case SetAudioLanguageState.STOPPED:
|
|
1765
|
+
await this._stop(StreamType.AUDIO);
|
|
1766
|
+
state = SetAudioLanguageState.SET;
|
|
1767
|
+
break;
|
|
1768
|
+
case SetAudioLanguageState.SET:
|
|
1769
|
+
res = await this._selectAudioTrackV3(audioTrackId);
|
|
1770
|
+
// check if we need to resume playback or leave player state as is
|
|
1771
|
+
state = this._targetSetAudioPlayingState !== TargetPlayingState.PAUSED ? SetAudioLanguageState.PLAYING: SetAudioLanguageState.DONE;
|
|
1772
|
+
sdkLogger.log(`remotePlayer _atomicSetAudioLanguage: audioTrackId=${audioTrackId} isPlaying=${this._isPlaying} targetState=${this._targetSetAudioPlayingState}`);
|
|
1773
|
+
break;
|
|
1774
|
+
case SetAudioLanguageState.PLAYING:
|
|
1775
|
+
if (!this._abortSetAudioLanguage) {
|
|
1776
|
+
await this._play(StreamType.AUDIO);
|
|
1856
1777
|
}
|
|
1857
|
-
|
|
1778
|
+
state = SetAudioLanguageState.DONE;
|
|
1779
|
+
break;
|
|
1780
|
+
}
|
|
1781
|
+
} catch (error) {
|
|
1782
|
+
sdkLogger.error(`remotePlayer _atomicSetAudioLanguage: audioTrackId=${audioTrackId} failed with error ${error.message}.`);
|
|
1783
|
+
state = SetAudioLanguageState.DONE;
|
|
1784
|
+
res = Promise.reject(error);
|
|
1858
1785
|
}
|
|
1859
|
-
|
|
1860
1786
|
}
|
|
1861
|
-
sdkLogger.error("remotePlayer play subtitle: window.cefQuery is undefined");
|
|
1862
|
-
return Promise.resolve(undefined);
|
|
1863
|
-
}
|
|
1864
1787
|
|
|
1865
|
-
|
|
1866
|
-
sdkLogger.
|
|
1788
|
+
this._isSetAudioByApplication = false;
|
|
1789
|
+
sdkLogger.log(`remotePlayer _atomicSetAudioLanguage: audioTrackId=${audioTrackId} ended.`);
|
|
1790
|
+
return res;
|
|
1791
|
+
}
|
|
1867
1792
|
|
|
1793
|
+
async _atomicSetSubtitleLanguage(textTrackId, prevSelectedTextTrack) {
|
|
1868
1794
|
this._targetSetSubtitlePlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
|
|
1795
|
+
sdkLogger.log(`remotePlayer _atomicSetSubtitleLanguage: prevTextTrack=${prevSelectedTextTrack} textTrackId=${textTrackId} isPlaying=${this._isPlaying} targetState=${this._targetSetSubtitlePlayingState}`);
|
|
1796
|
+
|
|
1869
1797
|
this._abortSetSubtitleLanguage = false;
|
|
1870
1798
|
this._isSetSubtitleByApplication = true;
|
|
1871
1799
|
|
|
1872
1800
|
let state = SetSubtitleLanguageState.INIT;
|
|
1873
|
-
|
|
1874
|
-
let previousPendingSubtitleLanguage = this._pendingSubtitleLanguage;
|
|
1875
|
-
let initialSubtitleLanguage = this._pendingSubtitleLanguage;
|
|
1876
1801
|
let res;
|
|
1877
1802
|
|
|
1878
1803
|
while (!this._abortSetSubtitleLanguage && state !== SetSubtitleLanguageState.DONE) {
|
|
1879
1804
|
try {
|
|
1880
1805
|
switch(state) {
|
|
1881
1806
|
case SetSubtitleLanguageState.INIT:
|
|
1882
|
-
|
|
1807
|
+
// always stop stream before changing language to flush current segments
|
|
1808
|
+
// because we cannot differentiate if player is paused/stopped
|
|
1809
|
+
state = SetSubtitleLanguageState.STOPPED;
|
|
1883
1810
|
break;
|
|
1884
1811
|
case SetSubtitleLanguageState.STOPPED:
|
|
1885
|
-
|
|
1886
|
-
await this._stopSubtitle();
|
|
1887
|
-
sdkLogger.error("AFTER STOP BEFORE SET SUBTITLE");
|
|
1812
|
+
await this._stop(StreamType.SUBTITLE);
|
|
1888
1813
|
state = SetSubtitleLanguageState.SET;
|
|
1889
1814
|
break;
|
|
1890
1815
|
case SetSubtitleLanguageState.SET:
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
sdkLogger.
|
|
1816
|
+
res = await this._selectTextTrackV3(textTrackId);
|
|
1817
|
+
// check if we need to resume playback or leave player state as is
|
|
1818
|
+
state = this._targetSetSubtitlePlayingState !== TargetPlayingState.PAUSED ? SetSubtitleLanguageState.PLAYING: SetSubtitleLanguageState.DONE;
|
|
1819
|
+
sdkLogger.log(`remotePlayer _atomicSetSubtitleLanguage: textTrackId=${textTrackId} isPlaying=${this._isPlaying} targetState=${this._targetSetSubtitlePlayingState}`);
|
|
1820
|
+
break;
|
|
1821
|
+
case SetSubtitleLanguageState.PLAYING:
|
|
1822
|
+
if (!this._abortSetSubtitleLanguage) {
|
|
1823
|
+
await this._play(StreamType.SUBTITLE | StreamType.AUDIO);
|
|
1824
|
+
}
|
|
1895
1825
|
state = SetSubtitleLanguageState.DONE;
|
|
1896
1826
|
break;
|
|
1897
1827
|
}
|
|
1898
1828
|
} catch (error) {
|
|
1899
|
-
sdkLogger.error(`
|
|
1829
|
+
sdkLogger.error(`remotePlayer _atomicSetSubtitleLanguage: textTrackId=${textTrackId} failed with error ${error.message}.`);
|
|
1900
1830
|
state = SetSubtitleLanguageState.DONE;
|
|
1901
1831
|
res = Promise.reject(error);
|
|
1902
1832
|
}
|
|
1903
1833
|
}
|
|
1904
1834
|
|
|
1905
|
-
if (!this._abortSetSubtitleLanguage) {
|
|
1906
|
-
sdkLogger.error("TARGET PLAYING STATE", this._targetSetSubtitlePlayingState);
|
|
1907
|
-
sdkLogger.error("TEXT TRACK VISIBILITY", this._textTrackVisibility);
|
|
1908
|
-
if (this._targetSetSubtitlePlayingState === TargetPlayingState.PLAYING_ABR && this._textTrackVisibility) {
|
|
1909
|
-
sdkLogger.error("BEFORE PLAY AFTER SET SUBTITLE 2");
|
|
1910
|
-
this._playSubtitle();
|
|
1911
|
-
}
|
|
1912
|
-
}
|
|
1913
1835
|
this._isSetSubtitleByApplication = false;
|
|
1914
|
-
sdkLogger.
|
|
1915
|
-
return res
|
|
1836
|
+
sdkLogger.log(`remotePlayer _atomicSetSubtitleLanguage: textTrackId=${textTrackId} ended.`);
|
|
1837
|
+
return res;
|
|
1916
1838
|
}
|
|
1917
1839
|
|
|
1918
|
-
async _atomicSetAudioLanguage() {
|
|
1919
|
-
sdkLogger.info("SetAudioLanguage: local video element set start while isPLaying=", this._isPlaying);
|
|
1920
|
-
|
|
1921
|
-
this._targetSetAudioPlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
|
|
1922
|
-
this._abortSetAudioLanguage = false;
|
|
1923
|
-
this._isSetAudioByApplication = true;
|
|
1924
|
-
|
|
1925
|
-
let state = SetAudioLanguageState.INIT;
|
|
1926
|
-
|
|
1927
|
-
let previousPendingAudioLanguage = this._pendingAudioLanguage;
|
|
1928
|
-
let initialAudioLanguage= this._pendingAudioLanguage;
|
|
1929
|
-
let res;
|
|
1930
|
-
|
|
1931
|
-
while (!this._abortSetAudioLanguage && state !== SetAudioLanguageState.DONE) {
|
|
1932
|
-
try {
|
|
1933
|
-
|
|
1934
|
-
switch(state) {
|
|
1935
|
-
case SetAudioLanguageState.INIT:
|
|
1936
|
-
state = this._isPlaying ? SetAudioLanguageState.STOPPED : SetAudioLanguageState.SET;
|
|
1937
|
-
break;
|
|
1938
|
-
case SetAudioLanguageState.STOPPED:
|
|
1939
|
-
await this._stopAudio();
|
|
1940
|
-
state = SetAudioLanguageState.SET;
|
|
1941
|
-
break;
|
|
1942
|
-
case SetAudioLanguageState.SET:
|
|
1943
|
-
initialAudioLanguage = this._pendingAudioLanguage;
|
|
1944
|
-
previousPendingAudioLanguage = this._selectedAudioTrack;
|
|
1945
|
-
res = await this._selectAudioTrackV3(initialAudioLanguage, previousPendingAudioLanguage);
|
|
1946
|
-
sdkLogger.error("BEFORE PLAY AFTER SET AUDIO 1");
|
|
1947
|
-
state = SetAudioLanguageState.DONE;
|
|
1948
|
-
break;
|
|
1949
|
-
}
|
|
1950
|
-
} catch (error) {
|
|
1951
|
-
sdkLogger.error(`Error during set audio process: ${error.message}`);
|
|
1952
|
-
state = SetAudioLanguageState.DONE;
|
|
1953
|
-
res = Promise.reject(error);
|
|
1954
|
-
}
|
|
1955
|
-
}
|
|
1956
|
-
|
|
1957
|
-
if (!this._abortSetAudioLanguage) {
|
|
1958
|
-
sdkLogger.error("TARGET PLAYING STATE", this._targetSetAudioPlayingState);
|
|
1959
|
-
if (this._targetSetAudioPlayingState === TargetPlayingState.PLAYING_UI) {
|
|
1960
|
-
sdkLogger.error("BEFORE PLAY AFTER SET AUDIO 2");
|
|
1961
|
-
this._play();
|
|
1962
|
-
}
|
|
1963
|
-
}
|
|
1964
|
-
|
|
1965
|
-
this._isSetAudioByApplication = false;
|
|
1966
|
-
sdkLogger.info("SetAudioLanguage: local video element set audio end");
|
|
1967
|
-
return res
|
|
1968
|
-
}
|
|
1969
1840
|
}
|
|
1970
1841
|
/**
|
|
1971
1842
|
*
|
package/src/utils.js
CHANGED
|
@@ -159,8 +159,7 @@ export const SetAudioLanguageState = Object.freeze({
|
|
|
159
159
|
INIT: "init",
|
|
160
160
|
STOPPED: "stopped",
|
|
161
161
|
SET: "set",
|
|
162
|
-
|
|
163
|
-
WAITING: "waiting",
|
|
162
|
+
PLAYING: "playing",
|
|
164
163
|
DONE: "done"
|
|
165
164
|
});
|
|
166
165
|
|
|
@@ -168,8 +167,7 @@ export const SetSubtitleLanguageState = Object.freeze({
|
|
|
168
167
|
INIT: "init",
|
|
169
168
|
STOPPED: "stopped",
|
|
170
169
|
SET: "set",
|
|
171
|
-
|
|
172
|
-
WAITING: "waiting",
|
|
170
|
+
PLAYING: "playing",
|
|
173
171
|
DONE: "done"
|
|
174
172
|
});
|
|
175
173
|
|