@moq/watch 0.2.17 → 0.2.19
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 +4 -3
- package/audio/backend.d.ts +11 -1
- package/audio/backend.d.ts.map +1 -1
- package/audio/buffer.d.ts +10 -1
- package/audio/buffer.d.ts.map +1 -1
- package/audio/decoder.d.ts +8 -1
- package/audio/decoder.d.ts.map +1 -1
- package/audio/emitter.d.ts.map +1 -1
- package/audio/mse.d.ts +1 -1
- package/audio/mse.d.ts.map +1 -1
- package/audio/render.d.ts +6 -1
- package/audio/render.d.ts.map +1 -1
- package/audio/ring-buffer.d.ts +2 -0
- package/audio/ring-buffer.d.ts.map +1 -1
- package/audio/shared-ring-buffer.d.ts +8 -1
- package/audio/shared-ring-buffer.d.ts.map +1 -1
- package/audio/source.d.ts.map +1 -1
- package/backend.d.ts +22 -18
- package/backend.d.ts.map +1 -1
- package/{broadcast-80k1hgfM.js → broadcast-Duw8w3D_.js} +446 -439
- package/broadcast-Duw8w3D_.js.map +1 -0
- package/broadcast.d.ts +15 -3
- package/broadcast.d.ts.map +1 -1
- package/buffered.d.ts +19 -0
- package/buffered.d.ts.map +1 -0
- package/element.d.ts +22 -4
- package/element.d.ts.map +1 -1
- package/element.js +65 -36
- package/element.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/index.js +7 -6
- package/mse.d.ts.map +1 -1
- package/package.json +6 -6
- package/support/element.d.ts.map +1 -1
- package/support/element.js.map +1 -1
- package/support/index.js.map +1 -1
- package/sync-D67IxmxJ.js +128 -0
- package/sync-D67IxmxJ.js.map +1 -0
- package/sync.d.ts +27 -5
- package/sync.d.ts.map +1 -1
- package/sync.test.d.ts +2 -0
- package/sync.test.d.ts.map +1 -0
- package/ui/components/latency.d.ts.map +1 -1
- package/ui/element.d.ts.map +1 -1
- package/ui/element.js +215 -178
- package/ui/element.js.map +1 -1
- package/video/backend.d.ts +10 -1
- package/video/backend.d.ts.map +1 -1
- package/video/decoder.d.ts +1 -1
- package/video/decoder.d.ts.map +1 -1
- package/video/mse.d.ts +3 -3
- package/video/mse.d.ts.map +1 -1
- package/video/renderer.d.ts +1 -1
- package/video/renderer.d.ts.map +1 -1
- package/video/source.d.ts.map +1 -1
- package/broadcast-80k1hgfM.js.map +0 -1
package/README.md
CHANGED
|
@@ -70,16 +70,17 @@ The simplest way to watch a stream:
|
|
|
70
70
|
| `name` | string | required | Broadcast name/path |
|
|
71
71
|
| `paused` | boolean | false | Pause playback |
|
|
72
72
|
| `muted` | boolean | false | Mute audio |
|
|
73
|
-
| `visible` |
|
|
73
|
+
| `visible` | never, distance, or always | `20%` | When to download video (see below) |
|
|
74
74
|
| `volume` | number | 0.5 | Audio volume (0-1) |
|
|
75
|
+
| `reload` | boolean | true | Wait for (re)announcement before subscribing. Defaults off for `mediaoverquic.com` relays until they support broadcast discovery. |
|
|
75
76
|
|
|
76
77
|
The `visible` attribute controls when the video track is downloaded, based on the canvas
|
|
77
78
|
position relative to the viewport:
|
|
78
79
|
|
|
79
80
|
- `never`: never download video.
|
|
80
81
|
- a distance (`0px`, `200px`, `100%`, ...): download while the canvas is within that distance
|
|
81
|
-
of the viewport **and** the tab is visible. `0px`
|
|
82
|
-
|
|
82
|
+
of the viewport **and** the tab is visible. `0px` means strictly on screen; a larger distance
|
|
83
|
+
(`20%`, the default) pre-warms the video before it scrolls into view.
|
|
83
84
|
- `always`: always download video, regardless of the canvas position or tab visibility.
|
|
84
85
|
|
|
85
86
|
Only the distance mode suspends video while the tab is hidden; `always` keeps downloading.
|
package/audio/backend.d.ts
CHANGED
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
import type { Getter, Signal } from "@moq/signals";
|
|
2
|
-
import type { BufferedRanges } from "../
|
|
2
|
+
import type { BufferedRanges } from "../buffered";
|
|
3
3
|
import type { Source } from "./source";
|
|
4
|
+
/** Audio-specific signals that work regardless of the backend source (MSE vs WebCodecs). */
|
|
4
5
|
export interface Backend {
|
|
6
|
+
/** The source of the audio. */
|
|
5
7
|
source: Source;
|
|
8
|
+
/** The volume of the audio, between 0 and 1. */
|
|
6
9
|
volume: Signal<number>;
|
|
10
|
+
/** Whether the audio is muted. */
|
|
7
11
|
muted: Signal<boolean>;
|
|
12
|
+
/** The stats of the audio. */
|
|
8
13
|
stats: Getter<Stats | undefined>;
|
|
14
|
+
/** Buffered time ranges for the MSE backend. */
|
|
9
15
|
buffered: Getter<BufferedRanges>;
|
|
16
|
+
/** The AudioContext used for WebCodecs playback. */
|
|
10
17
|
context: Getter<AudioContext | undefined>;
|
|
11
18
|
}
|
|
19
|
+
/** Audio playback statistics. */
|
|
12
20
|
export interface Stats {
|
|
21
|
+
/** Number of samples decoded. */
|
|
13
22
|
sampleCount: number;
|
|
23
|
+
/** Number of encoded bytes received. */
|
|
14
24
|
bytesReceived: number;
|
|
15
25
|
}
|
|
16
26
|
//# sourceMappingURL=backend.d.ts.map
|
package/audio/backend.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/audio/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/audio/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,4FAA4F;AAC5F,MAAM,WAAW,OAAO;IACvB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IAEf,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAEvB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAEvB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAEjC,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IAEjC,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;CAC1C;AAED,iCAAiC;AACjC,MAAM,WAAW,KAAK;IACrB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAC;CACtB"}
|
package/audio/buffer.d.ts
CHANGED
|
@@ -16,6 +16,15 @@ export interface AudioBuffer {
|
|
|
16
16
|
insert(timestamp: Time.Micro, data: Float32Array[]): void;
|
|
17
17
|
/** Update the target latency in samples. */
|
|
18
18
|
setLatency(samples: number): void;
|
|
19
|
+
/** Flush buffered samples and re-stall, ready to anchor the next utterance (buffered mode). */
|
|
20
|
+
reset(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Resolve once the playhead is near enough to decode a frame at `timestamp`. In buffered mode this
|
|
23
|
+
* applies backpressure: it stays pending while decoding `timestamp` would run more than the latency
|
|
24
|
+
* floor ahead of the playhead, so the caller holds the (encoded) frame instead of decoding it too
|
|
25
|
+
* far ahead of the floor-sized ring. Resolves immediately when not buffered (the ring bounds itself).
|
|
26
|
+
*/
|
|
27
|
+
wait(timestamp: Time.Micro): Promise<void>;
|
|
19
28
|
/** Current playback timestamp (derived from reader position). */
|
|
20
29
|
readonly timestamp: Getter<Time.Micro>;
|
|
21
30
|
/** Whether the buffer is stalled (waiting to fill). */
|
|
@@ -29,5 +38,5 @@ export declare function supportsSharedArrayBuffer(): boolean;
|
|
|
29
38
|
* Create the best audio buffer implementation for the current environment.
|
|
30
39
|
* Picks `SharedAudioBuffer` when possible, falling back to `PostAudioBuffer`.
|
|
31
40
|
*/
|
|
32
|
-
export declare function createAudioBuffer(worklet: AudioWorkletNode, channels: number, rate: number, latencySamples: number): AudioBuffer;
|
|
41
|
+
export declare function createAudioBuffer(worklet: AudioWorkletNode, channels: number, rate: number, latencySamples: number, buffered?: boolean): AudioBuffer;
|
|
33
42
|
//# sourceMappingURL=buffer.d.ts.map
|
package/audio/buffer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buffer.d.ts","sourceRoot":"","sources":["../../src/audio/buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAU,KAAK,MAAM,EAAU,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"buffer.d.ts","sourceRoot":"","sources":["../../src/audio/buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAU,KAAK,MAAM,EAAU,MAAM,cAAc,CAAC;AAwD3D;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,gFAAgF;IAChF,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAE1D,4CAA4C;IAC5C,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,+FAA+F;IAC/F,KAAK,IAAI,IAAI,CAAC;IAEd;;;;;OAKG;IACH,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C,iEAAiE;IACjE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEvC,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAElC,gEAAgE;IAChE,KAAK,IAAI,IAAI,CAAC;CACd;AAED,0FAA0F;AAC1F,wBAAgB,yBAAyB,IAAI,OAAO,CAMnD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,QAAQ,UAAQ,GACd,WAAW,CAOb"}
|
package/audio/decoder.d.ts
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { Time } from "@moq/net";
|
|
2
2
|
import { type Getter, Signal } from "@moq/signals";
|
|
3
|
-
import type { BufferedRanges } from "../
|
|
3
|
+
import type { BufferedRanges } from "../buffered";
|
|
4
4
|
import type { Source } from "./source";
|
|
5
5
|
export type DecoderProps = {
|
|
6
6
|
enabled?: boolean | Signal<boolean>;
|
|
7
7
|
};
|
|
8
8
|
export interface AudioStats {
|
|
9
|
+
/** Number of encoded bytes received. */
|
|
9
10
|
bytesReceived: number;
|
|
10
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Downloads audio from a track and emits it to an AudioContext.
|
|
14
|
+
*
|
|
15
|
+
* The user is responsible for hooking up audio to speakers, an analyzer, etc.
|
|
16
|
+
*/
|
|
11
17
|
export declare class Decoder {
|
|
12
18
|
#private;
|
|
13
19
|
source: Source;
|
|
@@ -20,6 +26,7 @@ export declare class Decoder {
|
|
|
20
26
|
readonly stalled: Getter<boolean>;
|
|
21
27
|
readonly buffered: Getter<BufferedRanges>;
|
|
22
28
|
constructor(source: Source, props?: DecoderProps);
|
|
29
|
+
reset(): void;
|
|
23
30
|
close(): void;
|
|
24
31
|
}
|
|
25
32
|
//# sourceMappingURL=decoder.d.ts.map
|
package/audio/decoder.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decoder.d.ts","sourceRoot":"","sources":["../../src/audio/decoder.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"decoder.d.ts","sourceRoot":"","sources":["../../src/audio/decoder.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,MAAM,YAAY,GAAG;IAE1B,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,WAAW,UAAU;IAC1B,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,qBAAa,OAAO;;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAGzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,CAAiB;IAKnE,QAAQ,CAAC,IAAI,EAAoB,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAG/D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAoB;IAGnE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC,CAAe;IAI7D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAmB;IAIrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAiB;IAOlD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,CAAkB;IAuB3D,YAAY,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY,EAc/C;IA+VD,KAAK,IAAI,IAAI,CAEZ;IAaD,KAAK,SAEJ;CACD"}
|
package/audio/emitter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/audio/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,MAAM,MAAM,YAAY,GAAG;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;CACnC,CAAC;AAGF,qBAAa,OAAO;;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAIvB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/audio/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,MAAM,MAAM,YAAY,GAAG;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;CACnC,CAAC;AAGF,qBAAa,OAAO;;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAIvB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAUxB,YAAY,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,YAAY,EA+DhD;IAED,KAAK,SAEJ;CACD"}
|
package/audio/mse.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Getter, Signal } from "@moq/signals";
|
|
2
|
-
import { type BufferedRanges } from "../
|
|
2
|
+
import { type BufferedRanges } from "../buffered";
|
|
3
3
|
import type { Muxer } from "../mse";
|
|
4
4
|
import type { Backend, Stats } from "./backend";
|
|
5
5
|
import type { Source } from "./source";
|
package/audio/mse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mse.d.ts","sourceRoot":"","sources":["../../src/audio/mse.ts"],"names":[],"mappings":"AAGA,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"mse.d.ts","sourceRoot":"","sources":["../../src/audio/mse.ts"],"names":[],"mappings":"AAGA,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,KAAK,cAAc,EAAqB,MAAM,aAAa,CAAC;AACrE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,MAAM,QAAQ,GAAG;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF,qBAAa,GAAI,YAAW,OAAO;;IAClC,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IAEf,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAGvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,CAAe;IAGxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,CAAkB;IAG3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,CAAmD;IAIrG,YAAY,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,EAUzD;IA8LD,KAAK,IAAI,IAAI,CAEZ;CACD"}
|
package/audio/render.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Time } from "@moq/net";
|
|
2
2
|
import type { SharedRingBufferInit } from "./shared-ring-buffer";
|
|
3
|
-
export type Message = InitShared | InitPost | Data | Latency;
|
|
3
|
+
export type Message = InitShared | InitPost | Data | Latency | Reset;
|
|
4
4
|
export type ToMain = State;
|
|
5
5
|
/** Init message when SharedArrayBuffer is available. */
|
|
6
6
|
export interface InitShared extends SharedRingBufferInit {
|
|
@@ -12,6 +12,11 @@ export interface InitPost {
|
|
|
12
12
|
channels: number;
|
|
13
13
|
rate: number;
|
|
14
14
|
latency: Time.Milli;
|
|
15
|
+
buffered: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** Flush the buffer and re-stall (fallback path only; shared path resets via Atomics). */
|
|
18
|
+
export interface Reset {
|
|
19
|
+
type: "reset";
|
|
15
20
|
}
|
|
16
21
|
/** Audio samples sent via postMessage (fallback path only). */
|
|
17
22
|
export interface Data {
|
package/audio/render.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/audio/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,IAAI,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/audio/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,IAAI,GAAG,OAAO,GAAG,KAAK,CAAC;AACrE,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC;AAE3B,wDAAwD;AACxD,MAAM,WAAW,UAAW,SAAQ,oBAAoB;IACvD,IAAI,EAAE,aAAa,CAAC;CACpB;AAED,sDAAsD;AACtD,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;IAGpB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,0FAA0F;AAC1F,MAAM,WAAW,KAAK;IACrB,IAAI,EAAE,OAAO,CAAC;CACd;AAED,+DAA+D;AAC/D,MAAM,WAAW,IAAI;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC;CACtB;AAED,gEAAgE;AAChE,MAAM,WAAW,OAAO;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;CACpB;AAED,8EAA8E;AAC9E,MAAM,WAAW,KAAK;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CACjB"}
|
package/audio/ring-buffer.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export declare class AudioRingBuffer {
|
|
|
7
7
|
rate: number;
|
|
8
8
|
channels: number;
|
|
9
9
|
latency: Time.Milli;
|
|
10
|
+
buffered?: boolean;
|
|
10
11
|
});
|
|
11
12
|
get stalled(): boolean;
|
|
12
13
|
get timestamp(): Time.Micro;
|
|
@@ -14,6 +15,7 @@ export declare class AudioRingBuffer {
|
|
|
14
15
|
get capacity(): number;
|
|
15
16
|
resize(latency: Time.Milli): void;
|
|
16
17
|
write(timestamp: Time.Micro, data: Float32Array[]): void;
|
|
18
|
+
reset(): void;
|
|
17
19
|
read(output: Float32Array[]): number;
|
|
18
20
|
}
|
|
19
21
|
//# sourceMappingURL=ring-buffer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ring-buffer.d.ts","sourceRoot":"","sources":["../../src/audio/ring-buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,qBAAa,eAAe;;IAK3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ring-buffer.d.ts","sourceRoot":"","sources":["../../src/audio/ring-buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,qBAAa,eAAe;;IAK3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAU1B,YAAY,KAAK,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;QACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACnB,EAqBA;IAMD,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,SAAS,IAAI,IAAI,CAAC,KAAK,CAE1B;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAgChC;IAED,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI,CA6EvD;IAGD,KAAK,IAAI,IAAI,CAKZ;IAED,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAqBnC;CACD"}
|
|
@@ -5,13 +5,15 @@ export interface SharedRingBufferInit {
|
|
|
5
5
|
rate: number;
|
|
6
6
|
samples: SharedArrayBuffer;
|
|
7
7
|
control: SharedArrayBuffer;
|
|
8
|
+
buffered: boolean;
|
|
8
9
|
}
|
|
9
|
-
export declare function allocSharedRingBuffer(channels: number, capacity: number, rate: number): SharedRingBufferInit;
|
|
10
|
+
export declare function allocSharedRingBuffer(channels: number, capacity: number, rate: number, buffered?: boolean): SharedRingBufferInit;
|
|
10
11
|
export declare class SharedRingBuffer {
|
|
11
12
|
#private;
|
|
12
13
|
readonly channels: number;
|
|
13
14
|
readonly capacity: number;
|
|
14
15
|
readonly rate: number;
|
|
16
|
+
readonly buffered: boolean;
|
|
15
17
|
readonly init: SharedRingBufferInit;
|
|
16
18
|
constructor(init: SharedRingBufferInit);
|
|
17
19
|
/**
|
|
@@ -26,6 +28,11 @@ export declare class SharedRingBuffer {
|
|
|
26
28
|
read(output: Float32Array[]): number;
|
|
27
29
|
/** Update the target latency in samples. */
|
|
28
30
|
setLatency(samples: number): void;
|
|
31
|
+
/**
|
|
32
|
+
* Flush buffered samples and re-stall, ready to anchor the next utterance (buffered mode).
|
|
33
|
+
* Main thread only. The worklet reader sees STALLED and stops until the next insert.
|
|
34
|
+
*/
|
|
35
|
+
reset(): void;
|
|
29
36
|
/**
|
|
30
37
|
* Allocate a new ring with `newCapacity` samples and copy the unread window
|
|
31
38
|
* [READ, WRITE) plus control state into it. Used when growing capacity so
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-ring-buffer.d.ts","sourceRoot":"","sources":["../../src/audio/shared-ring-buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAShC,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"shared-ring-buffer.d.ts","sourceRoot":"","sources":["../../src/audio/shared-ring-buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAShC,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;IAE3B,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,UAAQ,GACd,oBAAoB,CAatB;AA0BD,qBAAa,gBAAgB;;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IAQpC,YAAY,IAAI,EAAE,oBAAoB,EAcrC;IAED;;;OAGG;IACH,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI,CAqExD;IAED;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAiCnC;IAED,4CAA4C;IAC5C,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhC;IAED;;;OAGG;IACH,KAAK,IAAI,IAAI,CAKZ;IAED;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CA6B5C;IAED,6DAA6D;IAC7D,IAAI,SAAS,IAAI,IAAI,CAAC,KAAK,CAG1B;IAED,uDAAuD;IACvD,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;;;;OAMG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;CACD"}
|
package/audio/source.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/audio/source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAKpC,MAAM,MAAM,MAAM,GAAG;IAEpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE1E,MAAM,MAAM,WAAW,GAAG;IACzB,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAGtD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAG7C,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,qBAAa,MAAM;;IAClB,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAEnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAGpD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAmB;IAGlF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAe;IAGzD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAgB;IAExE,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAGzC,IAAI,EAAE,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/audio/source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAKpC,MAAM,MAAM,MAAM,GAAG;IAEpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE1E,MAAM,MAAM,WAAW,GAAG;IACzB,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAGtD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAG7C,SAAS,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,qBAAa,MAAM;;IAClB,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAEnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAGpD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAmB;IAGlF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAe;IAGzD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAgB;IAExE,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAGzC,IAAI,EAAE,IAAI,CAAC;IAIX,YAAY,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,WAAW,EAe1C;IAiFD,KAAK,IAAI,IAAI,CAEZ;CACD"}
|
package/backend.d.ts
CHANGED
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
import * as Moq from "@moq/net";
|
|
2
|
-
import { Signal } from "@moq/signals";
|
|
2
|
+
import { Effect, Signal } from "@moq/signals";
|
|
3
3
|
import * as Audio from "./audio";
|
|
4
4
|
import type { Broadcast } from "./broadcast";
|
|
5
|
+
import type { BufferedRanges } from "./buffered";
|
|
5
6
|
import { type Latency, Sync } from "./sync";
|
|
6
7
|
import * as Video from "./video";
|
|
7
|
-
export interface BufferedRange {
|
|
8
|
-
start: Moq.Time.Milli;
|
|
9
|
-
end: Moq.Time.Milli;
|
|
10
|
-
}
|
|
11
|
-
export type BufferedRanges = BufferedRange[];
|
|
12
|
-
export declare function timeRangesToArray(ranges: TimeRanges): BufferedRanges;
|
|
13
8
|
export interface Backend {
|
|
14
9
|
paused: Signal<boolean>;
|
|
15
10
|
video?: Video.Backend;
|
|
16
11
|
audio?: Audio.Backend;
|
|
17
12
|
latency: Signal<Latency>;
|
|
18
13
|
jitter: Signal<Moq.Time.Milli>;
|
|
14
|
+
buffered: Signal<boolean>;
|
|
15
|
+
reset(): void;
|
|
19
16
|
}
|
|
20
17
|
export interface MultiBackendProps {
|
|
21
18
|
element?: HTMLCanvasElement | HTMLVideoElement | Signal<HTMLCanvasElement | HTMLVideoElement | undefined>;
|
|
@@ -27,34 +24,41 @@ export interface MultiBackendProps {
|
|
|
27
24
|
}
|
|
28
25
|
declare class VideoBackend implements Video.Backend {
|
|
29
26
|
source: Video.Source;
|
|
30
|
-
stats:
|
|
31
|
-
stalled:
|
|
32
|
-
buffered:
|
|
33
|
-
timestamp:
|
|
27
|
+
stats: Signal<Video.Stats | undefined>;
|
|
28
|
+
stalled: Signal<boolean>;
|
|
29
|
+
buffered: Signal<BufferedRanges>;
|
|
30
|
+
timestamp: Signal<Moq.Time.Milli>;
|
|
34
31
|
constructor(source: Video.Source);
|
|
35
32
|
}
|
|
36
33
|
declare class AudioBackend implements Audio.Backend {
|
|
37
34
|
source: Audio.Source;
|
|
38
|
-
volume:
|
|
39
|
-
muted:
|
|
40
|
-
stats:
|
|
41
|
-
buffered:
|
|
42
|
-
context:
|
|
35
|
+
volume: Signal<number>;
|
|
36
|
+
muted: Signal<boolean>;
|
|
37
|
+
stats: Signal<Audio.Stats | undefined>;
|
|
38
|
+
buffered: Signal<BufferedRanges>;
|
|
39
|
+
context: Signal<AudioContext | undefined>;
|
|
43
40
|
constructor(source: Audio.Source);
|
|
44
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* A generic backend that supports either MSE or WebCodecs based on the provided element.
|
|
44
|
+
*
|
|
45
|
+
* This primarily backs the `<moq-watch>` web component, but is useful standalone.
|
|
46
|
+
*/
|
|
45
47
|
export declare class MultiBackend implements Backend {
|
|
46
48
|
#private;
|
|
47
|
-
element:
|
|
49
|
+
element: Signal<HTMLCanvasElement | HTMLVideoElement | undefined>;
|
|
48
50
|
broadcast: Signal<Broadcast | undefined>;
|
|
49
51
|
latency: Signal<Latency>;
|
|
50
52
|
jitter: Signal<Moq.Time.Milli>;
|
|
53
|
+
buffered: Signal<boolean>;
|
|
51
54
|
paused: Signal<boolean>;
|
|
52
55
|
visible: Signal<Video.Visible>;
|
|
53
56
|
video: VideoBackend;
|
|
54
57
|
audio: AudioBackend;
|
|
55
58
|
sync: Sync;
|
|
56
|
-
signals:
|
|
59
|
+
signals: Effect;
|
|
57
60
|
constructor(props?: MultiBackendProps);
|
|
61
|
+
reset(): void;
|
|
58
62
|
close(): void;
|
|
59
63
|
}
|
|
60
64
|
export {};
|
package/backend.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
|