@microsoft/live-share-media 1.3.1 → 1.4.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/bin/LiveMediaSession.d.ts.map +1 -1
- package/bin/LiveMediaSession.js +8 -0
- package/bin/LiveMediaSession.js.map +1 -1
- package/bin/LiveMediaSessionCoordinator.d.ts +15 -0
- package/bin/LiveMediaSessionCoordinator.d.ts.map +1 -1
- package/bin/LiveMediaSessionCoordinator.js +25 -0
- package/bin/LiveMediaSessionCoordinator.js.map +1 -1
- package/bin/MediaPlayerSynchronizer.d.ts +6 -4
- package/bin/MediaPlayerSynchronizer.d.ts.map +1 -1
- package/bin/MediaPlayerSynchronizer.js +41 -12
- package/bin/MediaPlayerSynchronizer.js.map +1 -1
- package/bin/MediaSessionExtensions.d.ts +17 -4
- package/bin/MediaSessionExtensions.d.ts.map +1 -1
- package/bin/MediaSessionExtensions.js +4 -0
- package/bin/MediaSessionExtensions.js.map +1 -1
- package/bin/internals/GroupCoordinatorState.d.ts +15 -1
- package/bin/internals/GroupCoordinatorState.d.ts.map +1 -1
- package/bin/internals/GroupCoordinatorState.js +123 -57
- package/bin/internals/GroupCoordinatorState.js.map +1 -1
- package/bin/internals/GroupPlaybackPosition.d.ts +3 -1
- package/bin/internals/GroupPlaybackPosition.d.ts.map +1 -1
- package/bin/internals/GroupPlaybackPosition.js +7 -3
- package/bin/internals/GroupPlaybackPosition.js.map +1 -1
- package/bin/internals/GroupPlaybackRate.d.ts +39 -0
- package/bin/internals/GroupPlaybackRate.d.ts.map +1 -0
- package/bin/internals/GroupPlaybackRate.js +62 -0
- package/bin/internals/GroupPlaybackRate.js.map +1 -0
- package/bin/internals/GroupPlaybackTrack.d.ts +2 -2
- package/bin/internals/GroupPlaybackTrack.d.ts.map +1 -1
- package/bin/internals/GroupPlaybackTrack.js +3 -2
- package/bin/internals/GroupPlaybackTrack.js.map +1 -1
- package/bin/internals/GroupPlaybackTrackData.d.ts +3 -3
- package/bin/internals/GroupPlaybackTrackData.d.ts.map +1 -1
- package/bin/internals/GroupPlaybackTrackData.js +12 -11
- package/bin/internals/GroupPlaybackTrackData.js.map +1 -1
- package/bin/internals/GroupTransportState.d.ts +6 -3
- package/bin/internals/GroupTransportState.d.ts.map +1 -1
- package/bin/internals/GroupTransportState.js +16 -11
- package/bin/internals/GroupTransportState.js.map +1 -1
- package/bin/internals/consts.d.ts +8 -1
- package/bin/internals/consts.d.ts.map +1 -1
- package/bin/internals/consts.js +8 -1
- package/bin/internals/consts.js.map +1 -1
- package/bin/internals/index.d.ts +1 -0
- package/bin/internals/index.d.ts.map +1 -1
- package/bin/internals/index.js +1 -0
- package/bin/internals/index.js.map +1 -1
- package/bin/internals/interfaces.d.ts +10 -0
- package/bin/internals/interfaces.d.ts.map +1 -0
- package/bin/internals/interfaces.js +3 -0
- package/bin/internals/interfaces.js.map +1 -0
- package/package.json +3 -3
- package/src/LiveMediaSession.ts +12 -0
- package/src/LiveMediaSessionCoordinator.ts +49 -0
- package/src/MediaPlayerSynchronizer.ts +55 -15
- package/src/MediaSessionExtensions.ts +18 -2
- package/src/internals/GroupCoordinatorState.ts +196 -79
- package/src/internals/GroupPlaybackPosition.ts +9 -2
- package/src/internals/GroupPlaybackRate.ts +90 -0
- package/src/internals/GroupPlaybackTrack.ts +5 -4
- package/src/internals/GroupPlaybackTrackData.ts +14 -13
- package/src/internals/GroupTransportState.ts +21 -12
- package/src/internals/consts.ts +14 -2
- package/src/internals/index.ts +1 -0
- package/src/internals/interfaces.ts +10 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import EventEmitter from "events";
|
|
7
|
+
import { ExtendedMediaSessionActionSource } from "../MediaSessionExtensions";
|
|
8
|
+
import { IGroupStateEvent } from "./interfaces";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @hidden
|
|
12
|
+
*/
|
|
13
|
+
export interface IPlaybackRate {
|
|
14
|
+
playbackRate: number;
|
|
15
|
+
timestamp: number;
|
|
16
|
+
clientId: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @hidden
|
|
21
|
+
*/
|
|
22
|
+
export enum PlaybackRateEvents {
|
|
23
|
+
rateChange = "rateChange",
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @hidden
|
|
28
|
+
*/
|
|
29
|
+
export interface IPlaybackRateChangeEvent extends IGroupStateEvent {
|
|
30
|
+
playbackRate: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @hidden
|
|
35
|
+
*/
|
|
36
|
+
export class GroupPlaybackRate extends EventEmitter {
|
|
37
|
+
private _current: IPlaybackRate;
|
|
38
|
+
|
|
39
|
+
constructor() {
|
|
40
|
+
super();
|
|
41
|
+
this._current = { playbackRate: 1.0, timestamp: 0, clientId: "" };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public get current(): Readonly<IPlaybackRate> {
|
|
45
|
+
return this._current;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public get rate(): number {
|
|
49
|
+
return this.current.playbackRate;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public updatePlaybackRate(
|
|
53
|
+
newRate: IPlaybackRate,
|
|
54
|
+
source: ExtendedMediaSessionActionSource
|
|
55
|
+
): boolean {
|
|
56
|
+
// Ignore state changes that are older
|
|
57
|
+
const current = this.current;
|
|
58
|
+
if (newRate.timestamp < current.timestamp) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Ignore state changes that have the same timestamp and the clientId sorts higher.
|
|
63
|
+
if (
|
|
64
|
+
newRate.timestamp == current.timestamp &&
|
|
65
|
+
newRate.clientId.localeCompare(current.clientId) > 0
|
|
66
|
+
) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Ignore state changes for same data object
|
|
71
|
+
if (current.playbackRate == newRate.playbackRate) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Update current data
|
|
76
|
+
this._current = newRate;
|
|
77
|
+
|
|
78
|
+
const event: IPlaybackRateChangeEvent = {
|
|
79
|
+
name: PlaybackRateEvents.rateChange,
|
|
80
|
+
clientId: newRate.clientId,
|
|
81
|
+
playbackRate: newRate.playbackRate,
|
|
82
|
+
source,
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// Notify listeners
|
|
86
|
+
this.emit(PlaybackRateEvents.rateChange, event);
|
|
87
|
+
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
* Licensed under the Microsoft Live Share SDK License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { ILiveEvent } from "@microsoft/live-share";
|
|
7
6
|
import EventEmitter from "events";
|
|
8
7
|
import { IMediaPlayerState } from "../LiveMediaSessionCoordinator";
|
|
9
8
|
import {
|
|
@@ -11,6 +10,7 @@ import {
|
|
|
11
10
|
ExtendedMediaMetadata,
|
|
12
11
|
ExtendedMediaSessionActionSource,
|
|
13
12
|
} from "../MediaSessionExtensions";
|
|
13
|
+
import { IGroupStateEvent } from "./interfaces";
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* @hidden
|
|
@@ -32,7 +32,7 @@ export enum GroupPlaybackTrackEvents {
|
|
|
32
32
|
/**
|
|
33
33
|
* @hidden
|
|
34
34
|
*/
|
|
35
|
-
export interface IPlaybackTrackChangeEvent extends
|
|
35
|
+
export interface IPlaybackTrackChangeEvent extends IGroupStateEvent {
|
|
36
36
|
metadata: ExtendedMediaMetadata | null;
|
|
37
37
|
}
|
|
38
38
|
|
|
@@ -149,12 +149,13 @@ export class GroupPlaybackTrack extends EventEmitter {
|
|
|
149
149
|
this._current = track;
|
|
150
150
|
|
|
151
151
|
// Notify listeners
|
|
152
|
-
|
|
152
|
+
const event: IPlaybackTrackChangeEvent = {
|
|
153
153
|
name: GroupPlaybackTrackEvents.trackChange,
|
|
154
154
|
clientId: track.clientId,
|
|
155
155
|
metadata: track.metadata,
|
|
156
156
|
source,
|
|
157
|
-
}
|
|
157
|
+
};
|
|
158
|
+
this.emit(GroupPlaybackTrackEvents.trackChange, event);
|
|
158
159
|
|
|
159
160
|
return true;
|
|
160
161
|
}
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
* Licensed under the Microsoft Live Share SDK License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { ILiveEvent } from "@microsoft/live-share";
|
|
7
6
|
import EventEmitter from "events";
|
|
8
7
|
import {
|
|
9
8
|
GroupPlaybackTrack,
|
|
10
9
|
GroupPlaybackTrackEvents,
|
|
11
10
|
} from "./GroupPlaybackTrack";
|
|
12
11
|
import { ExtendedMediaSessionActionSource } from "../MediaSessionExtensions";
|
|
12
|
+
import { IGroupStateEvent } from "./interfaces";
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* @hidden
|
|
@@ -30,7 +30,7 @@ export enum PlaybackTrackDataEvents {
|
|
|
30
30
|
/**
|
|
31
31
|
* @hidden
|
|
32
32
|
*/
|
|
33
|
-
export interface IPlaybackTrackDataChangeEvent extends
|
|
33
|
+
export interface IPlaybackTrackDataChangeEvent extends IGroupStateEvent {
|
|
34
34
|
data: object | null;
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -66,38 +66,39 @@ export class GroupPlaybackTrackData extends EventEmitter {
|
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
public updateData(
|
|
69
|
-
|
|
69
|
+
trackData: IPlaybackTrackData,
|
|
70
70
|
source: ExtendedMediaSessionActionSource
|
|
71
71
|
): boolean {
|
|
72
72
|
// Ignore state changes that are older
|
|
73
73
|
const current = this.current;
|
|
74
|
-
if (
|
|
74
|
+
if (trackData.timestamp < current.timestamp) {
|
|
75
75
|
return false;
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
// Ignore state changes that have the same timestamp and the clientId sorts higher.
|
|
79
79
|
if (
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
trackData.timestamp == current.timestamp &&
|
|
81
|
+
trackData.clientId.localeCompare(current.clientId) > 0
|
|
82
82
|
) {
|
|
83
83
|
return false;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
// Ignore state changes for same data object
|
|
87
|
-
if (JSON.stringify(current.data) == JSON.stringify(
|
|
87
|
+
if (JSON.stringify(current.data) == JSON.stringify(trackData.data)) {
|
|
88
88
|
return false;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
// Update current data
|
|
92
|
-
this._current =
|
|
92
|
+
this._current = trackData;
|
|
93
93
|
|
|
94
94
|
// Notify listeners
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
clientId:
|
|
98
|
-
data:
|
|
95
|
+
const event: IPlaybackTrackDataChangeEvent = {
|
|
96
|
+
name: PlaybackTrackDataEvents.dataChange,
|
|
97
|
+
clientId: trackData.clientId,
|
|
98
|
+
data: trackData.data,
|
|
99
99
|
source,
|
|
100
|
-
}
|
|
100
|
+
};
|
|
101
|
+
this.emit(PlaybackTrackDataEvents.dataChange, event);
|
|
101
102
|
|
|
102
103
|
return true;
|
|
103
104
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under the Microsoft Live Share SDK License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { LiveShareRuntime } from "@microsoft/live-share";
|
|
7
7
|
import EventEmitter from "events";
|
|
8
8
|
import { IMediaPlayerState } from "../LiveMediaSessionCoordinator";
|
|
9
9
|
import {
|
|
@@ -15,6 +15,8 @@ import {
|
|
|
15
15
|
GroupPlaybackTrack,
|
|
16
16
|
GroupPlaybackTrackEvents,
|
|
17
17
|
} from "./GroupPlaybackTrack";
|
|
18
|
+
import { IGroupStateEvent } from "./interfaces";
|
|
19
|
+
import { GroupPlaybackRate } from "./GroupPlaybackRate";
|
|
18
20
|
|
|
19
21
|
/**
|
|
20
22
|
* @hidden
|
|
@@ -36,7 +38,7 @@ export enum GroupTransportStateEvents {
|
|
|
36
38
|
/**
|
|
37
39
|
* @hidden
|
|
38
40
|
*/
|
|
39
|
-
export interface ITransportStateChangeEvent extends
|
|
41
|
+
export interface ITransportStateChangeEvent extends IGroupStateEvent {
|
|
40
42
|
action: ExtendedMediaSessionAction;
|
|
41
43
|
seekTime?: number;
|
|
42
44
|
}
|
|
@@ -47,11 +49,13 @@ export interface ITransportStateChangeEvent extends ILiveEvent {
|
|
|
47
49
|
export class GroupTransportState extends EventEmitter {
|
|
48
50
|
private readonly _getMediaPlayerState: () => IMediaPlayerState;
|
|
49
51
|
private _track: GroupPlaybackTrack;
|
|
52
|
+
private _playbackRate: GroupPlaybackRate;
|
|
50
53
|
private readonly _liveRuntime: LiveShareRuntime;
|
|
51
54
|
private _current: ITransportState;
|
|
52
55
|
|
|
53
56
|
constructor(
|
|
54
57
|
track: GroupPlaybackTrack,
|
|
58
|
+
playbackRate: GroupPlaybackRate,
|
|
55
59
|
getMediaPlayerState: () => IMediaPlayerState,
|
|
56
60
|
liveRuntime: LiveShareRuntime
|
|
57
61
|
) {
|
|
@@ -59,6 +63,7 @@ export class GroupTransportState extends EventEmitter {
|
|
|
59
63
|
this._liveRuntime = liveRuntime;
|
|
60
64
|
this._getMediaPlayerState = getMediaPlayerState;
|
|
61
65
|
this._track = track;
|
|
66
|
+
this._playbackRate = playbackRate;
|
|
62
67
|
this._current = {
|
|
63
68
|
playbackState: "none",
|
|
64
69
|
startPosition: 0.0,
|
|
@@ -137,32 +142,36 @@ export class GroupTransportState extends EventEmitter {
|
|
|
137
142
|
originalState.playbackState == state.playbackState &&
|
|
138
143
|
playerState != "ended"
|
|
139
144
|
) {
|
|
140
|
-
|
|
141
|
-
|
|
145
|
+
const event: ITransportStateChangeEvent = {
|
|
146
|
+
name: GroupTransportStateEvents.transportStateChange,
|
|
142
147
|
action: "seekto",
|
|
143
148
|
clientId: state.clientId,
|
|
144
149
|
seekTime: state.startPosition,
|
|
145
150
|
source,
|
|
146
|
-
}
|
|
151
|
+
};
|
|
152
|
+
this.emit(GroupTransportStateEvents.transportStateChange, event);
|
|
147
153
|
} else if (state.playbackState == "playing") {
|
|
148
154
|
const now = this._liveRuntime.getTimestamp();
|
|
149
155
|
const projectedPosition =
|
|
150
|
-
state.startPosition +
|
|
151
|
-
|
|
152
|
-
|
|
156
|
+
state.startPosition +
|
|
157
|
+
((now - state.timestamp) / 1000) * this._playbackRate.rate;
|
|
158
|
+
const event: ITransportStateChangeEvent = {
|
|
159
|
+
name: GroupTransportStateEvents.transportStateChange,
|
|
153
160
|
action: "play",
|
|
154
161
|
clientId: state.clientId,
|
|
155
162
|
seekTime: projectedPosition,
|
|
156
163
|
source,
|
|
157
|
-
}
|
|
164
|
+
};
|
|
165
|
+
this.emit(GroupTransportStateEvents.transportStateChange, event);
|
|
158
166
|
} else {
|
|
159
|
-
|
|
160
|
-
|
|
167
|
+
const event: ITransportStateChangeEvent = {
|
|
168
|
+
name: GroupTransportStateEvents.transportStateChange,
|
|
161
169
|
action: "pause",
|
|
162
170
|
clientId: state.clientId,
|
|
163
171
|
seekTime: state.startPosition,
|
|
164
172
|
source,
|
|
165
|
-
}
|
|
173
|
+
};
|
|
174
|
+
this.emit(GroupTransportStateEvents.transportStateChange, event);
|
|
166
175
|
}
|
|
167
176
|
|
|
168
177
|
return true;
|
package/src/internals/consts.ts
CHANGED
|
@@ -16,6 +16,7 @@ export const TelemetryEvents = {
|
|
|
16
16
|
PlayAction: "MediaPlayerSynchronizer:PlayAction",
|
|
17
17
|
PauseAction: "MediaPlayerSynchronizer:PauseAction",
|
|
18
18
|
SeekToAction: "MediaPlayerSynchronizer:SeekToAction",
|
|
19
|
+
RateChangeAction: "MediaPlayerSynchronizer:RateChangeAction",
|
|
19
20
|
CatchupAction: "MediaPlayerSynchronizer:CatchupAction",
|
|
20
21
|
SetTrackAction: "MediaPlayerSynchronizer:SetTrackAction",
|
|
21
22
|
DataChangeAction: "MediaPlayerSynchronizer:DataChangeAction",
|
|
@@ -24,8 +25,6 @@ export const TelemetryEvents = {
|
|
|
24
25
|
),
|
|
25
26
|
UserTappedVideoToPlayError:
|
|
26
27
|
"MediaPlayerSynchronizer:UserTappedVideoToPlayError",
|
|
27
|
-
PlaybackRateChangeBlocked:
|
|
28
|
-
"MediaPlayerSynchronizer:PlaybackRateChangeBlocked",
|
|
29
28
|
PlayerBlockedOperation: transmit(
|
|
30
29
|
"MediaPlayerSynchronizer:PlayerBlockedOperation"
|
|
31
30
|
),
|
|
@@ -36,6 +35,7 @@ export const TelemetryEvents = {
|
|
|
36
35
|
PlayCalled: "MediaPlayerSynchronizer:PlayCalled",
|
|
37
36
|
PauseCalled: "MediaPlayerSynchronizer:PauseCalled",
|
|
38
37
|
SeekToCalled: "MediaPlayerSynchronizer:SeekToCalled",
|
|
38
|
+
RateChangeCalled: "MediaSession:RateChangeCalled",
|
|
39
39
|
SetTrackCalled: "MediaPlayerSynchronizer:SetTrackCalled",
|
|
40
40
|
SetTrackDataCalled: "MediaPlayerSynchronizer:SetTrackDataCalled",
|
|
41
41
|
},
|
|
@@ -43,6 +43,7 @@ export const TelemetryEvents = {
|
|
|
43
43
|
PlayAction: transmit("MediaSession:PlayAction"),
|
|
44
44
|
PauseAction: transmit("MediaSession:PauseAction"),
|
|
45
45
|
SeekToAction: transmit("MediaSession:SeekToAction"),
|
|
46
|
+
RateChangeAction: transmit("MediaSession:RateChangeAction"),
|
|
46
47
|
CatchUpAction: transmit("MediaSession:CatchUpAction"),
|
|
47
48
|
SetTrackAction: transmit("MediaSession:SetTrackAction"),
|
|
48
49
|
DataChangeAction: "MediaSession:DataChangeAction",
|
|
@@ -52,6 +53,9 @@ export const TelemetryEvents = {
|
|
|
52
53
|
PlayCalled: transmit("SessionCoordinator:PlayCalled"),
|
|
53
54
|
PauseCalled: transmit("SessionCoordinator:PauseCalled"),
|
|
54
55
|
SeekToCalled: transmit("SessionCoordinator:SeekToCalled"),
|
|
56
|
+
SetPlaybackRateCalled: transmit(
|
|
57
|
+
"SessionCoordinator:SetPlaybackRateCalled"
|
|
58
|
+
),
|
|
55
59
|
SetTrackCalled: transmit("SessionCoordinator:SetTrackCalled"),
|
|
56
60
|
SetTrackDataCalled: "SessionCoordinator:SetTrackDataCalled",
|
|
57
61
|
BeginSuspension: "SessionCoordinator:BeginSuspension",
|
|
@@ -74,6 +78,9 @@ export const TelemetryEvents = {
|
|
|
74
78
|
RemoteSeekToReceived: transmit(
|
|
75
79
|
"SessionCoordinator:RemoteSeekToReceived"
|
|
76
80
|
),
|
|
81
|
+
RemoteRateChangeReceived: transmit(
|
|
82
|
+
"SessionCoordinator:RemoteRateChangeReceived"
|
|
83
|
+
),
|
|
77
84
|
PositionUpdateEventError: "SessionCoordinator:PositionUpdateEventError",
|
|
78
85
|
LiveObjectSynchronizerStartError:
|
|
79
86
|
"SessionCoordinator:LiveObjectSynchronizerStartError",
|
|
@@ -86,12 +93,17 @@ export const TelemetryEvents = {
|
|
|
86
93
|
TransportStateChanged: "GroupCoordinator:TransportStateChanged",
|
|
87
94
|
TransportStateChangeDelayed:
|
|
88
95
|
"GroupCoordinator:TransportStateChangeDelayed",
|
|
96
|
+
PlaybackRateChanged: "GroupCoordinator:PlaybackRateChanged",
|
|
97
|
+
PlaybackRateChangedDelayed: "GroupCoordinator:PlaybackRateChanged",
|
|
89
98
|
BeginSoftSuspension: "GroupCoordinator:BeginSoftSuspension",
|
|
90
99
|
CheckingForSyncIssues: "GroupCoordinator:CheckingForSyncIssues",
|
|
91
100
|
TrackOutOfSync: transmit("GroupCoordinator:TrackOutOfSync"),
|
|
92
101
|
TrackDataOutOfSync: transmit("GroupCoordinator:TrackDataOutOfSync"),
|
|
93
102
|
TransportOutOfSync: transmit("GroupCoordinator:TransportOutOfSync"),
|
|
94
103
|
PositionOutOfSync: transmit("GroupCoordinator:PositionOutOfSync"),
|
|
104
|
+
PlaybackRateOutOfSync: transmit(
|
|
105
|
+
"GroupCoordinator:PlaybackRateOutOfSync"
|
|
106
|
+
),
|
|
95
107
|
},
|
|
96
108
|
};
|
|
97
109
|
|
package/src/internals/index.ts
CHANGED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { IEvent } from "@microsoft/live-share";
|
|
2
|
+
import { ExtendedMediaSessionActionSource } from "../MediaSessionExtensions";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @hidden
|
|
6
|
+
*/
|
|
7
|
+
export interface IGroupStateEvent extends IEvent {
|
|
8
|
+
clientId: string;
|
|
9
|
+
source: ExtendedMediaSessionActionSource;
|
|
10
|
+
}
|