@omnimedia/omnitool 1.1.0-107 → 1.1.0-108
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 +9 -0
- package/package.json +1 -1
- package/s/timeline/renderers/parts/audio-level.ts +16 -0
- package/s/timeline/renderers/parts/samplers/audio/parts/init.ts +1 -0
- package/s/timeline/renderers/parts/samplers/audio/parts/types.ts +2 -0
- package/s/timeline/renderers/player/parts/audio-levels.ts +120 -0
- package/s/timeline/renderers/player/parts/playback.ts +22 -5
- package/s/timeline/renderers/player/parts/types.ts +26 -0
- package/s/timeline/renderers/player/player.ts +3 -0
- package/x/demo/demo.bundle.min.js +100 -100
- package/x/demo/demo.bundle.min.js.map +4 -4
- package/x/index.html +2 -2
- package/x/tests.bundle.min.js +103 -103
- package/x/tests.bundle.min.js.map +4 -4
- package/x/tests.html +1 -1
- package/x/timeline/renderers/parts/audio-level.d.ts +4 -0
- package/x/timeline/renderers/parts/audio-level.js +13 -0
- package/x/timeline/renderers/parts/audio-level.js.map +1 -0
- package/x/timeline/renderers/parts/samplers/audio/parts/init.js +1 -0
- package/x/timeline/renderers/parts/samplers/audio/parts/init.js.map +1 -1
- package/x/timeline/renderers/parts/samplers/audio/parts/types.d.ts +2 -0
- package/x/timeline/renderers/parts/samplers/audio/sampler.d.ts +1 -0
- package/x/timeline/renderers/player/parts/audio-levels.d.ts +15 -0
- package/x/timeline/renderers/player/parts/audio-levels.js +93 -0
- package/x/timeline/renderers/player/parts/audio-levels.js.map +1 -0
- package/x/timeline/renderers/player/parts/playback.d.ts +4 -1
- package/x/timeline/renderers/player/parts/playback.js +16 -5
- package/x/timeline/renderers/player/parts/playback.js.map +1 -1
- package/x/timeline/renderers/player/parts/types.d.ts +20 -0
- package/x/timeline/renderers/player/parts/types.js +2 -0
- package/x/timeline/renderers/player/parts/types.js.map +1 -0
- package/x/timeline/renderers/player/player.d.ts +4 -0
- package/x/timeline/renderers/player/player.js +2 -0
- package/x/timeline/renderers/player/player.js.map +1 -1
package/x/tests.html
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function measureAudioLevel(samples) {
|
|
2
|
+
let peak = 0;
|
|
3
|
+
let sumSquares = 0;
|
|
4
|
+
for (const value of samples) {
|
|
5
|
+
peak = Math.max(peak, Math.abs(value));
|
|
6
|
+
sumSquares += value ** 2;
|
|
7
|
+
}
|
|
8
|
+
return {
|
|
9
|
+
peak,
|
|
10
|
+
rms: samples.length > 0 ? Math.sqrt(sumSquares / samples.length) : 0
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=audio-level.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-level.js","sourceRoot":"","sources":["../../../../s/timeline/renderers/parts/audio-level.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,iBAAiB,CAAC,OAAsC;IACvE,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,IAAI,UAAU,GAAG,CAAC,CAAA;IAElB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;QACtC,UAAU,IAAI,KAAK,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,OAAO;QACN,IAAI;QACJ,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;KACpE,CAAA;AACF,CAAC"}
|
|
@@ -26,6 +26,7 @@ export async function initStreams(pool, items, from) {
|
|
|
26
26
|
get currentSample() { return currentSample; },
|
|
27
27
|
timelineTime: () => seconds(offset + currentSample.timestamp),
|
|
28
28
|
output: () => ({
|
|
29
|
+
itemId: item.id,
|
|
29
30
|
sample: currentSample,
|
|
30
31
|
timestamp: offset + currentSample.timestamp,
|
|
31
32
|
gain: item.gain ?? 1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../../../../s/timeline/renderers/parts/samplers/audio/parts/init.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,IAAI,EAAC,MAAM,8BAA8B,CAAA;AACjD,OAAO,EAAC,OAAO,EAAC,MAAM,oCAAoC,CAAA;AAE1D,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,IAAmB,EACnB,KAAmC,EACnC,IAAQ;IAER,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAC,IAAI,EAAE,SAAS,EAAC,EAAE,EAAE;QACrC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK;YAC3B,OAAM;QACP,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;YACzB,OAAM;QACP,IAAI,SAAS,IAAI,IAAI,CAAC,QAAQ;YAC7B,OAAM;QAEP,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC/C,IAAI,CAAC,IAAI;YACR,OAAM;QAEP,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS,CAAA;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAA;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC,CAAA;QAE5D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAC/B,IAAI,KAAK,CAAC,IAAI;YACb,OAAM;QAEP,IAAI,aAAa,GAAG,KAAK,CAAC,KAAK,CAAA;QAC/B,IAAI,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAE7B,OAAO;YACN,MAAM;YACN,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;YACpB,IAAI,aAAa,KAAI,OAAO,aAAa,CAAA,CAAA,CAAC;YAC1C,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC;YAC7D,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBACd,MAAM,EAAE,aAAa;gBACrB,SAAS,EAAE,MAAM,GAAG,aAAa,CAAC,SAAS;gBAC3C,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;aACpB,CAAC;YACF,OAAO,EAAE,KAAK,IAAI,EAAE;gBACnB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAA;gBAChC,IAAI,MAAM,CAAC,IAAI;oBACd,OAAO,KAAK,CAAA;gBAEb,aAAa,GAAG,MAAM,CAAC,KAAK,CAAA;gBAC5B,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;gBAEzB,OAAO,IAAI,CAAA;YACZ,CAAC;SACD,CAAA;IACF,CAAC,CAAC,CACF,CAAA;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAA0B,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;AACpE,CAAC"}
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../../../../s/timeline/renderers/parts/samplers/audio/parts/init.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,IAAI,EAAC,MAAM,8BAA8B,CAAA;AACjD,OAAO,EAAC,OAAO,EAAC,MAAM,oCAAoC,CAAA;AAE1D,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,IAAmB,EACnB,KAAmC,EACnC,IAAQ;IAER,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAC,IAAI,EAAE,SAAS,EAAC,EAAE,EAAE;QACrC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK;YAC3B,OAAM;QACP,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;YACzB,OAAM;QACP,IAAI,SAAS,IAAI,IAAI,CAAC,QAAQ;YAC7B,OAAM;QAEP,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC/C,IAAI,CAAC,IAAI;YACR,OAAM;QAEP,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS,CAAA;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAA;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC,CAAA;QAE5D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAC/B,IAAI,KAAK,CAAC,IAAI;YACb,OAAM;QAEP,IAAI,aAAa,GAAG,KAAK,CAAC,KAAK,CAAA;QAC/B,IAAI,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAE7B,OAAO;YACN,MAAM;YACN,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;YACpB,IAAI,aAAa,KAAI,OAAO,aAAa,CAAA,CAAA,CAAC;YAC1C,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC;YAC7D,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBACd,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,MAAM,EAAE,aAAa;gBACrB,SAAS,EAAE,MAAM,GAAG,aAAa,CAAC,SAAS;gBAC3C,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;aACpB,CAAC;YACF,OAAO,EAAE,KAAK,IAAI,EAAE;gBACnB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAA;gBAChC,IAAI,MAAM,CAAC,IAAI;oBACd,OAAO,KAAK,CAAA;gBAEb,aAAa,GAAG,MAAM,CAAC,KAAK,CAAA;gBAC5B,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;gBAEzB,OAAO,IAAI,CAAA;YACZ,CAAC;SACD,CAAA;IACF,CAAC,CAAC,CACF,CAAA;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAA0B,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;AACpE,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AudioSample } from "mediabunny";
|
|
2
|
+
import { Id } from "../../../../../parts/basics.js";
|
|
2
3
|
import { Seconds } from "../../../../../../units/seconds.js";
|
|
3
4
|
export type ActiveStream = {
|
|
4
5
|
offset: Seconds;
|
|
@@ -6,6 +7,7 @@ export type ActiveStream = {
|
|
|
6
7
|
currentSample: AudioSample;
|
|
7
8
|
timelineTime: () => Seconds;
|
|
8
9
|
output: () => {
|
|
10
|
+
itemId: Id;
|
|
9
11
|
sample: AudioSample;
|
|
10
12
|
timestamp: number;
|
|
11
13
|
gain: number;
|
|
@@ -4,6 +4,7 @@ import { TimelineFile } from "../../../../parts/basics.js";
|
|
|
4
4
|
import { DecoderSource } from "../../../../../driver/fns/schematic.js";
|
|
5
5
|
export declare function createAudioSampler(resolveMedia: (hash: string) => DecoderSource): {
|
|
6
6
|
sampleAudio(timeline: TimelineFile, from: Ms): AsyncGenerator<{
|
|
7
|
+
itemId: import("../../../../parts/basics.js").Id;
|
|
7
8
|
sample: AudioSample;
|
|
8
9
|
timestamp: number;
|
|
9
10
|
gain: number;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Ms } from '../../../../units/ms.js';
|
|
2
|
+
import { Id } from '../../../parts/basics.js';
|
|
3
|
+
import { AudioItemSelector, AudioLevelListener, AudioLevelObserver } from './types.js';
|
|
4
|
+
export declare class AudioLevels implements AudioLevelObserver {
|
|
5
|
+
#private;
|
|
6
|
+
private context;
|
|
7
|
+
private time;
|
|
8
|
+
private isPlaying;
|
|
9
|
+
constructor(context: AudioContext, time: () => Ms, isPlaying: () => boolean);
|
|
10
|
+
on(items: AudioItemSelector, listener: AudioLevelListener): () => void;
|
|
11
|
+
attach(itemId: Id, node: GainNode): void;
|
|
12
|
+
detach(node: GainNode): void;
|
|
13
|
+
start(): void;
|
|
14
|
+
stop(): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { measureAudioLevel } from '../../parts/audio-level.js';
|
|
2
|
+
export class AudioLevels {
|
|
3
|
+
context;
|
|
4
|
+
time;
|
|
5
|
+
isPlaying;
|
|
6
|
+
#meters = new Set();
|
|
7
|
+
#items = new Map();
|
|
8
|
+
#frame = null;
|
|
9
|
+
#running = false;
|
|
10
|
+
constructor(context, time, isPlaying) {
|
|
11
|
+
this.context = context;
|
|
12
|
+
this.time = time;
|
|
13
|
+
this.isPlaying = isPlaying;
|
|
14
|
+
}
|
|
15
|
+
on(items, listener) {
|
|
16
|
+
const silent = this.context.createGain();
|
|
17
|
+
const analyser = this.context.createAnalyser();
|
|
18
|
+
silent.gain.value = 0;
|
|
19
|
+
analyser.smoothingTimeConstant = 0;
|
|
20
|
+
analyser.connect(silent);
|
|
21
|
+
silent.connect(this.context.destination);
|
|
22
|
+
const meter = {
|
|
23
|
+
items,
|
|
24
|
+
silent,
|
|
25
|
+
listener,
|
|
26
|
+
analyser,
|
|
27
|
+
nodes: new Set(),
|
|
28
|
+
samples: new Float32Array(analyser.fftSize)
|
|
29
|
+
};
|
|
30
|
+
this.#meters.add(meter);
|
|
31
|
+
if (this.isPlaying())
|
|
32
|
+
this.start();
|
|
33
|
+
return () => {
|
|
34
|
+
if (!this.#meters.delete(meter))
|
|
35
|
+
return;
|
|
36
|
+
for (const node of meter.nodes)
|
|
37
|
+
node.disconnect(analyser);
|
|
38
|
+
analyser.disconnect();
|
|
39
|
+
silent.disconnect();
|
|
40
|
+
if (!this.#meters.size)
|
|
41
|
+
this.stop();
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
attach(itemId, node) {
|
|
45
|
+
this.#items.set(node, itemId);
|
|
46
|
+
}
|
|
47
|
+
detach(node) {
|
|
48
|
+
this.#items.delete(node);
|
|
49
|
+
for (const meter of this.#meters) {
|
|
50
|
+
if (meter.nodes.delete(node))
|
|
51
|
+
node.disconnect(meter.analyser);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
start() {
|
|
55
|
+
if (this.#running || !this.#meters.size)
|
|
56
|
+
return;
|
|
57
|
+
this.#running = true;
|
|
58
|
+
this.#frame = requestAnimationFrame(() => this.#tick());
|
|
59
|
+
}
|
|
60
|
+
stop() {
|
|
61
|
+
this.#running = false;
|
|
62
|
+
if (this.#frame !== null)
|
|
63
|
+
cancelAnimationFrame(this.#frame);
|
|
64
|
+
this.#frame = null;
|
|
65
|
+
}
|
|
66
|
+
#tick() {
|
|
67
|
+
if (!this.#running)
|
|
68
|
+
return;
|
|
69
|
+
for (const meter of this.#meters) {
|
|
70
|
+
this.#sync(meter);
|
|
71
|
+
meter.analyser.getFloatTimeDomainData(meter.samples);
|
|
72
|
+
meter.listener({ time: this.time(), ...measureAudioLevel(meter.samples) });
|
|
73
|
+
}
|
|
74
|
+
if (this.#running)
|
|
75
|
+
this.#frame = requestAnimationFrame(() => this.#tick());
|
|
76
|
+
}
|
|
77
|
+
#sync(meter) {
|
|
78
|
+
const selected = new Set(meter.items());
|
|
79
|
+
for (const [node, itemId] of this.#items) {
|
|
80
|
+
const connected = meter.nodes.has(node);
|
|
81
|
+
const shouldConnect = selected.has(itemId);
|
|
82
|
+
if (shouldConnect && !connected) {
|
|
83
|
+
node.connect(meter.analyser);
|
|
84
|
+
meter.nodes.add(node);
|
|
85
|
+
}
|
|
86
|
+
else if (!shouldConnect && connected) {
|
|
87
|
+
node.disconnect(meter.analyser);
|
|
88
|
+
meter.nodes.delete(node);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=audio-levels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-levels.js","sourceRoot":"","sources":["../../../../../s/timeline/renderers/player/parts/audio-levels.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AudioLevels } from "./audio-levels.js";
|
|
1
2
|
import { Fps } from '../../../../units/fps.js';
|
|
2
3
|
import { Ms } from '../../../../units/ms.js';
|
|
3
4
|
import { Driver } from '../../../../driver/driver.js';
|
|
@@ -9,8 +10,10 @@ export declare class Playback {
|
|
|
9
10
|
private driver;
|
|
10
11
|
private timeline;
|
|
11
12
|
private resolveMedia;
|
|
13
|
+
audioLevels: AudioLevels;
|
|
12
14
|
audioSampler: {
|
|
13
15
|
sampleAudio(timeline: TimelineFile, from: Ms): AsyncGenerator<{
|
|
16
|
+
itemId: import("../../../parts/basics.js").Id;
|
|
14
17
|
sample: import("mediabunny").AudioSample;
|
|
15
18
|
timestamp: number;
|
|
16
19
|
gain: number;
|
|
@@ -24,7 +27,7 @@ export declare class Playback {
|
|
|
24
27
|
onTick: import("@e280/stz").Pub<[]>;
|
|
25
28
|
audioContext: AudioContext;
|
|
26
29
|
audioGain: GainNode;
|
|
27
|
-
audioNodes:
|
|
30
|
+
audioNodes: Map<AudioBufferSourceNode, GainNode>;
|
|
28
31
|
constructor(driver: Driver, timeline: TimelineFile, resolveMedia: (hash: string) => DecoderSource);
|
|
29
32
|
update(timeline: TimelineFile): void;
|
|
30
33
|
get isPlaying(): boolean;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AudioLevels } from "./audio-levels.js";
|
|
1
2
|
import { ms } from '../../../../units/ms.js';
|
|
2
3
|
import { realtime } from '../../parts/schedulers.js';
|
|
3
4
|
import { seconds } from '../../../../units/seconds.js';
|
|
@@ -9,6 +10,7 @@ export class Playback {
|
|
|
9
10
|
driver;
|
|
10
11
|
timeline;
|
|
11
12
|
resolveMedia;
|
|
13
|
+
audioLevels;
|
|
12
14
|
audioSampler;
|
|
13
15
|
seekVisualSampler;
|
|
14
16
|
playVisualSampler = null;
|
|
@@ -20,7 +22,7 @@ export class Playback {
|
|
|
20
22
|
onTick = this.#controller.onTick;
|
|
21
23
|
audioContext = new AudioContext({ sampleRate: 48000 });
|
|
22
24
|
audioGain = this.audioContext.createGain();
|
|
23
|
-
audioNodes = new
|
|
25
|
+
audioNodes = new Map();
|
|
24
26
|
#audioAbort = null;
|
|
25
27
|
constructor(driver, timeline, resolveMedia) {
|
|
26
28
|
this.driver = driver;
|
|
@@ -28,6 +30,7 @@ export class Playback {
|
|
|
28
30
|
this.resolveMedia = resolveMedia;
|
|
29
31
|
this.audioGain.connect(this.audioContext.destination);
|
|
30
32
|
this.audioGain.gain.value = 0.7 ** 2;
|
|
33
|
+
this.audioLevels = new AudioLevels(this.audioContext, () => this.currentTime, () => this.#controller.isPlaying());
|
|
31
34
|
this.seekVisualSampler = createVisualSampler(this.resolveMedia);
|
|
32
35
|
this.audioSampler = createAudioSampler(this.resolveMedia);
|
|
33
36
|
this.#samples();
|
|
@@ -68,11 +71,13 @@ export class Playback {
|
|
|
68
71
|
this.playVisualSampler = new CursorVisualSampler(this.driver, this.resolveMedia, this.timeline);
|
|
69
72
|
this.reversePlayVisualSampler = new ReverseCursorVisualSampler(this.driver, this.resolveMedia, this.timeline);
|
|
70
73
|
this.#controller.play();
|
|
74
|
+
this.audioLevels.start();
|
|
71
75
|
this.#startAudio();
|
|
72
76
|
}
|
|
73
77
|
pause() {
|
|
74
78
|
this.#playbackStart = this.currentTime;
|
|
75
79
|
this.#controller.pause();
|
|
80
|
+
this.audioLevels.stop();
|
|
76
81
|
this.#stopAudio();
|
|
77
82
|
if (this.playVisualSampler) {
|
|
78
83
|
this.playVisualSampler.cancel();
|
|
@@ -127,8 +132,10 @@ export class Playback {
|
|
|
127
132
|
#stopAudio() {
|
|
128
133
|
this.#audioAbort?.abort();
|
|
129
134
|
this.#audioAbort = null;
|
|
130
|
-
for (const node of this.audioNodes)
|
|
135
|
+
for (const [node, gain] of this.audioNodes) {
|
|
131
136
|
node.stop();
|
|
137
|
+
this.audioLevels.detach(gain);
|
|
138
|
+
}
|
|
132
139
|
this.audioNodes.clear();
|
|
133
140
|
}
|
|
134
141
|
async #startAudio() {
|
|
@@ -140,7 +147,7 @@ export class Playback {
|
|
|
140
147
|
const ctx = this.audioContext;
|
|
141
148
|
if (this.#audioStartSec === null)
|
|
142
149
|
return;
|
|
143
|
-
for await (const { sample, timestamp, gain } of this.audioSampler.sampleAudio(this.timeline, ms(from * 1000))) {
|
|
150
|
+
for await (const { itemId, sample, timestamp, gain } of this.audioSampler.sampleAudio(this.timeline, ms(from * 1000))) {
|
|
144
151
|
if (signal.aborted || !this.#controller.isPlaying())
|
|
145
152
|
return;
|
|
146
153
|
while (timestamp - (ctx.currentTime - this.#audioStartSec + from) > 0.75)
|
|
@@ -151,8 +158,12 @@ export class Playback {
|
|
|
151
158
|
itemGain.gain.value = gain;
|
|
152
159
|
node.connect(itemGain);
|
|
153
160
|
itemGain.connect(this.audioGain);
|
|
154
|
-
node.onended = () =>
|
|
155
|
-
|
|
161
|
+
node.onended = () => {
|
|
162
|
+
this.audioNodes.delete(node);
|
|
163
|
+
this.audioLevels.detach(itemGain);
|
|
164
|
+
};
|
|
165
|
+
this.audioNodes.set(node, itemGain);
|
|
166
|
+
this.audioLevels.attach(itemId, itemGain);
|
|
156
167
|
const startAt = this.#audioStartSec + timestamp - from;
|
|
157
168
|
startAt >= ctx.currentTime
|
|
158
169
|
? node.start(startAt)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playback.js","sourceRoot":"","sources":["../../../../../s/timeline/renderers/player/parts/playback.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"playback.js","sourceRoot":"","sources":["../../../../../s/timeline/renderers/player/parts/playback.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAA;AAE7C,OAAO,EAAC,EAAE,EAAK,MAAM,yBAAyB,CAAA;AAE9C,OAAO,EAAC,QAAQ,EAAC,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAC,OAAO,EAAC,MAAM,8BAA8B,CAAA;AAEpD,OAAO,EAAC,mBAAmB,EAAC,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAC,mBAAmB,EAAE,0BAA0B,EAAC,MAAM,8BAA8B,CAAA;AAE5F,OAAO,EAAC,kBAAkB,EAAC,MAAM,uCAAuC,CAAA;AACxE,OAAO,EAAC,mBAAmB,EAAC,MAAM,wCAAwC,CAAA;AAE1E,MAAM,OAAO,QAAQ;IAoBX;IACA;IACA;IArBT,WAAW,CAAA;IACX,YAAY,CAAA;IACZ,iBAAiB,CAAA;IACjB,iBAAiB,GAA+B,IAAI,CAAA;IACpD,wBAAwB,GAAsC,IAAI,CAAA;IAElE,cAAc,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;IACtB,cAAc,GAAkB,IAAI,CAAA;IACpC,aAAa,GAAG,CAAC,CAAA;IAEjB,WAAW,GAAG,QAAQ,EAAE,CAAA;IACxB,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAA;IAEhC,YAAY,GAAG,IAAI,YAAY,CAAC,EAAC,UAAU,EAAE,KAAK,EAAC,CAAC,CAAA;IACpD,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAA;IAC1C,UAAU,GAAG,IAAI,GAAG,EAAmC,CAAA;IACvD,WAAW,GAA2B,IAAI,CAAA;IAE1C,YACS,MAAc,EACd,QAAsB,EACtB,YAA6C;QAF7C,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAc;QACtB,iBAAY,GAAZ,YAAY,CAAiC;QAErD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAA;QACrD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,CAAA;QACpC,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CACjC,IAAI,CAAC,YAAY,EACjB,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EACtB,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAClC,CAAA;QACD,IAAI,CAAC,iBAAiB,GAAG,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC/D,IAAI,CAAC,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACzD,IAAI,CAAC,QAAQ,EAAE,CAAA;IAChB,CAAC;IAED,MAAM,CAAC,QAAsB;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IACzB,CAAC;IAED,IAAI,SAAS;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,QAAQ;QACb,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAA;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC;gBACrC,CAAC,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAChD,CAAC,CAAC,MAAM,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;YAExD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;YACjD,KAAK,CAAC,KAAK,EAAE,CAAA;YAEb,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC;gBACvC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ;gBACvB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAA;YAEZ,IAAI,QAAQ;gBACX,IAAI,CAAC,KAAK,EAAE,CAAA;QACd,CAAC;IACF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAQ;QAClB,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAChE,CAAC;IAED,KAAK,CAAC,KAAK;QACV,IAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;YAC9B,OAAM;QAEP,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAA;QAEhC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAA;QACtC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAA;QAEnD,IAAI,CAAC,UAAU,EAAE,CAAA;QACjB,IAAI,CAAC,iBAAiB,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC/F,IAAI,CAAC,wBAAwB,GAAG,IAAI,0BAA0B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAE7G,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAA;QACvB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA;QACxB,IAAI,CAAC,WAAW,EAAE,CAAA;IACnB,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAA;QACtC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA;QACxB,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAA;QACvB,IAAI,CAAC,UAAU,EAAE,CAAA;QAEjB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAA;YAC/B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAA;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACnC,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAA;YACtC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAA;QACrC,CAAC;IAEF,CAAC;IAED,IAAI,QAAQ;QACX,OAAO,mBAAmB,CACzB,IAAI,CAAC,QAAQ,CAAC,MAAM,EACpB,IAAI,CAAC,QAAQ,CACb,CAAA;IACF,CAAC;IAED,IAAI,WAAW;QACd,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI;YAChE,OAAO,IAAI,CAAC,cAAc,CAAA;QAE3B,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAA;QAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,GAAG,SAAS,GAAG,IAAI,CAAC,aAAa,CAAA;QACpE,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IACzD,CAAC;IAED,IAAI,YAAY;QACf,OAAO,IAAI,CAAC,aAAa,CAAA;IAC1B,CAAC;IAED,IAAI,YAAY,CAAC,IAAY;QAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,IAAI,CAAC,CAAA;QAEpD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAA;QACtC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;YACjD,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW;YAC/B,CAAC,CAAC,IAAI,CAAA;QACP,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,CAAA;QAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QAEzB,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC;YAClC,IAAI,WAAW,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;gBAChC,IAAI,CAAC,iBAAiB,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAChG,CAAC;iBACI,IAAI,CAAC,WAAW,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,wBAAwB,EAAE,MAAM,EAAE,CAAA;gBACvC,IAAI,CAAC,wBAAwB,GAAG,IAAI,0BAA0B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC9G,CAAC;YAED,IAAI,CAAC,UAAU,EAAE,CAAA;QAClB,CAAC;IACF,CAAC;IAED,MAAM,CAAC,GAAQ;QACd,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,UAAU;QACT,IAAI,CAAC,UAAU,EAAE,CAAA;QACjB,IAAI,CAAC,WAAW,EAAE,CAAA;IACnB,CAAC;IAED,UAAU;QACT,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAA;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QAEvB,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5C,IAAI,CAAC,IAAI,EAAE,CAAA;YACX,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC9B,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,WAAW;QAChB,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC;YAC3B,OAAM;QAEP,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;QAChD,IAAI,CAAC,WAAW,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAA;QAEtC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAA;QAE7B,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI;YAC/B,OAAM;QAEP,IAAI,KAAK,EAAE,MAAM,EAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAC,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAClF,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,CAC9B,EAAE,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;gBAClD,OAAM;YAEP,OAAO,SAAS,GAAG,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,IAAI;gBACvE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;YAE1C,MAAM,IAAI,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAA;YACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,EAAE,CAAA;YACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,CAAA;YACpC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;YAC1B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;YACtB,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAEhC,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE;gBACnB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBAC5B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;YAClC,CAAC,CAAA;YAED,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YACnC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YAEzC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,GAAG,SAAS,GAAG,IAAI,CAAA;YAEtD,OAAO,IAAI,GAAG,CAAC,WAAW;gBACzB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;gBACrB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC,CAAA;QAE1D,CAAC;IACF,CAAC;CACD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Ms } from "../../../../units/ms.js";
|
|
2
|
+
import { Id } from "../../../parts/basics.js";
|
|
3
|
+
export type AudioLevel = {
|
|
4
|
+
time: Ms;
|
|
5
|
+
peak: number;
|
|
6
|
+
rms: number;
|
|
7
|
+
};
|
|
8
|
+
export type AudioItemSelector = () => Iterable<Id>;
|
|
9
|
+
export type AudioLevelListener = (level: AudioLevel) => void;
|
|
10
|
+
export type AudioLevelObserver = {
|
|
11
|
+
on(items: AudioItemSelector, listener: AudioLevelListener): () => void;
|
|
12
|
+
};
|
|
13
|
+
export type Meter = {
|
|
14
|
+
items: AudioItemSelector;
|
|
15
|
+
listener: AudioLevelListener;
|
|
16
|
+
analyser: AnalyserNode;
|
|
17
|
+
silent: GainNode;
|
|
18
|
+
samples: Float32Array<ArrayBuffer>;
|
|
19
|
+
nodes: Set<GainNode>;
|
|
20
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../s/timeline/renderers/player/parts/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Playback } from "./parts/playback.js";
|
|
2
2
|
import { Driver } from "../../../driver/driver.js";
|
|
3
3
|
import { TimelineFile } from "../../parts/basics.js";
|
|
4
|
+
import { AudioLevelObserver } from "./parts/types.js";
|
|
4
5
|
import { DecoderSource } from "../../../driver/fns/schematic.js";
|
|
5
6
|
type ResolveMedia = (hash: string) => DecoderSource;
|
|
6
7
|
export declare class VideoPlayer {
|
|
@@ -8,6 +9,9 @@ export declare class VideoPlayer {
|
|
|
8
9
|
private driver;
|
|
9
10
|
canvas: HTMLCanvasElement;
|
|
10
11
|
playback: Playback;
|
|
12
|
+
readonly audio: {
|
|
13
|
+
levels: AudioLevelObserver;
|
|
14
|
+
};
|
|
11
15
|
constructor(driver: Driver, resolveMedia: ResolveMedia, timeline: TimelineFile);
|
|
12
16
|
play(): Promise<void>;
|
|
13
17
|
pause(): void;
|
|
@@ -5,11 +5,13 @@ export class VideoPlayer {
|
|
|
5
5
|
driver;
|
|
6
6
|
canvas;
|
|
7
7
|
playback;
|
|
8
|
+
audio;
|
|
8
9
|
#pendingSeek = null;
|
|
9
10
|
#flushTask = null;
|
|
10
11
|
constructor(driver, resolveMedia, timeline) {
|
|
11
12
|
this.driver = driver;
|
|
12
13
|
this.playback = new Playback(driver, timeline, resolveMedia);
|
|
14
|
+
this.audio = { levels: this.playback.audioLevels };
|
|
13
15
|
this.canvas = driver.compositor.pixi.renderer.canvas;
|
|
14
16
|
}
|
|
15
17
|
async play() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player.js","sourceRoot":"","sources":["../../../../s/timeline/renderers/player/player.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,EAAE,EAAC,MAAM,sBAAsB,CAAA;AACvC,OAAO,EAAC,GAAG,EAAC,MAAM,uBAAuB,CAAA;AACzC,OAAO,EAAC,QAAQ,EAAC,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"player.js","sourceRoot":"","sources":["../../../../s/timeline/renderers/player/player.ts"],"names":[],"mappings":"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"}
|