@microsoft/live-share-media 1.0.0-preview.11 → 1.0.0-preview.12
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/README.md +1 -1
- package/bin/EphemeralMediaSession.d.ts +102 -0
- package/bin/EphemeralMediaSession.d.ts.map +1 -0
- package/bin/EphemeralMediaSession.js +226 -0
- package/bin/EphemeralMediaSession.js.map +1 -0
- package/bin/EphemeralMediaSessionCoordinator.d.ts +228 -0
- package/bin/EphemeralMediaSessionCoordinator.d.ts.map +1 -0
- package/bin/EphemeralMediaSessionCoordinator.js +396 -0
- package/bin/EphemeralMediaSessionCoordinator.js.map +1 -0
- package/bin/EphemeralMediaSessionCoordinatorSuspension.d.ts +20 -0
- package/bin/EphemeralMediaSessionCoordinatorSuspension.d.ts.map +1 -0
- package/bin/EphemeralMediaSessionCoordinatorSuspension.js +28 -0
- package/bin/EphemeralMediaSessionCoordinatorSuspension.js.map +1 -0
- package/bin/IMediaPlayer.d.ts +21 -0
- package/bin/IMediaPlayer.d.ts.map +1 -0
- package/bin/IMediaPlayer.js +7 -0
- package/bin/IMediaPlayer.js.map +1 -0
- package/bin/LiveMediaSession.d.ts +95 -0
- package/bin/LiveMediaSession.d.ts.map +1 -0
- package/bin/LiveMediaSession.js +232 -0
- package/bin/LiveMediaSession.js.map +1 -0
- package/bin/LiveMediaSessionCoordinator.d.ts +228 -0
- package/bin/LiveMediaSessionCoordinator.d.ts.map +1 -0
- package/bin/LiveMediaSessionCoordinator.js +408 -0
- package/bin/LiveMediaSessionCoordinator.js.map +1 -0
- package/bin/LiveMediaSessionCoordinatorSuspension.d.ts +20 -0
- package/bin/LiveMediaSessionCoordinatorSuspension.d.ts.map +1 -0
- package/bin/LiveMediaSessionCoordinatorSuspension.js +28 -0
- package/bin/LiveMediaSessionCoordinatorSuspension.js.map +1 -0
- package/bin/MediaPlayerSynchronizer.d.ts +164 -0
- package/bin/MediaPlayerSynchronizer.d.ts.map +1 -0
- package/bin/MediaPlayerSynchronizer.js +469 -0
- package/bin/MediaPlayerSynchronizer.js.map +1 -0
- package/bin/MediaSessionActionThrottler.d.ts +12 -0
- package/bin/MediaSessionActionThrottler.d.ts.map +1 -0
- package/bin/MediaSessionActionThrottler.js +14 -0
- package/bin/MediaSessionActionThrottler.js.map +1 -0
- package/bin/MediaSessionExtensions.d.ts +35 -0
- package/bin/MediaSessionExtensions.d.ts.map +1 -0
- package/bin/MediaSessionExtensions.js +13 -0
- package/bin/MediaSessionExtensions.js.map +1 -0
- package/bin/RepeatedActionThrottler.d.ts +20 -0
- package/bin/RepeatedActionThrottler.d.ts.map +1 -0
- package/bin/RepeatedActionThrottler.js +63 -0
- package/bin/RepeatedActionThrottler.js.map +1 -0
- package/bin/VolumeLimiter.d.ts +70 -0
- package/bin/VolumeLimiter.d.ts.map +1 -0
- package/bin/VolumeLimiter.js +170 -0
- package/bin/VolumeLimiter.js.map +1 -0
- package/bin/VolumeManager.d.ts +84 -0
- package/bin/VolumeManager.d.ts.map +1 -0
- package/bin/VolumeManager.js +175 -0
- package/bin/VolumeManager.js.map +1 -0
- package/bin/index.d.ts +14 -0
- package/bin/index.d.ts.map +1 -0
- package/bin/index.js +30 -0
- package/bin/index.js.map +1 -0
- package/bin/internals/GroupCoordinatorState.d.ts +93 -0
- package/bin/internals/GroupCoordinatorState.d.ts.map +1 -0
- package/bin/internals/GroupCoordinatorState.js +405 -0
- package/bin/internals/GroupCoordinatorState.js.map +1 -0
- package/bin/internals/GroupPlaybackPosition.d.ts +67 -0
- package/bin/internals/GroupPlaybackPosition.d.ts.map +1 -0
- package/bin/internals/GroupPlaybackPosition.js +167 -0
- package/bin/internals/GroupPlaybackPosition.js.map +1 -0
- package/bin/internals/GroupPlaybackTrack.d.ts +46 -0
- package/bin/internals/GroupPlaybackTrack.d.ts.map +1 -0
- package/bin/internals/GroupPlaybackTrack.js +122 -0
- package/bin/internals/GroupPlaybackTrack.js.map +1 -0
- package/bin/internals/GroupPlaybackTrackData.d.ts +40 -0
- package/bin/internals/GroupPlaybackTrackData.d.ts.map +1 -0
- package/bin/internals/GroupPlaybackTrackData.js +70 -0
- package/bin/internals/GroupPlaybackTrackData.js.map +1 -0
- package/bin/internals/GroupTransportState.d.ts +49 -0
- package/bin/internals/GroupTransportState.d.ts.map +1 -0
- package/bin/internals/GroupTransportState.js +112 -0
- package/bin/internals/GroupTransportState.js.map +1 -0
- package/bin/internals/consts.d.ts +73 -0
- package/bin/internals/consts.d.ts.map +1 -0
- package/bin/internals/consts.js +82 -0
- package/bin/internals/consts.js.map +1 -0
- package/bin/internals/index.d.ts +11 -0
- package/bin/internals/index.d.ts.map +1 -0
- package/bin/internals/index.js +27 -0
- package/bin/internals/index.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
4
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.GroupPlaybackPosition = void 0;
|
|
8
|
+
const live_share_1 = require("@microsoft/live-share");
|
|
9
|
+
const GroupPlaybackTrack_1 = require("./GroupPlaybackTrack");
|
|
10
|
+
/**
|
|
11
|
+
* @hidden
|
|
12
|
+
*/
|
|
13
|
+
class GroupPlaybackPosition {
|
|
14
|
+
constructor(transportState, runtime, updateInterval) {
|
|
15
|
+
this._transportState = transportState;
|
|
16
|
+
this._runtime = runtime;
|
|
17
|
+
this._updateInterval = updateInterval;
|
|
18
|
+
this._positions = new Map();
|
|
19
|
+
// Listen for track change
|
|
20
|
+
this._transportState.track.on(GroupPlaybackTrack_1.GroupPlaybackTrackEvents.trackChange, (_) => {
|
|
21
|
+
// Reset position tracking and duration
|
|
22
|
+
this._positions = new Map();
|
|
23
|
+
this.mediaDuration = undefined;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Returns the latest position info for the local client.
|
|
28
|
+
*/
|
|
29
|
+
get localPosition() {
|
|
30
|
+
return this._positions.get(this._runtime.clientId);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Returns the total number of clients actively being tracked.
|
|
34
|
+
*/
|
|
35
|
+
get totalClients() {
|
|
36
|
+
let cnt = 0;
|
|
37
|
+
this.forEach((_) => cnt++);
|
|
38
|
+
return cnt;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Returns true if all clients being tracked are reporting that they have
|
|
42
|
+
* either ended or haven't started.
|
|
43
|
+
*/
|
|
44
|
+
get trackEnded() {
|
|
45
|
+
let playing = 0;
|
|
46
|
+
this.forEach((position, projectedPosition) => {
|
|
47
|
+
switch (position.playbackState) {
|
|
48
|
+
case "none":
|
|
49
|
+
case "ended":
|
|
50
|
+
// not playing.
|
|
51
|
+
break;
|
|
52
|
+
default:
|
|
53
|
+
playing++;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
return playing == 0;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Returns the number of clients we're waiting for before we can stop waiting.
|
|
61
|
+
*/
|
|
62
|
+
get clientsWaiting() {
|
|
63
|
+
var _a;
|
|
64
|
+
let cnt = 0;
|
|
65
|
+
const waitPoint = (_a = this.localPosition) === null || _a === void 0 ? void 0 : _a.waitPoint;
|
|
66
|
+
if (waitPoint &&
|
|
67
|
+
(waitPoint.maxClients == undefined ||
|
|
68
|
+
this.totalClients <= waitPoint.maxClients)) {
|
|
69
|
+
this.forEach((position, projectedPosition) => {
|
|
70
|
+
if (position.playbackState == "suspended" &&
|
|
71
|
+
position.waitPoint) {
|
|
72
|
+
cnt++;
|
|
73
|
+
}
|
|
74
|
+
else if (position.position < waitPoint.position) {
|
|
75
|
+
cnt++;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return cnt;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Returns the max playback position relative to the start position.
|
|
83
|
+
*
|
|
84
|
+
* @remarks
|
|
85
|
+
* This is called when calculating the current seekTo position.
|
|
86
|
+
*/
|
|
87
|
+
get maxPosition() {
|
|
88
|
+
if (this._transportState.playbackState == "playing") {
|
|
89
|
+
const now = live_share_1.LiveShareClient.getTimestamp();
|
|
90
|
+
const projected = this._transportState.startPosition +
|
|
91
|
+
(now - this._transportState.timestamp) / 1000;
|
|
92
|
+
return this.limitProjectedPosition(projected);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
return this._transportState.startPosition;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
get targetPosition() {
|
|
99
|
+
if (this._transportState.playbackState == "playing") {
|
|
100
|
+
return this.getMostProgressedPosition();
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
return this._transportState.startPosition;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Enumerates every reported playback position.
|
|
108
|
+
* @param callbackFn Function applied to each position,
|
|
109
|
+
*/
|
|
110
|
+
forEach(callbackFn) {
|
|
111
|
+
var _a;
|
|
112
|
+
const now = live_share_1.LiveShareClient.getTimestamp();
|
|
113
|
+
const ignoreBefore = now - this._updateInterval.milliseconds * 2;
|
|
114
|
+
const shouldProject = !((_a = this._transportState.track.metadata) === null || _a === void 0 ? void 0 : _a.liveStream);
|
|
115
|
+
this._positions.forEach((value, key) => {
|
|
116
|
+
const position = this._positions.get(key);
|
|
117
|
+
// Ignore any old updates
|
|
118
|
+
if (position.timestamp > ignoreBefore) {
|
|
119
|
+
// Compute projected playback position
|
|
120
|
+
// - This computation does not take into account future wait points.
|
|
121
|
+
const projected = position.playbackState == "playing" && shouldProject
|
|
122
|
+
? position.position + (now - position.timestamp) / 1000
|
|
123
|
+
: position.position;
|
|
124
|
+
callbackFn(position, this.limitProjectedPosition(projected));
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
UpdatePlaybackPosition(position) {
|
|
129
|
+
// Update duration
|
|
130
|
+
if (position.duration != undefined) {
|
|
131
|
+
this.mediaDuration = position.duration;
|
|
132
|
+
}
|
|
133
|
+
// Save last position
|
|
134
|
+
if (this._positions.has(position.clientId)) {
|
|
135
|
+
// Only update if newer position
|
|
136
|
+
const current = this._positions.get(position.clientId);
|
|
137
|
+
if (position.timestamp >= current.timestamp) {
|
|
138
|
+
this._positions.set(position.clientId, position);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
this._positions.set(position.clientId, position);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
getMostProgressedPosition() {
|
|
146
|
+
// Compute the max possible position for the current transport state.
|
|
147
|
+
// - This is needed to properly handle seeking backwards in time. Some playback heads may
|
|
148
|
+
// not have performed their seek yet and will therefore be ahead of the local player.
|
|
149
|
+
const maxPosition = this.maxPosition;
|
|
150
|
+
// Compute max progress
|
|
151
|
+
let progress = -1;
|
|
152
|
+
this.forEach((position, projectedPosition) => {
|
|
153
|
+
if (projectedPosition <= maxPosition &&
|
|
154
|
+
projectedPosition > progress) {
|
|
155
|
+
progress = projectedPosition;
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
return progress;
|
|
159
|
+
}
|
|
160
|
+
limitProjectedPosition(position) {
|
|
161
|
+
return this.mediaDuration != undefined
|
|
162
|
+
? Math.min(position, this.mediaDuration)
|
|
163
|
+
: position;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.GroupPlaybackPosition = GroupPlaybackPosition;
|
|
167
|
+
//# sourceMappingURL=GroupPlaybackPosition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupPlaybackPosition.js","sourceRoot":"","sources":["../../src/internals/GroupPlaybackPosition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
4
|
+
*/
|
|
5
|
+
/// <reference types="node" />
|
|
6
|
+
import { IEvent } from "@microsoft/live-share";
|
|
7
|
+
import EventEmitter from "events";
|
|
8
|
+
import { IMediaPlayerState } from "../LiveMediaSessionCoordinator";
|
|
9
|
+
import { CoordinationWaitPoint, ExtendedMediaMetadata } from "../MediaSessionExtensions";
|
|
10
|
+
/**
|
|
11
|
+
* @hidden
|
|
12
|
+
*/
|
|
13
|
+
export interface IPlaybackTrack {
|
|
14
|
+
metadata: ExtendedMediaMetadata | null;
|
|
15
|
+
waitPoints: CoordinationWaitPoint[];
|
|
16
|
+
timestamp: number;
|
|
17
|
+
clientId: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @hidden
|
|
21
|
+
*/
|
|
22
|
+
export declare enum GroupPlaybackTrackEvents {
|
|
23
|
+
trackChange = "trackChange"
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* @hidden
|
|
27
|
+
*/
|
|
28
|
+
export interface IPlaybackTrackChangeEvent extends IEvent {
|
|
29
|
+
metadata: ExtendedMediaMetadata | null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* @hidden
|
|
33
|
+
*/
|
|
34
|
+
export declare class GroupPlaybackTrack extends EventEmitter {
|
|
35
|
+
private readonly _getMediaPlayerState;
|
|
36
|
+
private _current;
|
|
37
|
+
constructor(getMediaPlayerState: () => IMediaPlayerState);
|
|
38
|
+
get current(): Readonly<IPlaybackTrack>;
|
|
39
|
+
get metadata(): ExtendedMediaMetadata | null;
|
|
40
|
+
addWaitPoint(waitPoint: CoordinationWaitPoint): boolean;
|
|
41
|
+
findNextWaitPoint(lastWaitPoint: CoordinationWaitPoint | undefined): CoordinationWaitPoint | undefined;
|
|
42
|
+
updateTrack(track: IPlaybackTrack): boolean;
|
|
43
|
+
compare(metadata: ExtendedMediaMetadata | null): boolean;
|
|
44
|
+
static compareMetadata(current: ExtendedMediaMetadata | null, metadata: ExtendedMediaMetadata | null): boolean;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=GroupPlaybackTrack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupPlaybackTrack.d.ts","sourceRoot":"","sources":["../../src/internals/GroupPlaybackTrack.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,YAAY,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EACH,qBAAqB,EACrB,qBAAqB,EACxB,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACvC,UAAU,EAAE,qBAAqB,EAAE,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,oBAAY,wBAAwB;IAChC,WAAW,gBAAgB;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,MAAM;IACrD,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;CAC1C;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAChD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA0B;IAC/D,OAAO,CAAC,QAAQ,CAAiB;gBAErB,mBAAmB,EAAE,MAAM,iBAAiB;IAWxD,IAAW,OAAO,IAAI,QAAQ,CAAC,cAAc,CAAC,CAO7C;IAED,IAAW,QAAQ,IAAI,qBAAqB,GAAG,IAAI,CAElD;IAEM,YAAY,CAAC,SAAS,EAAE,qBAAqB,GAAG,OAAO;IAkBvD,iBAAiB,CACpB,aAAa,EAAE,qBAAqB,GAAG,SAAS,GACjD,qBAAqB,GAAG,SAAS;IAa7B,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO;IAsD3C,OAAO,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,GAAG,OAAO;WAOjD,eAAe,CACzB,OAAO,EAAE,qBAAqB,GAAG,IAAI,EACrC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,GACvC,OAAO;CAUb"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
4
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.GroupPlaybackTrack = exports.GroupPlaybackTrackEvents = void 0;
|
|
11
|
+
const events_1 = __importDefault(require("events"));
|
|
12
|
+
/**
|
|
13
|
+
* @hidden
|
|
14
|
+
*/
|
|
15
|
+
var GroupPlaybackTrackEvents;
|
|
16
|
+
(function (GroupPlaybackTrackEvents) {
|
|
17
|
+
GroupPlaybackTrackEvents["trackChange"] = "trackChange";
|
|
18
|
+
})(GroupPlaybackTrackEvents = exports.GroupPlaybackTrackEvents || (exports.GroupPlaybackTrackEvents = {}));
|
|
19
|
+
/**
|
|
20
|
+
* @hidden
|
|
21
|
+
*/
|
|
22
|
+
class GroupPlaybackTrack extends events_1.default {
|
|
23
|
+
constructor(getMediaPlayerState) {
|
|
24
|
+
super();
|
|
25
|
+
this._current = {
|
|
26
|
+
metadata: null,
|
|
27
|
+
waitPoints: [],
|
|
28
|
+
timestamp: 0,
|
|
29
|
+
clientId: "",
|
|
30
|
+
};
|
|
31
|
+
this._getMediaPlayerState = getMediaPlayerState;
|
|
32
|
+
}
|
|
33
|
+
get current() {
|
|
34
|
+
// Populate with sessions current metadata if null
|
|
35
|
+
if (!this._current.metadata) {
|
|
36
|
+
this._current.metadata = this._getMediaPlayerState().metadata;
|
|
37
|
+
}
|
|
38
|
+
return this._current;
|
|
39
|
+
}
|
|
40
|
+
get metadata() {
|
|
41
|
+
return this.current.metadata;
|
|
42
|
+
}
|
|
43
|
+
addWaitPoint(waitPoint) {
|
|
44
|
+
for (let i = 0; i < this._current.waitPoints.length; i++) {
|
|
45
|
+
const current = this._current.waitPoints[i];
|
|
46
|
+
if (current.position == waitPoint.position) {
|
|
47
|
+
// Already exists
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
else if (current.position > waitPoint.position) {
|
|
51
|
+
// Insert before current position
|
|
52
|
+
this._current.waitPoints.splice(i, 0, waitPoint);
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Append to list
|
|
57
|
+
this._current.waitPoints.push(waitPoint);
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
findNextWaitPoint(lastWaitPoint) {
|
|
61
|
+
const waitPoints = this._current.waitPoints || [];
|
|
62
|
+
for (const waitPoint of waitPoints) {
|
|
63
|
+
if (lastWaitPoint && waitPoint.position <= lastWaitPoint.position) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
return waitPoint;
|
|
67
|
+
}
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
updateTrack(track) {
|
|
71
|
+
// Guard against missing waitPoints collection
|
|
72
|
+
if (!Array.isArray(track.waitPoints)) {
|
|
73
|
+
track.waitPoints = [];
|
|
74
|
+
}
|
|
75
|
+
// Is this the same track?
|
|
76
|
+
const current = this.current;
|
|
77
|
+
if (GroupPlaybackTrack.compareMetadata(this.current.metadata, track.metadata)) {
|
|
78
|
+
// Add any dynamic wait points.
|
|
79
|
+
track.waitPoints.forEach((waitPoint) => {
|
|
80
|
+
this.addWaitPoint(waitPoint);
|
|
81
|
+
});
|
|
82
|
+
// Ignore if same playback state
|
|
83
|
+
if (track.timestamp == current.timestamp &&
|
|
84
|
+
track.clientId == current.clientId) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Ignore state changes that are older
|
|
89
|
+
if (track.timestamp < current.timestamp) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
// Ignore state changes that are from a clientId that sorts higher then the current one.
|
|
93
|
+
// - current.clientId should not be empty if current.timestamp != 0
|
|
94
|
+
if (track.timestamp == current.timestamp &&
|
|
95
|
+
track.clientId.localeCompare(current.clientId) > 0) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
// Update current track
|
|
99
|
+
this._current = track;
|
|
100
|
+
// Notify listeners
|
|
101
|
+
this.emit(GroupPlaybackTrackEvents.trackChange, {
|
|
102
|
+
name: GroupPlaybackTrackEvents.trackChange,
|
|
103
|
+
metadata: track.metadata,
|
|
104
|
+
});
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
compare(metadata) {
|
|
108
|
+
return GroupPlaybackTrack.compareMetadata(this.current.metadata, metadata);
|
|
109
|
+
}
|
|
110
|
+
static compareMetadata(current, metadata) {
|
|
111
|
+
// Only compare when we have two metadata instances
|
|
112
|
+
if (current && metadata) {
|
|
113
|
+
return JSON.stringify(current) == JSON.stringify(metadata);
|
|
114
|
+
}
|
|
115
|
+
else if (!current && metadata) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
exports.GroupPlaybackTrack = GroupPlaybackTrack;
|
|
122
|
+
//# sourceMappingURL=GroupPlaybackTrack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupPlaybackTrack.js","sourceRoot":"","sources":["../../src/internals/GroupPlaybackTrack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
4
|
+
*/
|
|
5
|
+
/// <reference types="node" />
|
|
6
|
+
import { IEvent } from "@microsoft/live-share";
|
|
7
|
+
import EventEmitter from "events";
|
|
8
|
+
import { GroupPlaybackTrack } from "./GroupPlaybackTrack";
|
|
9
|
+
/**
|
|
10
|
+
* @hidden
|
|
11
|
+
*/
|
|
12
|
+
export interface IPlaybackTrackData {
|
|
13
|
+
data: object | null;
|
|
14
|
+
timestamp: number;
|
|
15
|
+
clientId: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* @hidden
|
|
19
|
+
*/
|
|
20
|
+
export declare enum PlaybackTrackDataEvents {
|
|
21
|
+
dataChange = "dataChange"
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @hidden
|
|
25
|
+
*/
|
|
26
|
+
export interface IPlaybackTrackDataChangeEvent extends IEvent {
|
|
27
|
+
data: object | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* @hidden
|
|
31
|
+
*/
|
|
32
|
+
export declare class GroupPlaybackTrackData extends EventEmitter {
|
|
33
|
+
private _track;
|
|
34
|
+
private _current;
|
|
35
|
+
constructor(track: GroupPlaybackTrack);
|
|
36
|
+
get current(): Readonly<IPlaybackTrackData>;
|
|
37
|
+
get data(): object | null;
|
|
38
|
+
updateData(event: IPlaybackTrackData): boolean;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=GroupPlaybackTrackData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupPlaybackTrackData.d.ts","sourceRoot":"","sources":["../../src/internals/GroupPlaybackTrackData.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,YAAY,MAAM,QAAQ,CAAC;AAClC,OAAO,EACH,kBAAkB,EAErB,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,oBAAY,uBAAuB;IAC/B,UAAU,eAAe;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,6BAA8B,SAAQ,MAAM;IACzD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;IACpD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAqB;gBAEzB,KAAK,EAAE,kBAAkB;IAgBrC,IAAW,OAAO,IAAI,QAAQ,CAAC,kBAAkB,CAAC,CAEjD;IAED,IAAW,IAAI,IAAI,MAAM,GAAG,IAAI,CAE/B;IAEM,UAAU,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO;CA+BxD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
4
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.GroupPlaybackTrackData = exports.PlaybackTrackDataEvents = void 0;
|
|
11
|
+
const events_1 = __importDefault(require("events"));
|
|
12
|
+
const GroupPlaybackTrack_1 = require("./GroupPlaybackTrack");
|
|
13
|
+
/**
|
|
14
|
+
* @hidden
|
|
15
|
+
*/
|
|
16
|
+
var PlaybackTrackDataEvents;
|
|
17
|
+
(function (PlaybackTrackDataEvents) {
|
|
18
|
+
PlaybackTrackDataEvents["dataChange"] = "dataChange";
|
|
19
|
+
})(PlaybackTrackDataEvents = exports.PlaybackTrackDataEvents || (exports.PlaybackTrackDataEvents = {}));
|
|
20
|
+
/**
|
|
21
|
+
* @hidden
|
|
22
|
+
*/
|
|
23
|
+
class GroupPlaybackTrackData extends events_1.default {
|
|
24
|
+
constructor(track) {
|
|
25
|
+
super();
|
|
26
|
+
this._track = track;
|
|
27
|
+
this._current = { data: null, timestamp: 0, clientId: "" };
|
|
28
|
+
// Listen for track changes
|
|
29
|
+
this._track.on(GroupPlaybackTrack_1.GroupPlaybackTrackEvents.trackChange, () => {
|
|
30
|
+
// Track changed so reset state to empty object
|
|
31
|
+
this._current = {
|
|
32
|
+
data: null,
|
|
33
|
+
timestamp: this._track.current.timestamp,
|
|
34
|
+
clientId: this._track.current.clientId,
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
get current() {
|
|
39
|
+
return this._current;
|
|
40
|
+
}
|
|
41
|
+
get data() {
|
|
42
|
+
return this.current.data;
|
|
43
|
+
}
|
|
44
|
+
updateData(event) {
|
|
45
|
+
// Ignore state changes that are older
|
|
46
|
+
const current = this.current;
|
|
47
|
+
if (event.timestamp < current.timestamp) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
// Ignore state changes that have the same timestamp and the clientId sorts higher.
|
|
51
|
+
if (event.timestamp == current.timestamp &&
|
|
52
|
+
event.clientId.localeCompare(current.clientId) > 0) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
// Ignore state changes for same data object
|
|
56
|
+
if (JSON.stringify(current.data) == JSON.stringify(event.data)) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
// Update current data
|
|
60
|
+
this._current = event;
|
|
61
|
+
// Notify listeners
|
|
62
|
+
this.emit(PlaybackTrackDataEvents.dataChange, {
|
|
63
|
+
type: PlaybackTrackDataEvents.dataChange,
|
|
64
|
+
data: event.data,
|
|
65
|
+
});
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.GroupPlaybackTrackData = GroupPlaybackTrackData;
|
|
70
|
+
//# sourceMappingURL=GroupPlaybackTrackData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupPlaybackTrackData.js","sourceRoot":"","sources":["../../src/internals/GroupPlaybackTrackData.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAGH,oDAAkC;AAClC,6DAG8B;AAW9B;;GAEG;AACH,IAAY,uBAEX;AAFD,WAAY,uBAAuB;IAC/B,oDAAyB,CAAA;AAC7B,CAAC,EAFW,uBAAuB,GAAvB,+BAAuB,KAAvB,+BAAuB,QAElC;AASD;;GAEG;AACH,MAAa,sBAAuB,SAAQ,gBAAY;IAIpD,YAAY,KAAyB;QACjC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAE3D,2BAA2B;QAC3B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,6CAAwB,CAAC,WAAW,EAAE,GAAG,EAAE;YACtD,+CAA+C;YAC/C,IAAI,CAAC,QAAQ,GAAG;gBACZ,IAAI,EAAE,IAAI;gBACV,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS;gBACxC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ;aACzC,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7B,CAAC;IAEM,UAAU,CAAC,KAAyB;QACvC,sCAAsC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE;YACrC,OAAO,KAAK,CAAC;SAChB;QAED,mFAAmF;QACnF,IACI,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS;YACpC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EACpD;YACE,OAAO,KAAK,CAAC;SAChB;QAED,4CAA4C;QAC5C,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC5D,OAAO,KAAK,CAAC;SAChB;QAED,sBAAsB;QACtB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAEtB,mBAAmB;QACnB,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,UAAU,EAAE;YAC1C,IAAI,EAAE,uBAAuB,CAAC,UAAU;YACxC,IAAI,EAAE,KAAK,CAAC,IAAI;SACnB,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AA3DD,wDA2DC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
4
|
+
*/
|
|
5
|
+
/// <reference types="node" />
|
|
6
|
+
import { IEvent } from "@microsoft/live-share";
|
|
7
|
+
import EventEmitter from "events";
|
|
8
|
+
import { IMediaPlayerState } from "../LiveMediaSessionCoordinator";
|
|
9
|
+
import { ExtendedMediaSessionPlaybackState, ExtendedMediaSessionAction } from "../MediaSessionExtensions";
|
|
10
|
+
import { GroupPlaybackTrack } from "./GroupPlaybackTrack";
|
|
11
|
+
/**
|
|
12
|
+
* @hidden
|
|
13
|
+
*/
|
|
14
|
+
export interface ITransportState {
|
|
15
|
+
playbackState: ExtendedMediaSessionPlaybackState;
|
|
16
|
+
startPosition: number;
|
|
17
|
+
timestamp: number;
|
|
18
|
+
clientId: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* @hidden
|
|
22
|
+
*/
|
|
23
|
+
export declare enum GroupTransportStateEvents {
|
|
24
|
+
transportStateChange = "transportStateChange"
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* @hidden
|
|
28
|
+
*/
|
|
29
|
+
export interface ITransportStateChangeEvent extends IEvent {
|
|
30
|
+
action: ExtendedMediaSessionAction;
|
|
31
|
+
seekTime?: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* @hidden
|
|
35
|
+
*/
|
|
36
|
+
export declare class GroupTransportState extends EventEmitter {
|
|
37
|
+
private readonly _getMediaPlayerState;
|
|
38
|
+
private _track;
|
|
39
|
+
private _current;
|
|
40
|
+
constructor(track: GroupPlaybackTrack, getMediaPlayerState: () => IMediaPlayerState);
|
|
41
|
+
get current(): Readonly<ITransportState>;
|
|
42
|
+
get playbackState(): ExtendedMediaSessionPlaybackState;
|
|
43
|
+
get startPosition(): number;
|
|
44
|
+
get timestamp(): number;
|
|
45
|
+
get track(): GroupPlaybackTrack;
|
|
46
|
+
compare(state: ITransportState): boolean;
|
|
47
|
+
updateState(state: ITransportState): boolean;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=GroupTransportState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupTransportState.d.ts","sourceRoot":"","sources":["../../src/internals/GroupTransportState.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,MAAM,EAAmB,MAAM,uBAAuB,CAAC;AAChE,OAAO,YAAY,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EACH,iCAAiC,EACjC,0BAA0B,EAC7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACH,kBAAkB,EAErB,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,aAAa,EAAE,iCAAiC,CAAC;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,oBAAY,yBAAyB;IACjC,oBAAoB,yBAAyB;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,0BAA2B,SAAQ,MAAM;IACtD,MAAM,EAAE,0BAA0B,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA0B;IAC/D,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAkB;gBAG9B,KAAK,EAAE,kBAAkB,EACzB,mBAAmB,EAAE,MAAM,iBAAiB;IAwBhD,IAAW,OAAO,IAAI,QAAQ,CAAC,eAAe,CAAC,CAE9C;IAED,IAAW,aAAa,IAAI,iCAAiC,CAE5D;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED,IAAW,KAAK,IAAI,kBAAkB,CAErC;IAEM,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO;IAOxC,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO;CAqDtD"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
4
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.GroupTransportState = exports.GroupTransportStateEvents = void 0;
|
|
11
|
+
const live_share_1 = require("@microsoft/live-share");
|
|
12
|
+
const events_1 = __importDefault(require("events"));
|
|
13
|
+
const GroupPlaybackTrack_1 = require("./GroupPlaybackTrack");
|
|
14
|
+
/**
|
|
15
|
+
* @hidden
|
|
16
|
+
*/
|
|
17
|
+
var GroupTransportStateEvents;
|
|
18
|
+
(function (GroupTransportStateEvents) {
|
|
19
|
+
GroupTransportStateEvents["transportStateChange"] = "transportStateChange";
|
|
20
|
+
})(GroupTransportStateEvents = exports.GroupTransportStateEvents || (exports.GroupTransportStateEvents = {}));
|
|
21
|
+
/**
|
|
22
|
+
* @hidden
|
|
23
|
+
*/
|
|
24
|
+
class GroupTransportState extends events_1.default {
|
|
25
|
+
constructor(track, getMediaPlayerState) {
|
|
26
|
+
super();
|
|
27
|
+
this._getMediaPlayerState = getMediaPlayerState;
|
|
28
|
+
this._track = track;
|
|
29
|
+
this._current = {
|
|
30
|
+
playbackState: "none",
|
|
31
|
+
startPosition: 0.0,
|
|
32
|
+
timestamp: 0,
|
|
33
|
+
clientId: "",
|
|
34
|
+
};
|
|
35
|
+
// Listen for track changes
|
|
36
|
+
this._track.on(GroupPlaybackTrack_1.GroupPlaybackTrackEvents.trackChange, () => {
|
|
37
|
+
// Track changed so reset state to stopped ad position 0.0
|
|
38
|
+
this._current = {
|
|
39
|
+
playbackState: "none",
|
|
40
|
+
startPosition: 0.0,
|
|
41
|
+
timestamp: this._track.current.timestamp,
|
|
42
|
+
clientId: this._track.current.clientId,
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
get current() {
|
|
47
|
+
return this._current;
|
|
48
|
+
}
|
|
49
|
+
get playbackState() {
|
|
50
|
+
return this.current.playbackState;
|
|
51
|
+
}
|
|
52
|
+
get startPosition() {
|
|
53
|
+
return this.current.startPosition;
|
|
54
|
+
}
|
|
55
|
+
get timestamp() {
|
|
56
|
+
return this.current.timestamp;
|
|
57
|
+
}
|
|
58
|
+
get track() {
|
|
59
|
+
return this._track;
|
|
60
|
+
}
|
|
61
|
+
compare(state) {
|
|
62
|
+
return (this.current.playbackState == state.playbackState &&
|
|
63
|
+
this.current.startPosition == state.startPosition);
|
|
64
|
+
}
|
|
65
|
+
updateState(state) {
|
|
66
|
+
// Ignore if same playback state and start position
|
|
67
|
+
if (this.compare(state)) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
// Ignore state changes that are older
|
|
71
|
+
const originalState = this.current;
|
|
72
|
+
if (state.timestamp < originalState.timestamp) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
// Ignore state changes that have the same timestamp and the clientId sorts higher.
|
|
76
|
+
if (state.timestamp == originalState.timestamp &&
|
|
77
|
+
state.clientId.localeCompare(originalState.clientId) > 0) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
// Update playback state
|
|
81
|
+
this._current = state;
|
|
82
|
+
// Trigger transport change
|
|
83
|
+
const playerState = this._getMediaPlayerState().playbackState;
|
|
84
|
+
if (originalState.playbackState == state.playbackState &&
|
|
85
|
+
playerState != "ended") {
|
|
86
|
+
this.emit(GroupTransportStateEvents.transportStateChange, {
|
|
87
|
+
type: GroupTransportStateEvents.transportStateChange,
|
|
88
|
+
action: "seekto",
|
|
89
|
+
seekTime: state.startPosition,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
else if (state.playbackState == "playing") {
|
|
93
|
+
const now = live_share_1.LiveShareClient.getTimestamp();
|
|
94
|
+
const projectedPosition = state.startPosition + (now - state.timestamp) / 1000;
|
|
95
|
+
this.emit(GroupTransportStateEvents.transportStateChange, {
|
|
96
|
+
type: GroupTransportStateEvents.transportStateChange,
|
|
97
|
+
action: "play",
|
|
98
|
+
seekTime: projectedPosition,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
this.emit(GroupTransportStateEvents.transportStateChange, {
|
|
103
|
+
type: GroupTransportStateEvents.transportStateChange,
|
|
104
|
+
action: "pause",
|
|
105
|
+
seekTime: state.startPosition,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.GroupTransportState = GroupTransportState;
|
|
112
|
+
//# sourceMappingURL=GroupTransportState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupTransportState.js","sourceRoot":"","sources":["../../src/internals/GroupTransportState.ts"],"names":[],"mappings":"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"}
|