@microsoft/live-share-media 0.5.0 → 0.5.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.
- package/.nycrc.json +10 -10
- package/LICENSE +86 -86
- package/README.md +137 -137
- package/package.json +38 -38
- package/src/EphemeralMediaSession.ts +248 -248
- package/src/EphemeralMediaSessionCoordinator.ts +461 -461
- package/src/EphemeralMediaSessionCoordinatorSuspension.ts +30 -30
- package/src/IMediaPlayer.ts +21 -21
- package/src/MediaPlayerSynchronizer.ts +449 -449
- package/src/MediaSessionActionThrottler.ts +14 -14
- package/src/MediaSessionExtensions.ts +42 -42
- package/src/RepeatedActionThrottler.ts +55 -55
- package/src/VolumeLimiter.ts +181 -181
- package/src/index.ts +15 -15
- package/src/internals/GroupCoordinatorState.ts +445 -445
- package/src/internals/GroupPlaybackPosition.ts +193 -193
- package/src/internals/GroupPlaybackTrack.ts +147 -147
- package/src/internals/GroupPlaybackTrackData.ts +90 -90
- package/src/internals/GroupTransportState.ts +127 -127
- package/src/internals/consts.ts +80 -80
- package/src/internals/index.ts +10 -10
- package/src/test/GroupPlaybackPosition.spec.ts +339 -339
- package/src/test/GroupPlaybackTrack.spec.ts +65 -65
- package/src/test/SharedMediaSession.spec.ts +113 -113
- package/src/test/SharedMediaSessionCoordinator.spec.ts +230 -230
- package/tsconfig.build.json +8 -8
- package/tsconfig.json +75 -75
|
@@ -1,147 +1,147 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
* Licensed under the Microsoft Live Share SDK License.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { IEvent } from '@microsoft/live-share';
|
|
7
|
-
import EventEmitter from 'events';
|
|
8
|
-
import { IMediaPlayerState } from '../EphemeralMediaSessionCoordinator';
|
|
9
|
-
import { CoordinationWaitPoint, ExtendedMediaMetadata } from '../MediaSessionExtensions';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* @hidden
|
|
13
|
-
*/
|
|
14
|
-
export interface IPlaybackTrack {
|
|
15
|
-
metadata: ExtendedMediaMetadata|null;
|
|
16
|
-
waitPoints: CoordinationWaitPoint[];
|
|
17
|
-
timestamp: number;
|
|
18
|
-
clientId: string;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* @hidden
|
|
24
|
-
*/
|
|
25
|
-
export enum GroupPlaybackTrackEvents {
|
|
26
|
-
trackChange = 'trackChange'
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* @hidden
|
|
31
|
-
*/
|
|
32
|
-
export interface IPlaybackTrackChangeEvent extends IEvent {
|
|
33
|
-
metadata: ExtendedMediaMetadata|null;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* @hidden
|
|
38
|
-
*/
|
|
39
|
-
export class GroupPlaybackTrack extends EventEmitter {
|
|
40
|
-
private readonly _getMediaPlayerState: () => IMediaPlayerState;
|
|
41
|
-
private _current: IPlaybackTrack;
|
|
42
|
-
|
|
43
|
-
constructor(getMediaPlayerState: () => IMediaPlayerState) {
|
|
44
|
-
super();
|
|
45
|
-
this._current = { metadata: null, waitPoints: [], timestamp: 0, clientId: '' };
|
|
46
|
-
this._getMediaPlayerState = getMediaPlayerState;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
public get current(): Readonly<IPlaybackTrack> {
|
|
50
|
-
// Populate with sessions current metadata if null
|
|
51
|
-
if (!this._current.metadata) {
|
|
52
|
-
this._current.metadata = this._getMediaPlayerState().metadata;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return this._current;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
public get metadata(): ExtendedMediaMetadata|null {
|
|
59
|
-
return this.current.metadata;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
public addWaitPoint(waitPoint: CoordinationWaitPoint): boolean {
|
|
63
|
-
for (let i = 0; i < this._current.waitPoints.length; i++) {
|
|
64
|
-
const current = this._current.waitPoints[i];
|
|
65
|
-
if (current.position == waitPoint.position) {
|
|
66
|
-
// Already exists
|
|
67
|
-
return false;
|
|
68
|
-
} else if (current.position > waitPoint.position) {
|
|
69
|
-
// Insert before current position
|
|
70
|
-
this._current.waitPoints.splice(i, 0, waitPoint);
|
|
71
|
-
return true;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Append to list
|
|
76
|
-
this._current.waitPoints.push(waitPoint);
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
public findNextWaitPoint(lastWaitPoint: CoordinationWaitPoint|undefined): CoordinationWaitPoint|undefined {
|
|
81
|
-
const waitPoints = this._current.waitPoints || [];
|
|
82
|
-
for (const waitPoint of waitPoints) {
|
|
83
|
-
if (lastWaitPoint && waitPoint.position <= lastWaitPoint.position) {
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return waitPoint;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return undefined;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
public updateTrack(track: IPlaybackTrack): boolean {
|
|
94
|
-
// Guard against missing waitPoints collection
|
|
95
|
-
if (!Array.isArray(track.waitPoints)) {
|
|
96
|
-
track.waitPoints = [];
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Is this the same track?
|
|
100
|
-
const current = this.current;
|
|
101
|
-
if (GroupPlaybackTrack.compareMetadata(this.current.metadata, track.metadata)) {
|
|
102
|
-
// Add any dynamic wait points.
|
|
103
|
-
track.waitPoints.forEach((waitPoint) => {
|
|
104
|
-
this.addWaitPoint(waitPoint);
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
// Ignore if same playback state
|
|
108
|
-
if (track.timestamp == current.timestamp && track.clientId == current.clientId) {
|
|
109
|
-
return false;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Ignore state changes that are older
|
|
114
|
-
if (track.timestamp < current.timestamp) {
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Ignore state changes that are from a clientId that sorts higher then the current one.
|
|
119
|
-
// - current.clientId should not be empty if current.timestamp != 0
|
|
120
|
-
if (track.timestamp == current.timestamp && track.clientId.localeCompare(current.clientId) > 0) {
|
|
121
|
-
return false;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Update current track
|
|
125
|
-
this._current = track;
|
|
126
|
-
|
|
127
|
-
// Notify listeners
|
|
128
|
-
this.emit(GroupPlaybackTrackEvents.trackChange, { name: GroupPlaybackTrackEvents.trackChange, metadata: track.metadata });
|
|
129
|
-
|
|
130
|
-
return true;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
public compare(metadata: ExtendedMediaMetadata|null): boolean {
|
|
134
|
-
return GroupPlaybackTrack.compareMetadata(this.current.metadata, metadata);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
public static compareMetadata(current: ExtendedMediaMetadata|null, metadata: ExtendedMediaMetadata|null): boolean {
|
|
138
|
-
// Only compare when we have two metadata instances
|
|
139
|
-
if (current && metadata) {
|
|
140
|
-
return JSON.stringify(current) == JSON.stringify(metadata);
|
|
141
|
-
} else if (!current && metadata) {
|
|
142
|
-
return false;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return true;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { IEvent } from '@microsoft/live-share';
|
|
7
|
+
import EventEmitter from 'events';
|
|
8
|
+
import { IMediaPlayerState } from '../EphemeralMediaSessionCoordinator';
|
|
9
|
+
import { CoordinationWaitPoint, ExtendedMediaMetadata } from '../MediaSessionExtensions';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @hidden
|
|
13
|
+
*/
|
|
14
|
+
export interface IPlaybackTrack {
|
|
15
|
+
metadata: ExtendedMediaMetadata|null;
|
|
16
|
+
waitPoints: CoordinationWaitPoint[];
|
|
17
|
+
timestamp: number;
|
|
18
|
+
clientId: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @hidden
|
|
24
|
+
*/
|
|
25
|
+
export enum GroupPlaybackTrackEvents {
|
|
26
|
+
trackChange = 'trackChange'
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @hidden
|
|
31
|
+
*/
|
|
32
|
+
export interface IPlaybackTrackChangeEvent extends IEvent {
|
|
33
|
+
metadata: ExtendedMediaMetadata|null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @hidden
|
|
38
|
+
*/
|
|
39
|
+
export class GroupPlaybackTrack extends EventEmitter {
|
|
40
|
+
private readonly _getMediaPlayerState: () => IMediaPlayerState;
|
|
41
|
+
private _current: IPlaybackTrack;
|
|
42
|
+
|
|
43
|
+
constructor(getMediaPlayerState: () => IMediaPlayerState) {
|
|
44
|
+
super();
|
|
45
|
+
this._current = { metadata: null, waitPoints: [], timestamp: 0, clientId: '' };
|
|
46
|
+
this._getMediaPlayerState = getMediaPlayerState;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public get current(): Readonly<IPlaybackTrack> {
|
|
50
|
+
// Populate with sessions current metadata if null
|
|
51
|
+
if (!this._current.metadata) {
|
|
52
|
+
this._current.metadata = this._getMediaPlayerState().metadata;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return this._current;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public get metadata(): ExtendedMediaMetadata|null {
|
|
59
|
+
return this.current.metadata;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public addWaitPoint(waitPoint: CoordinationWaitPoint): boolean {
|
|
63
|
+
for (let i = 0; i < this._current.waitPoints.length; i++) {
|
|
64
|
+
const current = this._current.waitPoints[i];
|
|
65
|
+
if (current.position == waitPoint.position) {
|
|
66
|
+
// Already exists
|
|
67
|
+
return false;
|
|
68
|
+
} else if (current.position > waitPoint.position) {
|
|
69
|
+
// Insert before current position
|
|
70
|
+
this._current.waitPoints.splice(i, 0, waitPoint);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Append to list
|
|
76
|
+
this._current.waitPoints.push(waitPoint);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public findNextWaitPoint(lastWaitPoint: CoordinationWaitPoint|undefined): CoordinationWaitPoint|undefined {
|
|
81
|
+
const waitPoints = this._current.waitPoints || [];
|
|
82
|
+
for (const waitPoint of waitPoints) {
|
|
83
|
+
if (lastWaitPoint && waitPoint.position <= lastWaitPoint.position) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return waitPoint;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
public updateTrack(track: IPlaybackTrack): boolean {
|
|
94
|
+
// Guard against missing waitPoints collection
|
|
95
|
+
if (!Array.isArray(track.waitPoints)) {
|
|
96
|
+
track.waitPoints = [];
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Is this the same track?
|
|
100
|
+
const current = this.current;
|
|
101
|
+
if (GroupPlaybackTrack.compareMetadata(this.current.metadata, track.metadata)) {
|
|
102
|
+
// Add any dynamic wait points.
|
|
103
|
+
track.waitPoints.forEach((waitPoint) => {
|
|
104
|
+
this.addWaitPoint(waitPoint);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// Ignore if same playback state
|
|
108
|
+
if (track.timestamp == current.timestamp && track.clientId == current.clientId) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Ignore state changes that are older
|
|
114
|
+
if (track.timestamp < current.timestamp) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Ignore state changes that are from a clientId that sorts higher then the current one.
|
|
119
|
+
// - current.clientId should not be empty if current.timestamp != 0
|
|
120
|
+
if (track.timestamp == current.timestamp && track.clientId.localeCompare(current.clientId) > 0) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Update current track
|
|
125
|
+
this._current = track;
|
|
126
|
+
|
|
127
|
+
// Notify listeners
|
|
128
|
+
this.emit(GroupPlaybackTrackEvents.trackChange, { name: GroupPlaybackTrackEvents.trackChange, metadata: track.metadata });
|
|
129
|
+
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
public compare(metadata: ExtendedMediaMetadata|null): boolean {
|
|
134
|
+
return GroupPlaybackTrack.compareMetadata(this.current.metadata, metadata);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
public static compareMetadata(current: ExtendedMediaMetadata|null, metadata: ExtendedMediaMetadata|null): boolean {
|
|
138
|
+
// Only compare when we have two metadata instances
|
|
139
|
+
if (current && metadata) {
|
|
140
|
+
return JSON.stringify(current) == JSON.stringify(metadata);
|
|
141
|
+
} else if (!current && metadata) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
@@ -1,90 +1,90 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
* Licensed under the Microsoft Live Share SDK License.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { IEvent } from '@microsoft/live-share';
|
|
7
|
-
import EventEmitter from 'events';
|
|
8
|
-
import { GroupPlaybackTrack, GroupPlaybackTrackEvents } from './GroupPlaybackTrack';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* @hidden
|
|
13
|
-
*/
|
|
14
|
-
export interface IPlaybackTrackData {
|
|
15
|
-
data: object|null;
|
|
16
|
-
timestamp: number;
|
|
17
|
-
clientId: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* @hidden
|
|
22
|
-
*/
|
|
23
|
-
export enum PlaybackTrackDataEvents {
|
|
24
|
-
dataChange = 'dataChange'
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* @hidden
|
|
29
|
-
*/
|
|
30
|
-
export interface IPlaybackTrackDataChangeEvent extends IEvent {
|
|
31
|
-
data: object|null;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* @hidden
|
|
36
|
-
*/
|
|
37
|
-
export class GroupPlaybackTrackData extends EventEmitter {
|
|
38
|
-
private _track: GroupPlaybackTrack;
|
|
39
|
-
private _current: IPlaybackTrackData;
|
|
40
|
-
|
|
41
|
-
constructor(track: GroupPlaybackTrack) {
|
|
42
|
-
super();
|
|
43
|
-
this._track = track;
|
|
44
|
-
this._current = { data: null, timestamp: 0, clientId: '' };
|
|
45
|
-
|
|
46
|
-
// Listen for track changes
|
|
47
|
-
this._track.on(GroupPlaybackTrackEvents.trackChange, () => {
|
|
48
|
-
// Track changed so reset state to empty object
|
|
49
|
-
this._current = {
|
|
50
|
-
data: null,
|
|
51
|
-
timestamp: this._track.current.timestamp,
|
|
52
|
-
clientId: this._track.current.clientId
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
public get current(): Readonly<IPlaybackTrackData> {
|
|
58
|
-
return this._current;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
public get data(): object|null {
|
|
62
|
-
return this.current.data;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
public updateData(event: IPlaybackTrackData): boolean {
|
|
66
|
-
// Ignore state changes that are older
|
|
67
|
-
const current = this.current;
|
|
68
|
-
if (event.timestamp < current.timestamp) {
|
|
69
|
-
return false;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Ignore state changes that have the same timestamp and the clientId sorts higher.
|
|
73
|
-
if (event.timestamp == current.timestamp && event.clientId.localeCompare(current.clientId) > 0) {
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Ignore state changes for same data object
|
|
78
|
-
if (JSON.stringify(current.data) == JSON.stringify(event.data)) {
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Update current data
|
|
83
|
-
this._current = event;
|
|
84
|
-
|
|
85
|
-
// Notify listeners
|
|
86
|
-
this.emit(PlaybackTrackDataEvents.dataChange, { type: PlaybackTrackDataEvents.dataChange, data: event.data });
|
|
87
|
-
|
|
88
|
-
return true;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
* Licensed under the Microsoft Live Share SDK License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { IEvent } from '@microsoft/live-share';
|
|
7
|
+
import EventEmitter from 'events';
|
|
8
|
+
import { GroupPlaybackTrack, GroupPlaybackTrackEvents } from './GroupPlaybackTrack';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @hidden
|
|
13
|
+
*/
|
|
14
|
+
export interface IPlaybackTrackData {
|
|
15
|
+
data: object|null;
|
|
16
|
+
timestamp: number;
|
|
17
|
+
clientId: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @hidden
|
|
22
|
+
*/
|
|
23
|
+
export enum PlaybackTrackDataEvents {
|
|
24
|
+
dataChange = 'dataChange'
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @hidden
|
|
29
|
+
*/
|
|
30
|
+
export interface IPlaybackTrackDataChangeEvent extends IEvent {
|
|
31
|
+
data: object|null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @hidden
|
|
36
|
+
*/
|
|
37
|
+
export class GroupPlaybackTrackData extends EventEmitter {
|
|
38
|
+
private _track: GroupPlaybackTrack;
|
|
39
|
+
private _current: IPlaybackTrackData;
|
|
40
|
+
|
|
41
|
+
constructor(track: GroupPlaybackTrack) {
|
|
42
|
+
super();
|
|
43
|
+
this._track = track;
|
|
44
|
+
this._current = { data: null, timestamp: 0, clientId: '' };
|
|
45
|
+
|
|
46
|
+
// Listen for track changes
|
|
47
|
+
this._track.on(GroupPlaybackTrackEvents.trackChange, () => {
|
|
48
|
+
// Track changed so reset state to empty object
|
|
49
|
+
this._current = {
|
|
50
|
+
data: null,
|
|
51
|
+
timestamp: this._track.current.timestamp,
|
|
52
|
+
clientId: this._track.current.clientId
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public get current(): Readonly<IPlaybackTrackData> {
|
|
58
|
+
return this._current;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public get data(): object|null {
|
|
62
|
+
return this.current.data;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public updateData(event: IPlaybackTrackData): boolean {
|
|
66
|
+
// Ignore state changes that are older
|
|
67
|
+
const current = this.current;
|
|
68
|
+
if (event.timestamp < current.timestamp) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Ignore state changes that have the same timestamp and the clientId sorts higher.
|
|
73
|
+
if (event.timestamp == current.timestamp && event.clientId.localeCompare(current.clientId) > 0) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Ignore state changes for same data object
|
|
78
|
+
if (JSON.stringify(current.data) == JSON.stringify(event.data)) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Update current data
|
|
83
|
+
this._current = event;
|
|
84
|
+
|
|
85
|
+
// Notify listeners
|
|
86
|
+
this.emit(PlaybackTrackDataEvents.dataChange, { type: PlaybackTrackDataEvents.dataChange, data: event.data });
|
|
87
|
+
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|