@microsoft/live-share-media 2.0.0-internal.13 → 2.0.0-internal.15

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.
Files changed (86) hide show
  1. package/bin/cjs/LiveMediaSessionCoordinatorSuspension.d.ts.map +1 -1
  2. package/bin/cjs/LiveMediaSessionCoordinatorSuspension.js.map +1 -1
  3. package/bin/esm/LiveMediaSessionCoordinatorSuspension.d.ts.map +1 -1
  4. package/bin/esm/LiveMediaSessionCoordinatorSuspension.js.map +1 -1
  5. package/package.json +7 -7
  6. package/src/LiveMediaSessionCoordinatorSuspension.ts +1 -3
  7. package/bin/IMediaPlayer.d.ts +0 -21
  8. package/bin/IMediaPlayer.d.ts.map +0 -1
  9. package/bin/IMediaPlayer.js +0 -7
  10. package/bin/IMediaPlayer.js.map +0 -1
  11. package/bin/LiveMediaSession.d.ts +0 -90
  12. package/bin/LiveMediaSession.d.ts.map +0 -1
  13. package/bin/LiveMediaSession.js +0 -255
  14. package/bin/LiveMediaSession.js.map +0 -1
  15. package/bin/LiveMediaSessionCoordinator.d.ts +0 -260
  16. package/bin/LiveMediaSessionCoordinator.d.ts.map +0 -1
  17. package/bin/LiveMediaSessionCoordinator.js +0 -472
  18. package/bin/LiveMediaSessionCoordinator.js.map +0 -1
  19. package/bin/LiveMediaSessionCoordinatorSuspension.d.ts +0 -20
  20. package/bin/LiveMediaSessionCoordinatorSuspension.d.ts.map +0 -1
  21. package/bin/LiveMediaSessionCoordinatorSuspension.js +0 -28
  22. package/bin/LiveMediaSessionCoordinatorSuspension.js.map +0 -1
  23. package/bin/MediaPlayerSynchronizer.d.ts +0 -190
  24. package/bin/MediaPlayerSynchronizer.d.ts.map +0 -1
  25. package/bin/MediaPlayerSynchronizer.js +0 -577
  26. package/bin/MediaPlayerSynchronizer.js.map +0 -1
  27. package/bin/MediaSessionActionThrottler.d.ts +0 -12
  28. package/bin/MediaSessionActionThrottler.d.ts.map +0 -1
  29. package/bin/MediaSessionActionThrottler.js +0 -14
  30. package/bin/MediaSessionActionThrottler.js.map +0 -1
  31. package/bin/MediaSessionExtensions.d.ts +0 -177
  32. package/bin/MediaSessionExtensions.d.ts.map +0 -1
  33. package/bin/MediaSessionExtensions.js +0 -26
  34. package/bin/MediaSessionExtensions.js.map +0 -1
  35. package/bin/RepeatedActionThrottler.d.ts +0 -20
  36. package/bin/RepeatedActionThrottler.d.ts.map +0 -1
  37. package/bin/RepeatedActionThrottler.js +0 -63
  38. package/bin/RepeatedActionThrottler.js.map +0 -1
  39. package/bin/VolumeManager.d.ts +0 -84
  40. package/bin/VolumeManager.d.ts.map +0 -1
  41. package/bin/VolumeManager.js +0 -175
  42. package/bin/VolumeManager.js.map +0 -1
  43. package/bin/index.d.ts +0 -14
  44. package/bin/index.d.ts.map +0 -1
  45. package/bin/index.js +0 -30
  46. package/bin/index.js.map +0 -1
  47. package/bin/internals/GroupCoordinatorState.d.ts +0 -108
  48. package/bin/internals/GroupCoordinatorState.d.ts.map +0 -1
  49. package/bin/internals/GroupCoordinatorState.js +0 -519
  50. package/bin/internals/GroupCoordinatorState.js.map +0 -1
  51. package/bin/internals/GroupPlaybackPosition.d.ts +0 -70
  52. package/bin/internals/GroupPlaybackPosition.d.ts.map +0 -1
  53. package/bin/internals/GroupPlaybackPosition.js +0 -170
  54. package/bin/internals/GroupPlaybackPosition.js.map +0 -1
  55. package/bin/internals/GroupPlaybackRate.d.ts +0 -39
  56. package/bin/internals/GroupPlaybackRate.d.ts.map +0 -1
  57. package/bin/internals/GroupPlaybackRate.js +0 -62
  58. package/bin/internals/GroupPlaybackRate.js.map +0 -1
  59. package/bin/internals/GroupPlaybackTrack.d.ts +0 -46
  60. package/bin/internals/GroupPlaybackTrack.d.ts.map +0 -1
  61. package/bin/internals/GroupPlaybackTrack.js +0 -125
  62. package/bin/internals/GroupPlaybackTrack.js.map +0 -1
  63. package/bin/internals/GroupPlaybackTrackData.d.ts +0 -41
  64. package/bin/internals/GroupPlaybackTrackData.d.ts.map +0 -1
  65. package/bin/internals/GroupPlaybackTrackData.js +0 -73
  66. package/bin/internals/GroupPlaybackTrackData.js.map +0 -1
  67. package/bin/internals/GroupTransportState.d.ts +0 -53
  68. package/bin/internals/GroupTransportState.d.ts.map +0 -1
  69. package/bin/internals/GroupTransportState.js +0 -123
  70. package/bin/internals/GroupTransportState.js.map +0 -1
  71. package/bin/internals/consts.d.ts +0 -83
  72. package/bin/internals/consts.d.ts.map +0 -1
  73. package/bin/internals/consts.js +0 -92
  74. package/bin/internals/consts.js.map +0 -1
  75. package/bin/internals/errors.d.ts +0 -17
  76. package/bin/internals/errors.d.ts.map +0 -1
  77. package/bin/internals/errors.js +0 -34
  78. package/bin/internals/errors.js.map +0 -1
  79. package/bin/internals/index.d.ts +0 -13
  80. package/bin/internals/index.d.ts.map +0 -1
  81. package/bin/internals/index.js +0 -29
  82. package/bin/internals/index.js.map +0 -1
  83. package/bin/internals/interfaces.d.ts +0 -10
  84. package/bin/internals/interfaces.d.ts.map +0 -1
  85. package/bin/internals/interfaces.js +0 -3
  86. package/bin/internals/interfaces.js.map +0 -1
@@ -1,177 +0,0 @@
1
- /**
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the Microsoft Live Share SDK License.
4
- */
5
- /**
6
- * Suspension object for when group synchronization is suspended for the local user.
7
- */
8
- export interface MediaSessionCoordinatorSuspension {
9
- /**
10
- * The wait point that the suspension was created with.
11
- *
12
- * @remarks
13
- * If undefined, the suspension was not created with a wait point.
14
- */
15
- waitPoint?: CoordinationWaitPoint;
16
- /**
17
- * Ends the suspension.
18
- *
19
- * @param seekTo the timestamp to seek to after the suspension ends.
20
- * If no value is provided, the local user will return to the group playback position.
21
- *
22
- * @remarks
23
- * If there are other suspensions active, all other suspensions must be ended before group synchronization can resume.
24
- */
25
- end(seekTo?: number): void;
26
- }
27
- /**
28
- * Wait point interface for a suspension.
29
- *
30
- * @remarks
31
- * Used by {@link MediaSessionCoordinatorSuspension} to schedule a suspension at a specific media position.
32
- */
33
- export interface CoordinationWaitPoint {
34
- /**
35
- * The position in milliseconds that the suspension should begin.
36
- */
37
- position: number;
38
- /**
39
- * Optional. The reason for the suspension.
40
- */
41
- reason?: string;
42
- /**
43
- * Optional. The max clients to wait for before a suspension ends.
44
- */
45
- maxClients?: number;
46
- }
47
- /**
48
- * Event types of `LiveMediaSessionCoordinator`.
49
- */
50
- export declare enum MediaSessionCoordinatorEvents {
51
- /**
52
- * Event emitted after the coordinator's state changed
53
- */
54
- coordinatorstatechange = "coordinatorstatechange",
55
- /**
56
- * Event emitted when an action was triggered.
57
- */
58
- triggeraction = "triggeraction",
59
- /**
60
- * Event emitted when an action would have been triggered, but a suspension is active for the local client.
61
- */
62
- triggeractionignored = "triggeractionignored"
63
- }
64
- /**
65
- * Action types supported for `LiveMediaSession`.
66
- *
67
- * @remarks
68
- * These types extend the default actions supported by the `MediaSession` specification in browsers.
69
- * These additional actions help with group synchronization.
70
- */
71
- export type ExtendedMediaSessionAction = MediaSessionAction | "settrack" | "ratechange" | "wait" | "catchup" | "datachange" | "blocked";
72
- /**
73
- * Extended playback state for `LiveMediaSession`.
74
- *
75
- * @remarks
76
- * These types extend the default state types supported by the `MediaSession` specification in browsers.
77
- * These additional types help with group synchronization.
78
- */
79
- export type ExtendedMediaSessionPlaybackState = MediaSessionPlaybackState | "suspended" | "waiting" | "ended";
80
- /**
81
- * The source of the action for `LiveMediaSession`.
82
- *
83
- * @remarks
84
- * Is `user` when the action was explicitly invoked via the `LiveMediaSessionCoordinator`.
85
- * Is `system` when the action was invoked via `GroupCoordinatorState` when the local client is out of sync.
86
- */
87
- export type ExtendedMediaSessionActionSource = "user" | "system";
88
- /**
89
- * Metadata for `LiveMediaSession`.
90
- *
91
- * @remarks
92
- * These types extend the default session metadata supported by the `MediaSession` specification in browsers.
93
- * These additional types help with group synchronization.
94
- */
95
- export interface ExtendedMediaMetadata extends MediaMetadata {
96
- /**
97
- * A unique identifier for the track (e.g., UUID, URL, etc.)
98
- */
99
- trackIdentifier: string;
100
- /**
101
- * Flag indicating whether or not the stream is a live broadcast.
102
- */
103
- liveStream?: boolean;
104
- }
105
- /**
106
- * The reasons why an action is ignored.
107
- *
108
- * @remarks
109
- * Is `localusersuspended` when the action updated the group state, but ignored locally due to the local client being suspended.
110
-
111
- */
112
- export type ExtendedMediaSessionActionIgnore = "localusersuspended";
113
- /**
114
- * Details for emitted actions from `LiveMediaSession`.
115
- *
116
- * @remarks
117
- * These types extend the default event details supported by the `MediaSession` specification in browsers.
118
- * These additional types help with group synchronization.
119
- */
120
- export interface ExtendedMediaSessionActionDetails {
121
- /**
122
- * The action type of this event.
123
- */
124
- action: ExtendedMediaSessionAction;
125
- /**
126
- * The source of the action.
127
- *
128
- * @remarks
129
- * Is `user` when the action was explicitly invoked via the `LiveMediaSessionCoordinator`.
130
- * Is `system` when the action was invoked via `GroupCoordinatorState` when the local client is out of sync.
131
- */
132
- source: ExtendedMediaSessionActionSource;
133
- /**
134
- * Unique identifier of the client that triggered this action.
135
- */
136
- clientId: string;
137
- /**
138
- * Flag indicating whether or not the action was triggered by the local client.
139
- */
140
- local: boolean;
141
- /**
142
- * Flag indicating whether or not this was a fast seek action.
143
- */
144
- fastSeek?: boolean | null;
145
- /**
146
- * The offset of the seek.
147
- */
148
- seekOffset?: number | null;
149
- /**
150
- * Timestamp of the seek event.
151
- */
152
- seekTime?: number | null;
153
- /**
154
- * Updated session metadata that was changed via this action.
155
- */
156
- metadata?: ExtendedMediaMetadata | null;
157
- /**
158
- * Suspension associated with this action.
159
- */
160
- suspension?: MediaSessionCoordinatorSuspension | null;
161
- /**
162
- * Custom data associated with this action.
163
- */
164
- data?: object | null;
165
- /**
166
- * Reason an action is ignored by the local client, undefined if not ignored.
167
- */
168
- ignoreReason?: ExtendedMediaSessionActionIgnore | null;
169
- playbackRate?: number | null;
170
- }
171
- /**
172
- * Handler for `LiveMediaSession` actions.
173
- */
174
- export interface ExtendedMediaSessionActionHandler {
175
- (details: ExtendedMediaSessionActionDetails): void;
176
- }
177
- //# sourceMappingURL=MediaSessionExtensions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MediaSessionExtensions.d.ts","sourceRoot":"","sources":["../src/MediaSessionExtensions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,iCAAiC;IAC9C;;;;;OAKG;IACH,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC;;;;;;;;OAQG;IACH,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IAClC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,oBAAY,6BAA6B;IACrC;;OAEG;IACH,sBAAsB,2BAA2B;IACjD;;OAEG;IACH,aAAa,kBAAkB;IAC/B;;OAEG;IACH,oBAAoB,yBAAyB;CAChD;AAED;;;;;;GAMG;AACH,MAAM,MAAM,0BAA0B,GAChC,kBAAkB,GAClB,UAAU,GACV,YAAY,GACZ,MAAM,GACN,SAAS,GACT,YAAY,GACZ,SAAS,CAAC;AAEhB;;;;;;GAMG;AACH,MAAM,MAAM,iCAAiC,GACvC,yBAAyB,GACzB,WAAW,GACX,SAAS,GACT,OAAO,CAAC;AAEd;;;;;;GAMG;AACH,MAAM,MAAM,gCAAgC,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEjE;;;;;;GAMG;AACH,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IACxD;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gCAAgC,GAAG,oBAAoB,CAAC;AAEpE;;;;;;GAMG;AACH,MAAM,WAAW,iCAAiC;IAC9C;;OAEG;IACH,MAAM,EAAE,0BAA0B,CAAC;IACnC;;;;;;OAMG;IACH,MAAM,EAAE,gCAAgC,CAAC;IACzC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;OAEG;IACH,QAAQ,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACxC;;OAEG;IACH,UAAU,CAAC,EAAE,iCAAiC,GAAG,IAAI,CAAC;IACtD;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;OAEG;IACH,YAAY,CAAC,EAAE,gCAAgC,GAAG,IAAI,CAAC;IAEvD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,iCAAiC;IAC9C,CAAC,OAAO,EAAE,iCAAiC,GAAG,IAAI,CAAC;CACtD"}
@@ -1,26 +0,0 @@
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.MediaSessionCoordinatorEvents = void 0;
8
- /**
9
- * Event types of `LiveMediaSessionCoordinator`.
10
- */
11
- var MediaSessionCoordinatorEvents;
12
- (function (MediaSessionCoordinatorEvents) {
13
- /**
14
- * Event emitted after the coordinator's state changed
15
- */
16
- MediaSessionCoordinatorEvents["coordinatorstatechange"] = "coordinatorstatechange";
17
- /**
18
- * Event emitted when an action was triggered.
19
- */
20
- MediaSessionCoordinatorEvents["triggeraction"] = "triggeraction";
21
- /**
22
- * Event emitted when an action would have been triggered, but a suspension is active for the local client.
23
- */
24
- MediaSessionCoordinatorEvents["triggeractionignored"] = "triggeractionignored";
25
- })(MediaSessionCoordinatorEvents = exports.MediaSessionCoordinatorEvents || (exports.MediaSessionCoordinatorEvents = {}));
26
- //# sourceMappingURL=MediaSessionExtensions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MediaSessionExtensions.js","sourceRoot":"","sources":["../src/MediaSessionExtensions.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA8CH;;GAEG;AACH,IAAY,6BAaX;AAbD,WAAY,6BAA6B;IACrC;;OAEG;IACH,kFAAiD,CAAA;IACjD;;OAEG;IACH,gEAA+B,CAAA;IAC/B;;OAEG;IACH,8EAA6C,CAAA;AACjD,CAAC,EAbW,6BAA6B,GAA7B,qCAA6B,KAA7B,qCAA6B,QAaxC"}
@@ -1,20 +0,0 @@
1
- /**
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the Microsoft Live Share SDK License.
4
- */
5
- import { MediaSessionActionThrottler } from "./MediaSessionActionThrottler";
6
- import { ExtendedMediaSessionActionDetails } from "./MediaSessionExtensions";
7
- /**
8
- * A Throttler that passes through all actions but will only let an action be repeated once every 2 seconds.
9
- */
10
- export declare class RepeatedActionThrottler extends MediaSessionActionThrottler {
11
- private static FILTERED_ACTIONS;
12
- private _repeatInterval;
13
- private _lastActionSentTime?;
14
- private _lastActionSent?;
15
- get repeatInterval(): number;
16
- set repeatInterval(value: number);
17
- throttled(details: MediaSessionActionDetails | ExtendedMediaSessionActionDetails, handler?: MediaSessionActionHandler): void;
18
- private getChangeKey;
19
- }
20
- //# sourceMappingURL=RepeatedActionThrottler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RepeatedActionThrottler.d.ts","sourceRoot":"","sources":["../src/RepeatedActionThrottler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACH,iCAAiC,EAEpC,MAAM,0BAA0B,CAAC;AAElC;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,2BAA2B;IACpE,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAK7B;IACF,OAAO,CAAC,eAAe,CAA0B;IACjD,OAAO,CAAC,mBAAmB,CAAC,CAAS;IACrC,OAAO,CAAC,eAAe,CAAC,CAAS;IAEjC,IAAW,cAAc,IAAI,MAAM,CAElC;IAED,IAAW,cAAc,CAAC,KAAK,EAAE,MAAM,EAEtC;IAEM,SAAS,CACZ,OAAO,EAAE,yBAAyB,GAAG,iCAAiC,EACtE,OAAO,CAAC,EAAE,yBAAyB,GACpC,IAAI;IA4BP,OAAO,CAAC,YAAY;CAUvB"}
@@ -1,63 +0,0 @@
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.RepeatedActionThrottler = void 0;
8
- const live_share_1 = require("@microsoft/live-share");
9
- const MediaSessionActionThrottler_1 = require("./MediaSessionActionThrottler");
10
- /**
11
- * A Throttler that passes through all actions but will only let an action be repeated once every 2 seconds.
12
- */
13
- class RepeatedActionThrottler extends MediaSessionActionThrottler_1.MediaSessionActionThrottler {
14
- constructor() {
15
- super(...arguments);
16
- this._repeatInterval = new live_share_1.TimeInterval(2000);
17
- }
18
- get repeatInterval() {
19
- return this._repeatInterval.seconds;
20
- }
21
- set repeatInterval(value) {
22
- this._repeatInterval.seconds = value;
23
- }
24
- throttled(details, handler) {
25
- if (handler) {
26
- if (RepeatedActionThrottler.FILTERED_ACTIONS.indexOf(details.action) >= 0) {
27
- const changeKey = this.getChangeKey(details);
28
- const now = new Date().getTime();
29
- if (this._lastActionSent && changeKey == this._lastActionSent) {
30
- if (now - this._lastActionSentTime >=
31
- this._repeatInterval.milliseconds) {
32
- handler(details);
33
- this._lastActionSentTime = now;
34
- }
35
- }
36
- else {
37
- handler(details);
38
- this._lastActionSent = changeKey;
39
- this._lastActionSentTime = now;
40
- }
41
- }
42
- else {
43
- handler(details);
44
- }
45
- }
46
- }
47
- getChangeKey(details) {
48
- switch (details.action) {
49
- case "seekto":
50
- return `seekto:${details.seekTime}`;
51
- default:
52
- return details.action;
53
- }
54
- }
55
- }
56
- RepeatedActionThrottler.FILTERED_ACTIONS = [
57
- "play",
58
- "pause",
59
- "seekto",
60
- "catchup",
61
- ];
62
- exports.RepeatedActionThrottler = RepeatedActionThrottler;
63
- //# sourceMappingURL=RepeatedActionThrottler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RepeatedActionThrottler.js","sourceRoot":"","sources":["../src/RepeatedActionThrottler.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,sDAAqD;AACrD,+EAA4E;AAM5E;;GAEG;AACH,MAAa,uBAAwB,SAAQ,yDAA2B;IAAxE;;QAOY,oBAAe,GAAG,IAAI,yBAAY,CAAC,IAAI,CAAC,CAAC;IAqDrD,CAAC;IAjDG,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;IACxC,CAAC;IAED,IAAW,cAAc,CAAC,KAAa;QACnC,IAAI,CAAC,eAAe,CAAC,OAAO,GAAG,KAAK,CAAC;IACzC,CAAC;IAEM,SAAS,CACZ,OAAsE,EACtE,OAAmC;QAEnC,IAAI,OAAO,EAAE;YACT,IACI,uBAAuB,CAAC,gBAAgB,CAAC,OAAO,CAC5C,OAAO,CAAC,MAAM,CACjB,IAAI,CAAC,EACR;gBACE,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC7C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;gBACjC,IAAI,IAAI,CAAC,eAAe,IAAI,SAAS,IAAI,IAAI,CAAC,eAAe,EAAE;oBAC3D,IACI,GAAG,GAAG,IAAI,CAAC,mBAAoB;wBAC/B,IAAI,CAAC,eAAe,CAAC,YAAY,EACnC;wBACE,OAAO,CAAC,OAAoC,CAAC,CAAC;wBAC9C,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC;qBAClC;iBACJ;qBAAM;oBACH,OAAO,CAAC,OAAoC,CAAC,CAAC;oBAC9C,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;oBACjC,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC;iBAClC;aACJ;iBAAM;gBACH,OAAO,CAAC,OAAoC,CAAC,CAAC;aACjD;SACJ;IACL,CAAC;IAEO,YAAY,CAChB,OAAsE;QAEtE,QAAQ,OAAO,CAAC,MAAM,EAAE;YACpB,KAAK,QAAQ;gBACT,OAAO,UAAU,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxC;gBACI,OAAO,OAAO,CAAC,MAAM,CAAC;SAC7B;IACL,CAAC;;AA1Dc,wCAAgB,GAAiC;IAC5D,MAAM;IACN,OAAO;IACP,QAAQ;IACR,SAAS;CACZ,AAL8B,CAK7B;AANO,0DAAuB"}
@@ -1,84 +0,0 @@
1
- /**
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the Microsoft Live Share SDK License.
4
- */
5
- import { IMediaPlayer } from "./IMediaPlayer";
6
- export declare enum LimitLevelType {
7
- fixed = 0,
8
- percentage = 1
9
- }
10
- /**
11
- * Smooth audio level changes when volume is modified, or if volume limiting has started/ended.
12
- */
13
- export declare class VolumeManager {
14
- private readonly _player;
15
- private readonly _volumeChangeDuration;
16
- private _volume;
17
- private _isLimiting;
18
- private _limitLevel;
19
- private _limitLevelType;
20
- private _startTime;
21
- private _startVolume;
22
- private _running;
23
- constructor(player: IMediaPlayer);
24
- /**
25
- * The selected volume.
26
- *
27
- * @remarks
28
- * Expressed as a value between 0.0 and 1.0. The default value is 1.0.
29
- * Can be used for things like volume sliders.
30
- *
31
- * Does not return the current volume if limiting is enabled, but the desired volume.
32
- */
33
- get volume(): number;
34
- set volume(value: number);
35
- /**
36
- * Target level to lower volume to.
37
- *
38
- * @remarks
39
- * Expressed as a value between 0.0 and 1.0. The value is applied based upon the configured
40
- * `levelType`. The default value is 0.1.
41
- *
42
- * For a level type of `LevelType.fixed` the value is the exact level the volume will be
43
- * lowered to. The default value of 0.1 would cause the volume to be lowered to 0.1.
44
- *
45
- * For a level type of `LevelType.percentage` the value is the percentage by which the volume
46
- * level should be lowered to. The default value of 0.1 would cause the volume to be lowered
47
- * to 10% of its starting value.
48
- */
49
- get limitLevel(): number;
50
- set limitLevel(value: number);
51
- /**
52
- * The type of level represented by the `limitLevel` property.
53
- */
54
- get limitLevelType(): LimitLevelType;
55
- set limitLevelType(value: LimitLevelType);
56
- /**
57
- * Amount of time, in seconds, it should take to change the volume up or down to the desired level.
58
- *
59
- * @remarks
60
- * Default `volumeChangeDuration` is 0.5 seconds.
61
- */
62
- get volumeChangeDuration(): number;
63
- set volumeChangeDuration(value: number);
64
- /**
65
- * Whether or not volume limiting is currently enabled.
66
- */
67
- get isLimiting(): boolean;
68
- /**
69
- * Limits volume based on `limitLevel` and `limitLevelType` properties.
70
- * @see `limitLevel`
71
- * @see `limitLevelType`
72
- */
73
- startLimiting(): void;
74
- /**
75
- * Disables volume limit.
76
- */
77
- stopLimiting(): void;
78
- private startAdjusting;
79
- private scheduleAnimationFrame;
80
- private computeInterpolatedVolume;
81
- private computeTargetVolume;
82
- private millisSinceVolumeChangeStart;
83
- }
84
- //# sourceMappingURL=VolumeManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"VolumeManager.d.ts","sourceRoot":"","sources":["../src/VolumeManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,oBAAY,cAAc;IACtB,KAAK,IAAA;IACL,UAAU,IAAA;CACb;AAED;;GAEG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAyB;IAG/D,OAAO,CAAC,OAAO,CAAO;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAO;IAC1B,OAAO,CAAC,eAAe,CAAwC;IAC/D,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,YAAY;IAKhC;;;;;;;;OAQG;IACH,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED,IAAW,MAAM,CAAC,KAAK,EAAE,MAAM,EAS9B;IAED;;;;;;;;;;;;;OAaG;IACH,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED,IAAW,UAAU,CAAC,KAAK,EAAE,MAAM,EAQlC;IAED;;OAEG;IACH,IAAW,cAAc,IAAI,cAAc,CAE1C;IAED,IAAW,cAAc,CAAC,KAAK,EAAE,cAAc,EAE9C;IAED;;;;;OAKG;IACH,IAAW,oBAAoB,IAAI,MAAM,CAExC;IAED,IAAW,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAE5C;IAED;;OAEG;IACH,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED;;;;OAIG;IACI,aAAa,IAAI,IAAI;IAK5B;;OAEG;IACI,YAAY,IAAI,IAAI;IAK3B,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,yBAAyB;IASjC,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,4BAA4B;CAIvC"}
@@ -1,175 +0,0 @@
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.VolumeManager = exports.LimitLevelType = void 0;
8
- const live_share_1 = require("@microsoft/live-share");
9
- var LimitLevelType;
10
- (function (LimitLevelType) {
11
- LimitLevelType[LimitLevelType["fixed"] = 0] = "fixed";
12
- LimitLevelType[LimitLevelType["percentage"] = 1] = "percentage";
13
- })(LimitLevelType = exports.LimitLevelType || (exports.LimitLevelType = {}));
14
- /**
15
- * Smooth audio level changes when volume is modified, or if volume limiting has started/ended.
16
- */
17
- class VolumeManager {
18
- constructor(player) {
19
- this._volumeChangeDuration = new live_share_1.TimeInterval(500);
20
- // defaults to player volume
21
- this._volume = 0.0;
22
- this._isLimiting = false;
23
- this._limitLevel = 0.1;
24
- this._limitLevelType = LimitLevelType.fixed;
25
- this._startTime = 0;
26
- this._startVolume = 0;
27
- this._running = false;
28
- this._player = player;
29
- this._volume = this._player.volume;
30
- }
31
- /**
32
- * The selected volume.
33
- *
34
- * @remarks
35
- * Expressed as a value between 0.0 and 1.0. The default value is 1.0.
36
- * Can be used for things like volume sliders.
37
- *
38
- * Does not return the current volume if limiting is enabled, but the desired volume.
39
- */
40
- get volume() {
41
- return this._volume;
42
- }
43
- set volume(value) {
44
- if (value < 0 || value > 1.0) {
45
- throw new Error(`VolumeManager: cannot set volume to ${value}. Level must be between 0.0 and 1.0.`);
46
- }
47
- this._volume = value;
48
- this.startAdjusting();
49
- }
50
- /**
51
- * Target level to lower volume to.
52
- *
53
- * @remarks
54
- * Expressed as a value between 0.0 and 1.0. The value is applied based upon the configured
55
- * `levelType`. The default value is 0.1.
56
- *
57
- * For a level type of `LevelType.fixed` the value is the exact level the volume will be
58
- * lowered to. The default value of 0.1 would cause the volume to be lowered to 0.1.
59
- *
60
- * For a level type of `LevelType.percentage` the value is the percentage by which the volume
61
- * level should be lowered to. The default value of 0.1 would cause the volume to be lowered
62
- * to 10% of its starting value.
63
- */
64
- get limitLevel() {
65
- return this._limitLevel;
66
- }
67
- set limitLevel(value) {
68
- if (value < 0 || value > 1.0) {
69
- throw new Error(`VolumeManager: cannot set level to ${value}. Level must be between 0.0 and 1.0.`);
70
- }
71
- this._limitLevel = value;
72
- }
73
- /**
74
- * The type of level represented by the `limitLevel` property.
75
- */
76
- get limitLevelType() {
77
- return this._limitLevelType;
78
- }
79
- set limitLevelType(value) {
80
- this._limitLevelType = value;
81
- }
82
- /**
83
- * Amount of time, in seconds, it should take to change the volume up or down to the desired level.
84
- *
85
- * @remarks
86
- * Default `volumeChangeDuration` is 0.5 seconds.
87
- */
88
- get volumeChangeDuration() {
89
- return this._volumeChangeDuration.seconds;
90
- }
91
- set volumeChangeDuration(value) {
92
- this._volumeChangeDuration.seconds = Math.abs(value);
93
- }
94
- /**
95
- * Whether or not volume limiting is currently enabled.
96
- */
97
- get isLimiting() {
98
- return this._isLimiting;
99
- }
100
- /**
101
- * Limits volume based on `limitLevel` and `limitLevelType` properties.
102
- * @see `limitLevel`
103
- * @see `limitLevelType`
104
- */
105
- startLimiting() {
106
- this._isLimiting = true;
107
- this.startAdjusting();
108
- }
109
- /**
110
- * Disables volume limit.
111
- */
112
- stopLimiting() {
113
- this._isLimiting = false;
114
- this.startAdjusting();
115
- }
116
- startAdjusting() {
117
- const adjustVolume = () => {
118
- // Schedule next animation frame if volume change not finished
119
- if (this.millisSinceVolumeChangeStart() <=
120
- this._volumeChangeDuration.milliseconds) {
121
- this._player.volume = this.computeInterpolatedVolume();
122
- this.scheduleAnimationFrame(adjustVolume);
123
- }
124
- else {
125
- this._player.volume = this.computeTargetVolume();
126
- this._running = false;
127
- }
128
- };
129
- this._startTime = new Date().getTime();
130
- this._startVolume = this._player.volume;
131
- if (!this._running) {
132
- this._running = true;
133
- this.scheduleAnimationFrame(adjustVolume);
134
- }
135
- }
136
- scheduleAnimationFrame(callback) {
137
- if (typeof requestAnimationFrame == "function") {
138
- requestAnimationFrame(callback);
139
- }
140
- else {
141
- setTimeout(callback, Math.min(this._volumeChangeDuration.milliseconds / 25, 20));
142
- }
143
- }
144
- computeInterpolatedVolume() {
145
- const volumeChangeMillis = this._volumeChangeDuration.milliseconds;
146
- const volumeDifference = this.computeTargetVolume() - this._startVolume;
147
- const adjustmentFromStart = (volumeDifference / volumeChangeMillis) *
148
- this.millisSinceVolumeChangeStart();
149
- return this._startVolume + adjustmentFromStart;
150
- }
151
- computeTargetVolume() {
152
- if (this._limitLevelType == LimitLevelType.percentage) {
153
- if (this._isLimiting) {
154
- return this._volume * this._limitLevel;
155
- }
156
- else {
157
- return this._volume;
158
- }
159
- }
160
- else {
161
- if (this._isLimiting && this._volume > this._limitLevel) {
162
- return this._limitLevel;
163
- }
164
- else {
165
- return this._volume;
166
- }
167
- }
168
- }
169
- millisSinceVolumeChangeStart() {
170
- const now = new Date().getTime();
171
- return now - this._startTime;
172
- }
173
- }
174
- exports.VolumeManager = VolumeManager;
175
- //# sourceMappingURL=VolumeManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"VolumeManager.js","sourceRoot":"","sources":["../src/VolumeManager.ts"],"names":[],"mappings":"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"}
package/bin/index.d.ts DELETED
@@ -1,14 +0,0 @@
1
- /**
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the Microsoft Live Share SDK License.
4
- */
5
- export * from "./LiveMediaSession";
6
- export * from "./LiveMediaSessionCoordinator";
7
- export * from "./LiveMediaSessionCoordinatorSuspension";
8
- export * from "./IMediaPlayer";
9
- export * from "./MediaPlayerSynchronizer";
10
- export * from "./MediaSessionActionThrottler";
11
- export * from "./MediaSessionExtensions";
12
- export * from "./RepeatedActionThrottler";
13
- export * from "./VolumeManager";
14
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC"}
package/bin/index.js DELETED
@@ -1,30 +0,0 @@
1
- "use strict";
2
- /**
3
- * Copyright (c) Microsoft Corporation. All rights reserved.
4
- * Licensed under the Microsoft Live Share SDK License.
5
- */
6
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
- if (k2 === undefined) k2 = k;
8
- var desc = Object.getOwnPropertyDescriptor(m, k);
9
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
- desc = { enumerable: true, get: function() { return m[k]; } };
11
- }
12
- Object.defineProperty(o, k2, desc);
13
- }) : (function(o, m, k, k2) {
14
- if (k2 === undefined) k2 = k;
15
- o[k2] = m[k];
16
- }));
17
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19
- };
20
- Object.defineProperty(exports, "__esModule", { value: true });
21
- __exportStar(require("./LiveMediaSession"), exports);
22
- __exportStar(require("./LiveMediaSessionCoordinator"), exports);
23
- __exportStar(require("./LiveMediaSessionCoordinatorSuspension"), exports);
24
- __exportStar(require("./IMediaPlayer"), exports);
25
- __exportStar(require("./MediaPlayerSynchronizer"), exports);
26
- __exportStar(require("./MediaSessionActionThrottler"), exports);
27
- __exportStar(require("./MediaSessionExtensions"), exports);
28
- __exportStar(require("./RepeatedActionThrottler"), exports);
29
- __exportStar(require("./VolumeManager"), exports);
30
- //# sourceMappingURL=index.js.map
package/bin/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,qDAAmC;AACnC,gEAA8C;AAC9C,0EAAwD;AACxD,iDAA+B;AAC/B,4DAA0C;AAC1C,gEAA8C;AAC9C,2DAAyC;AACzC,4DAA0C;AAC1C,kDAAgC"}