@moq/watch 0.1.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/README.md +102 -0
- package/audio/backend.d.ts +15 -0
- package/audio/backend.d.ts.map +1 -0
- package/audio/decoder.d.ts +25 -0
- package/audio/decoder.d.ts.map +1 -0
- package/audio/emitter.d.ts +17 -0
- package/audio/emitter.d.ts.map +1 -0
- package/audio/index.d.ts +6 -0
- package/audio/index.d.ts.map +1 -0
- package/audio/mse.d.ts +21 -0
- package/audio/mse.d.ts.map +1 -0
- package/audio/render-worklet.d.ts +2 -0
- package/audio/render-worklet.d.ts.map +1 -0
- package/audio/render.d.ts +24 -0
- package/audio/render.d.ts.map +1 -0
- package/audio/ring-buffer.d.ts +19 -0
- package/audio/ring-buffer.d.ts.map +1 -0
- package/audio/ring-buffer.test.d.ts +2 -0
- package/audio/ring-buffer.test.d.ts.map +1 -0
- package/audio/source.d.ts +34 -0
- package/audio/source.d.ts.map +1 -0
- package/backend.d.ts +53 -0
- package/backend.d.ts.map +1 -0
- package/broadcast-CSXy8QiX.js +8192 -0
- package/broadcast-CSXy8QiX.js.map +1 -0
- package/broadcast.d.ts +23 -0
- package/broadcast.d.ts.map +1 -0
- package/chat/index.d.ts +17 -0
- package/chat/index.d.ts.map +1 -0
- package/chat/message.d.ts +16 -0
- package/chat/message.d.ts.map +1 -0
- package/chat/typing.d.ts +16 -0
- package/chat/typing.d.ts.map +1 -0
- package/element.d.ts +35 -0
- package/element.d.ts.map +1 -0
- package/element.js +105 -0
- package/element.js.map +1 -0
- package/index.d.ts +10 -0
- package/index.d.ts.map +1 -0
- package/index.js +232 -0
- package/index.js.map +1 -0
- package/libav-opus-af-BlMWboA7.js +368 -0
- package/libav-opus-af-BlMWboA7.js.map +1 -0
- package/location/index.d.ts +17 -0
- package/location/index.d.ts.map +1 -0
- package/location/peers.d.ts +16 -0
- package/location/peers.d.ts.map +1 -0
- package/location/window.d.ts +17 -0
- package/location/window.d.ts.map +1 -0
- package/main-DGBFe0O7.js +2301 -0
- package/main-DGBFe0O7.js.map +1 -0
- package/mse.d.ts +19 -0
- package/mse.d.ts.map +1 -0
- package/package.json +41 -0
- package/preview.d.ts +23 -0
- package/preview.d.ts.map +1 -0
- package/support/element.d.ts +22 -0
- package/support/element.d.ts.map +1 -0
- package/support/element.js +184 -0
- package/support/element.js.map +1 -0
- package/support/index.d.ts +29 -0
- package/support/index.d.ts.map +1 -0
- package/support/index.js +55 -0
- package/support/index.js.map +1 -0
- package/sync.d.ts +21 -0
- package/sync.d.ts.map +1 -0
- package/ui/components/BufferControl.d.ts +8 -0
- package/ui/components/BufferControl.d.ts.map +1 -0
- package/ui/components/BufferingIndicator.d.ts +2 -0
- package/ui/components/BufferingIndicator.d.ts.map +1 -0
- package/ui/components/FullscreenButton.d.ts +2 -0
- package/ui/components/FullscreenButton.d.ts.map +1 -0
- package/ui/components/LatencySlider.d.ts +2 -0
- package/ui/components/LatencySlider.d.ts.map +1 -0
- package/ui/components/PlayPauseButton.d.ts +2 -0
- package/ui/components/PlayPauseButton.d.ts.map +1 -0
- package/ui/components/QualitySelector.d.ts +3 -0
- package/ui/components/QualitySelector.d.ts.map +1 -0
- package/ui/components/StatsButton.d.ts +5 -0
- package/ui/components/StatsButton.d.ts.map +1 -0
- package/ui/components/VolumeSlider.d.ts +2 -0
- package/ui/components/VolumeSlider.d.ts.map +1 -0
- package/ui/components/WatchControls.d.ts +2 -0
- package/ui/components/WatchControls.d.ts.map +1 -0
- package/ui/components/WatchStatusIndicator.d.ts +2 -0
- package/ui/components/WatchStatusIndicator.d.ts.map +1 -0
- package/ui/context.d.ts +41 -0
- package/ui/context.d.ts.map +1 -0
- package/ui/element.d.ts +5 -0
- package/ui/element.d.ts.map +1 -0
- package/ui/hooks/use-watch-ui.d.ts +3 -0
- package/ui/hooks/use-watch-ui.d.ts.map +1 -0
- package/ui/index.d.ts +7 -0
- package/ui/index.d.ts.map +1 -0
- package/ui/index.js +1121 -0
- package/ui/index.js.map +1 -0
- package/user.d.ts +17 -0
- package/user.d.ts.map +1 -0
- package/video/backend.d.ts +16 -0
- package/video/backend.d.ts.map +1 -0
- package/video/decoder.d.ts +25 -0
- package/video/decoder.d.ts.map +1 -0
- package/video/index.d.ts +6 -0
- package/video/index.d.ts.map +1 -0
- package/video/mse.d.ts +23 -0
- package/video/mse.d.ts.map +1 -0
- package/video/renderer.d.ts +15 -0
- package/video/renderer.d.ts.map +1 -0
- package/video/source.d.ts +35 -0
- package/video/source.d.ts.map +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img height="128px" src="https://github.com/moq-dev/moq/blob/main/.github/logo.svg" alt="Media over QUIC">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# @moq/watch
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/@moq/watch)
|
|
8
|
+
[](https://www.typescriptlang.org/)
|
|
9
|
+
|
|
10
|
+
Subscribe to and render [Media over QUIC](https://moq.dev/) (MoQ) broadcasts, built on top of [@moq/hang](../hang) and [@moq/lite](../lite).
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
bun add @moq/watch
|
|
16
|
+
# or
|
|
17
|
+
npm add @moq/watch
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Web Component
|
|
21
|
+
|
|
22
|
+
The simplest way to watch a stream:
|
|
23
|
+
|
|
24
|
+
```html
|
|
25
|
+
<script type="module">
|
|
26
|
+
import "@moq/watch/element";
|
|
27
|
+
</script>
|
|
28
|
+
|
|
29
|
+
<moq-watch
|
|
30
|
+
url="https://relay.example.com/anon"
|
|
31
|
+
path="room/alice"
|
|
32
|
+
controls>
|
|
33
|
+
<canvas></canvas>
|
|
34
|
+
</moq-watch>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Attributes
|
|
38
|
+
|
|
39
|
+
| Attribute | Type | Default | Description |
|
|
40
|
+
|-----------|---------|----------|-----------------------|
|
|
41
|
+
| `url` | string | required | Relay server URL |
|
|
42
|
+
| `path` | string | required | Broadcast path |
|
|
43
|
+
| `paused` | boolean | false | Pause playback |
|
|
44
|
+
| `muted` | boolean | false | Mute audio |
|
|
45
|
+
| `volume` | number | 1 | Audio volume (0-1) |
|
|
46
|
+
|
|
47
|
+
## JavaScript API
|
|
48
|
+
|
|
49
|
+
For more control:
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
import * as Watch from "@moq/watch";
|
|
53
|
+
|
|
54
|
+
const watch = new Watch.Broadcast(connection, {
|
|
55
|
+
enabled: true,
|
|
56
|
+
name: "alice",
|
|
57
|
+
video: { enabled: true },
|
|
58
|
+
audio: { enabled: true },
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// Access the video stream
|
|
62
|
+
watch.video.media.subscribe((stream) => {
|
|
63
|
+
if (stream) {
|
|
64
|
+
videoElement.srcObject = stream;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## UI Web Component
|
|
70
|
+
|
|
71
|
+
`@moq/watch` includes a SolidJS-powered UI overlay (`<moq-watch-ui>`) with playback controls, volume, buffering indicator, quality selector, and stats panel. It depends on [`@moq/ui-core`](../ui-core) for shared UI primitives.
|
|
72
|
+
|
|
73
|
+
```html
|
|
74
|
+
<script type="module">
|
|
75
|
+
import "@moq/watch/element";
|
|
76
|
+
import "@moq/watch/ui";
|
|
77
|
+
</script>
|
|
78
|
+
|
|
79
|
+
<moq-watch-ui>
|
|
80
|
+
<moq-watch url="https://relay.example.com/anon" path="room/alice">
|
|
81
|
+
<canvas></canvas>
|
|
82
|
+
</moq-watch>
|
|
83
|
+
</moq-watch-ui>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The `<moq-watch-ui>` element automatically discovers the nested `<moq-watch>` element and wires up reactive controls.
|
|
87
|
+
|
|
88
|
+
## Features
|
|
89
|
+
|
|
90
|
+
- **WebCodecs decoding** — Hardware-accelerated video and audio decoding
|
|
91
|
+
- **MSE fallback** — Media Source Extensions for broader codec support
|
|
92
|
+
- **Reactive state** — All properties are signals from `@moq/signals`
|
|
93
|
+
- **Chat** — Subscribe to text chat channels
|
|
94
|
+
- **Location** — Peer location and window tracking
|
|
95
|
+
- **Quality selection** — Switch between available renditions
|
|
96
|
+
|
|
97
|
+
## License
|
|
98
|
+
|
|
99
|
+
Licensed under either:
|
|
100
|
+
|
|
101
|
+
- Apache License, Version 2.0 ([LICENSE-APACHE](../../LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
|
|
102
|
+
- MIT license ([LICENSE-MIT](../../LICENSE-MIT) or http://opensource.org/licenses/MIT)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Getter, Signal } from "@moq/signals";
|
|
2
|
+
import type { BufferedRanges } from "../backend";
|
|
3
|
+
import type { Source } from "./source";
|
|
4
|
+
export interface Backend {
|
|
5
|
+
source: Source;
|
|
6
|
+
volume: Signal<number>;
|
|
7
|
+
muted: Signal<boolean>;
|
|
8
|
+
stats: Getter<Stats | undefined>;
|
|
9
|
+
buffered: Getter<BufferedRanges>;
|
|
10
|
+
}
|
|
11
|
+
export interface Stats {
|
|
12
|
+
sampleCount: number;
|
|
13
|
+
bytesReceived: number;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +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,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGvC,MAAM,WAAW,OAAO;IAEvB,MAAM,EAAE,MAAM,CAAC;IAGf,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAGvB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAGvB,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAGjC,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,KAAK;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Time } from "@moq/lite";
|
|
2
|
+
import { type Getter, Signal } from "@moq/signals";
|
|
3
|
+
import type { BufferedRanges } from "../backend";
|
|
4
|
+
import type { Source } from "./source";
|
|
5
|
+
export type DecoderProps = {
|
|
6
|
+
enabled?: boolean | Signal<boolean>;
|
|
7
|
+
};
|
|
8
|
+
export interface AudioStats {
|
|
9
|
+
bytesReceived: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class Decoder {
|
|
12
|
+
#private;
|
|
13
|
+
source: Source;
|
|
14
|
+
enabled: Signal<boolean>;
|
|
15
|
+
readonly context: Getter<AudioContext | undefined>;
|
|
16
|
+
readonly root: Getter<AudioNode | undefined>;
|
|
17
|
+
readonly sampleRate: Getter<number | undefined>;
|
|
18
|
+
readonly stats: Getter<AudioStats | undefined>;
|
|
19
|
+
readonly timestamp: Getter<Time.Milli | undefined>;
|
|
20
|
+
readonly stalled: Getter<boolean>;
|
|
21
|
+
readonly buffered: Getter<BufferedRanges>;
|
|
22
|
+
constructor(source: Source, props?: DecoderProps);
|
|
23
|
+
close(): void;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=decoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decoder.d.ts","sourceRoot":"","sources":["../../src/audio/decoder.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD,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,aAAa,EAAE,MAAM,CAAC;CACtB;AAID,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;gBAI/C,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY;IAyThD,KAAK;CAGL"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Signal } from "@moq/signals";
|
|
2
|
+
import type { Decoder } from "./decoder";
|
|
3
|
+
export type EmitterProps = {
|
|
4
|
+
volume?: number | Signal<number>;
|
|
5
|
+
muted?: boolean | Signal<boolean>;
|
|
6
|
+
paused?: boolean | Signal<boolean>;
|
|
7
|
+
};
|
|
8
|
+
export declare class Emitter {
|
|
9
|
+
#private;
|
|
10
|
+
source: Decoder;
|
|
11
|
+
volume: Signal<number>;
|
|
12
|
+
muted: Signal<boolean>;
|
|
13
|
+
paused: Signal<boolean>;
|
|
14
|
+
constructor(source: Decoder, props?: EmitterProps);
|
|
15
|
+
close(): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=emitter.d.ts.map
|
|
@@ -0,0 +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;gBAUZ,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,YAAY;IAiEjD,KAAK;CAGL"}
|
package/audio/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audio/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,WAAW,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC"}
|
package/audio/mse.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type Getter, Signal } from "@moq/signals";
|
|
2
|
+
import { type BufferedRanges } from "../backend";
|
|
3
|
+
import type { Muxer } from "../mse";
|
|
4
|
+
import type { Backend, Stats } from "./backend";
|
|
5
|
+
import type { Source } from "./source";
|
|
6
|
+
export type MseProps = {
|
|
7
|
+
volume?: number | Signal<number>;
|
|
8
|
+
muted?: boolean | Signal<boolean>;
|
|
9
|
+
};
|
|
10
|
+
export declare class Mse implements Backend {
|
|
11
|
+
#private;
|
|
12
|
+
muxer: Muxer;
|
|
13
|
+
source: Source;
|
|
14
|
+
volume: Signal<number>;
|
|
15
|
+
muted: Signal<boolean>;
|
|
16
|
+
readonly stats: Getter<Stats | undefined>;
|
|
17
|
+
readonly buffered: Getter<BufferedRanges>;
|
|
18
|
+
constructor(muxer: Muxer, source: Source, props?: MseProps);
|
|
19
|
+
close(): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=mse.d.ts.map
|
|
@@ -0,0 +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;AAC3D,OAAO,EAAE,KAAK,cAAc,EAAqB,MAAM,YAAY,CAAC;AACpE,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;gBAI/C,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ;IAsM1D,KAAK,IAAI,IAAI;CAGb"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-worklet.d.ts","sourceRoot":"","sources":["../../src/audio/render-worklet.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Time } from "@moq/lite";
|
|
2
|
+
export type Message = Init | Data | Latency;
|
|
3
|
+
export type ToMain = State;
|
|
4
|
+
export interface State {
|
|
5
|
+
type: "state";
|
|
6
|
+
timestamp: Time.Micro;
|
|
7
|
+
stalled: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface Data {
|
|
10
|
+
type: "data";
|
|
11
|
+
data: Float32Array[];
|
|
12
|
+
timestamp: Time.Micro;
|
|
13
|
+
}
|
|
14
|
+
export interface Init {
|
|
15
|
+
type: "init";
|
|
16
|
+
rate: number;
|
|
17
|
+
channels: number;
|
|
18
|
+
latency: Time.Milli;
|
|
19
|
+
}
|
|
20
|
+
export interface Latency {
|
|
21
|
+
type: "latency";
|
|
22
|
+
latency: Time.Milli;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/audio/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC;AAE5C,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC;AAE3B,MAAM,WAAW,KAAK;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,IAAI;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,IAAI;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;CACpB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Time } from "@moq/lite";
|
|
2
|
+
export declare class AudioRingBuffer {
|
|
3
|
+
#private;
|
|
4
|
+
readonly rate: number;
|
|
5
|
+
readonly channels: number;
|
|
6
|
+
constructor(props: {
|
|
7
|
+
rate: number;
|
|
8
|
+
channels: number;
|
|
9
|
+
latency: Time.Milli;
|
|
10
|
+
});
|
|
11
|
+
get stalled(): boolean;
|
|
12
|
+
get timestamp(): Time.Micro;
|
|
13
|
+
get length(): number;
|
|
14
|
+
get capacity(): number;
|
|
15
|
+
resize(latency: Time.Milli): void;
|
|
16
|
+
write(timestamp: Time.Micro, data: Float32Array[]): void;
|
|
17
|
+
read(output: Float32Array[]): number;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=ring-buffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ring-buffer.d.ts","sourceRoot":"","sources":["../../src/audio/ring-buffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,qBAAa,eAAe;;IAK3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAGd,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAA;KAAE;IAiB1E,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;IAgCjC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI;IAiExD,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM;CAsBpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ring-buffer.test.d.ts","sourceRoot":"","sources":["../../src/audio/ring-buffer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type * as Catalog from "@moq/hang/catalog";
|
|
2
|
+
import { type Getter, Signal } from "@moq/signals";
|
|
3
|
+
import type { Broadcast } from "../broadcast";
|
|
4
|
+
import type { Sync } from "../sync";
|
|
5
|
+
export type Target = {
|
|
6
|
+
name?: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* A function that checks if an audio configuration is supported by the backend.
|
|
10
|
+
*/
|
|
11
|
+
export type Supported = (config: Catalog.AudioConfig) => Promise<boolean>;
|
|
12
|
+
export type SourceProps = {
|
|
13
|
+
broadcast?: Broadcast | Signal<Broadcast | undefined>;
|
|
14
|
+
target?: Target | Signal<Target | undefined>;
|
|
15
|
+
supported?: Supported;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Source handles catalog extraction, support checking, and rendition selection
|
|
19
|
+
* for audio playback. It is used by both MSE and Decoder backends.
|
|
20
|
+
*/
|
|
21
|
+
export declare class Source {
|
|
22
|
+
#private;
|
|
23
|
+
broadcast: Signal<Broadcast | undefined>;
|
|
24
|
+
target: Signal<Target | undefined>;
|
|
25
|
+
readonly catalog: Getter<Catalog.Audio | undefined>;
|
|
26
|
+
readonly available: Getter<Record<string, Catalog.AudioConfig>>;
|
|
27
|
+
readonly track: Signal<string | undefined>;
|
|
28
|
+
readonly config: Getter<Catalog.AudioConfig | undefined>;
|
|
29
|
+
supported: Signal<Supported | undefined>;
|
|
30
|
+
sync: Sync;
|
|
31
|
+
constructor(sync: Sync, props?: SourceProps);
|
|
32
|
+
close(): void;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=source.d.ts.map
|
|
@@ -0,0 +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;AAEpC,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;IAGnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAiB;IAGpE,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;gBAIC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,WAAW;IAyF3C,KAAK,IAAI,IAAI;CAGb"}
|
package/backend.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as Moq from "@moq/lite";
|
|
2
|
+
import { Signal } from "@moq/signals";
|
|
3
|
+
import * as Audio from "./audio";
|
|
4
|
+
import type { Broadcast } from "./broadcast";
|
|
5
|
+
import * as Video from "./video";
|
|
6
|
+
export interface BufferedRange {
|
|
7
|
+
start: Moq.Time.Milli;
|
|
8
|
+
end: Moq.Time.Milli;
|
|
9
|
+
}
|
|
10
|
+
export type BufferedRanges = BufferedRange[];
|
|
11
|
+
export declare function timeRangesToArray(ranges: TimeRanges): BufferedRanges;
|
|
12
|
+
export interface Backend {
|
|
13
|
+
paused: Signal<boolean>;
|
|
14
|
+
video?: Video.Backend;
|
|
15
|
+
audio?: Audio.Backend;
|
|
16
|
+
jitter: Signal<Moq.Time.Milli>;
|
|
17
|
+
}
|
|
18
|
+
export interface MultiBackendProps {
|
|
19
|
+
element?: HTMLCanvasElement | HTMLVideoElement | Signal<HTMLCanvasElement | HTMLVideoElement | undefined>;
|
|
20
|
+
broadcast?: Broadcast | Signal<Broadcast | undefined>;
|
|
21
|
+
jitter?: Moq.Time.Milli | Signal<Moq.Time.Milli>;
|
|
22
|
+
paused?: boolean | Signal<boolean>;
|
|
23
|
+
}
|
|
24
|
+
declare class VideoBackend implements Video.Backend {
|
|
25
|
+
source: Video.Source;
|
|
26
|
+
stats: Moq.Signals.Signal<Video.Stats | undefined>;
|
|
27
|
+
stalled: Moq.Signals.Signal<boolean>;
|
|
28
|
+
buffered: Moq.Signals.Signal<BufferedRanges>;
|
|
29
|
+
timestamp: Moq.Signals.Signal<Moq.Time.Milli>;
|
|
30
|
+
constructor(source: Video.Source);
|
|
31
|
+
}
|
|
32
|
+
declare class AudioBackend implements Audio.Backend {
|
|
33
|
+
source: Audio.Source;
|
|
34
|
+
volume: Moq.Signals.Signal<number>;
|
|
35
|
+
muted: Moq.Signals.Signal<boolean>;
|
|
36
|
+
stats: Moq.Signals.Signal<Audio.Stats | undefined>;
|
|
37
|
+
buffered: Moq.Signals.Signal<BufferedRanges>;
|
|
38
|
+
constructor(source: Audio.Source);
|
|
39
|
+
}
|
|
40
|
+
export declare class MultiBackend implements Backend {
|
|
41
|
+
#private;
|
|
42
|
+
element: Moq.Signals.Signal<HTMLVideoElement | HTMLCanvasElement | undefined>;
|
|
43
|
+
broadcast: Signal<Broadcast | undefined>;
|
|
44
|
+
jitter: Signal<Moq.Time.Milli>;
|
|
45
|
+
paused: Signal<boolean>;
|
|
46
|
+
video: VideoBackend;
|
|
47
|
+
audio: AudioBackend;
|
|
48
|
+
signals: Moq.Signals.Effect;
|
|
49
|
+
constructor(props?: MultiBackendProps);
|
|
50
|
+
close(): void;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=backend.d.ts.map
|
package/backend.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,EAAU,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAGjC,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;IACtB,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;CACpB;AACD,MAAM,MAAM,cAAc,GAAG,aAAa,EAAE,CAAC;AAG7C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,cAAc,CAUpE;AAED,MAAM,WAAW,OAAO;IAEvB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAGxB,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC;IAGtB,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC;IAGtB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IACjC,OAAO,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,MAAM,CAAC,iBAAiB,GAAG,gBAAgB,GAAG,SAAS,CAAC,CAAC;IAC1G,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAGtD,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEjD,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;CACnC;AAGD,cAAM,YAAa,YAAW,KAAK,CAAC,OAAO;IAE1C,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IAGrB,KAAK,8CAAkD;IAGvD,OAAO,8BAA8B;IAGrC,QAAQ,qCAAkC;IAG1C,SAAS,qCAAmD;gBAEhD,MAAM,EAAE,KAAK,CAAC,MAAM;CAGhC;AAGD,cAAM,YAAa,YAAW,KAAK,CAAC,OAAO;IAC1C,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IAGrB,MAAM,6BAA2B;IAGjC,KAAK,8BAA8B;IAGnC,KAAK,8CAAkD;IAGvD,QAAQ,qCAAkC;gBAE9B,MAAM,EAAE,KAAK,CAAC,MAAM;CAGhC;AAKD,qBAAa,YAAa,YAAW,OAAO;;IAC3C,OAAO,uEAA2E;IAClF,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAExB,KAAK,EAAE,YAAY,CAAC;IAGpB,KAAK,EAAE,YAAY,CAAC;IAMpB,OAAO,qBAAgB;gBAEX,KAAK,CAAC,EAAE,iBAAiB;IAyFrC,KAAK,IAAI,IAAI;CAGb"}
|