meeting-record 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,108 +0,0 @@
1
- /**
2
- * Converts interleaved float32 at any rate and channel count into mono at
3
- * `outputRate`, carrying fractional position across chunks.
4
- * Downsampling averages each output's input span.
5
- */
6
- export class MonoResampler {
7
- #outputRate;
8
- #sampleRate = 0;
9
- #step = 1;
10
- // Upsampling: the last input frame and the next output's input position,
11
- // relative to the current chunk (-1 is `#previous`).
12
- #previous = 0;
13
- #position = 0;
14
- // Downsampling: the weighted sum and input span gathered for the next output.
15
- #sum = 0;
16
- #covered = 0;
17
- constructor(outputRate) {
18
- this.#outputRate = outputRate;
19
- }
20
- resample(chunk) {
21
- if (chunk.sampleRate !== this.#sampleRate) {
22
- this.#sampleRate = chunk.sampleRate;
23
- this.#step = chunk.sampleRate / this.#outputRate;
24
- this.#previous = 0;
25
- this.#position = 0;
26
- this.#sum = 0;
27
- this.#covered = 0;
28
- }
29
- const input = downmix(chunk);
30
- if (this.#step === 1)
31
- return input;
32
- return this.#step > 1 ? this.#average(input) : this.#interpolate(input);
33
- }
34
- flush() {
35
- if (this.#step > 1) {
36
- const output = this.#covered > 0 ? Float32Array.of(this.#sum / this.#covered) : new Float32Array(0);
37
- this.#sum = 0;
38
- this.#covered = 0;
39
- return output;
40
- }
41
- const output = new Float32Array(Math.max(0, Math.ceil(-this.#position / this.#step - 1e-9)));
42
- output.fill(this.#previous);
43
- this.#position = 0;
44
- return output;
45
- }
46
- reset() {
47
- this.#sampleRate = 0;
48
- this.#sum = 0;
49
- this.#covered = 0;
50
- this.#position = 0;
51
- this.#previous = 0;
52
- }
53
- #average(input) {
54
- const step = this.#step;
55
- const output = new Float32Array(Math.floor((this.#covered + input.length) / step) + 1);
56
- let written = 0;
57
- for (const sample of input) {
58
- let remaining = 1;
59
- while (remaining > 0) {
60
- const taken = Math.min(step - this.#covered, remaining);
61
- this.#sum += sample * taken;
62
- this.#covered += taken;
63
- remaining -= taken;
64
- if (this.#covered >= step - 1e-9) {
65
- output[written++] = this.#sum / step;
66
- this.#sum = 0;
67
- this.#covered = 0;
68
- }
69
- }
70
- }
71
- return output.subarray(0, written);
72
- }
73
- #interpolate(input) {
74
- const last = input.length - 1;
75
- const output = new Float32Array(Math.max(0, Math.ceil((last - this.#position) / this.#step)));
76
- let written = 0;
77
- // Stops short of the final frame, which still needs its successor.
78
- while (this.#position < last && written < output.length) {
79
- const index = Math.floor(this.#position);
80
- const from = index < 0 ? this.#previous : input[index];
81
- const to = input[index + 1];
82
- output[written++] = from + (to - from) * (this.#position - index);
83
- this.#position += this.#step;
84
- }
85
- if (input.length > 0) {
86
- this.#position -= input.length;
87
- this.#previous = input[last];
88
- }
89
- return output.subarray(0, written);
90
- }
91
- }
92
- function downmix(chunk) {
93
- const samples = new Float32Array(chunk.pcm.buffer, chunk.pcm.byteOffset, chunk.pcm.byteLength / Float32Array.BYTES_PER_ELEMENT);
94
- const { channels } = chunk;
95
- if (channels === 1) {
96
- return samples;
97
- }
98
- const mono = new Float32Array(Math.floor(samples.length / channels));
99
- for (let frame = 0; frame < mono.length; frame++) {
100
- let sum = 0;
101
- for (let channel = 0; channel < channels; channel++) {
102
- sum += samples[frame * channels + channel];
103
- }
104
- mono[frame] = sum / channels;
105
- }
106
- return mono;
107
- }
108
- //# sourceMappingURL=mono-resampler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mono-resampler.js","sourceRoot":"","sources":["../src/mono-resampler.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACxB,WAAW,CAAS;IACpB,WAAW,GAAG,CAAC,CAAC;IAChB,KAAK,GAAG,CAAC,CAAC;IACV,yEAAyE;IACzE,qDAAqD;IACrD,SAAS,GAAG,CAAC,CAAC;IACd,SAAS,GAAG,CAAC,CAAC;IACd,8EAA8E;IAC9E,IAAI,GAAG,CAAC,CAAC;IACT,QAAQ,GAAG,CAAC,CAAC;IAEb,YAAY,UAAkB;QAC5B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,QAAQ,CAAC,KAAiB;QACxB,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC;YACpC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;YACjD,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YACd,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACnC,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,MAAM,GACV,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;YACvF,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YACd,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YAClB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7F,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,QAAQ,CAAC,KAAmB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACvF,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YAC3B,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,OAAO,SAAS,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACxD,IAAI,CAAC,IAAI,IAAI,MAAM,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;gBACvB,SAAS,IAAI,KAAK,CAAC;gBACnB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;oBACjC,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;oBACrC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;oBACd,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,YAAY,CAAC,KAAmB;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9F,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,mEAAmE;QACnE,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC;YACxD,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC;YAC7B,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC;YAClE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC;QAC/B,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;YAC/B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAE,CAAC;QAChC,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;CACF;AAED,SAAS,OAAO,CAAC,KAAiB;IAChC,MAAM,OAAO,GAAG,IAAI,YAAY,CAC9B,KAAK,CAAC,GAAG,CAAC,MAAM,EAChB,KAAK,CAAC,GAAG,CAAC,UAAU,EACpB,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,YAAY,CAAC,iBAAiB,CACtD,CAAC;IACF,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC3B,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC;IACrE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;YACpD,GAAG,IAAI,OAAO,CAAC,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAE,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAC;IAC/B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,15 +0,0 @@
1
- import type { AudioChunk } from "./index.js";
2
- /** Timestamp-aligned mono s16le, with sparse silence between capture packets. */
3
- export declare class PcmMixer {
4
- #private;
5
- constructor(sampleRate: number, sources: readonly object[]);
6
- write(source: object, chunk: AudioChunk): void;
7
- setMuted(source: object, muted: boolean): void;
8
- /** Makes the remaining captured tail readable before pause or stop. */
9
- finishSegment(): void;
10
- /** Keeps unread audio, while removing paused time from the next segment. */
11
- restart(): void;
12
- read(): Buffer | null;
13
- }
14
- export declare function getLevel(pcm: Buffer): number;
15
- //# sourceMappingURL=pcm-mixer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pcm-mixer.d.ts","sourceRoot":"","sources":["../src/pcm-mixer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAS7C,iFAAiF;AACjF,qBAAa,QAAQ;;gBAYP,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE;IAgB1D,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAwC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAI9C,uEAAuE;IACvE,aAAa,IAAI,IAAI;IAOrB,4EAA4E;IAC5E,OAAO,IAAI,IAAI;IASf,IAAI,IAAI,MAAM,GAAG,IAAI;CAoCtB;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO5C"}
package/dist/pcm-mixer.js DELETED
@@ -1,126 +0,0 @@
1
- import { MonoResampler } from "./mono-resampler.js";
2
- /** Timestamp-aligned mono s16le, with sparse silence between capture packets. */
3
- export class PcmMixer {
4
- #sampleRate;
5
- #blockFrames;
6
- #inputs;
7
- #gain;
8
- #blocks = new Map();
9
- #origin = null;
10
- #originFrame = 0;
11
- #emitted = 0;
12
- #end = 0;
13
- #committed = 0;
14
- constructor(sampleRate, sources) {
15
- this.#sampleRate = sampleRate;
16
- this.#blockFrames = Math.max(1, Math.round(sampleRate / 10));
17
- this.#inputs = new Map(sources.map((source) => [
18
- source,
19
- {
20
- resampler: new MonoResampler(sampleRate),
21
- cursor: null,
22
- muted: false,
23
- },
24
- ]));
25
- this.#gain = 1 / Math.sqrt(sources.length);
26
- }
27
- write(source, chunk) {
28
- const input = this.#input(source);
29
- this.#origin ??= chunk.hostTimeNs;
30
- let position = this.#originFrame +
31
- Math.round((Number(chunk.hostTimeNs - this.#origin) * this.#sampleRate) / 1e9);
32
- // Skip gaps over a second when every source was absent.
33
- if (position > this.#end + this.#sampleRate) {
34
- this.finishSegment();
35
- this.restart();
36
- this.#origin = chunk.hostTimeNs;
37
- position = this.#originFrame;
38
- }
39
- const samples = input.resampler.resample(chunk);
40
- // Absorb up to 20 ms of callback-clock jitter at packet joins.
41
- if (input.cursor === null || Math.abs(position - input.cursor) > this.#sampleRate / 50) {
42
- input.cursor = position;
43
- }
44
- this.#append(input, samples);
45
- }
46
- #append(input, samples) {
47
- if (input.cursor === null)
48
- return;
49
- const start = input.cursor;
50
- input.cursor += samples.length;
51
- this.#end = Math.max(this.#end, input.cursor);
52
- if (input.muted)
53
- return;
54
- for (let index = Math.max(0, this.#emitted - start); index < samples.length; index++) {
55
- const frame = start + index;
56
- const blockIndex = Math.floor(frame / this.#blockFrames);
57
- let block = this.#blocks.get(blockIndex);
58
- if (!block) {
59
- block = new Float32Array(this.#blockFrames);
60
- this.#blocks.set(blockIndex, block);
61
- }
62
- const offset = frame % this.#blockFrames;
63
- block[offset] = block[offset] + samples[index] * this.#gain;
64
- }
65
- }
66
- setMuted(source, muted) {
67
- this.#input(source).muted = muted;
68
- }
69
- /** Makes the remaining captured tail readable before pause or stop. */
70
- finishSegment() {
71
- for (const input of this.#inputs.values()) {
72
- this.#append(input, input.resampler.flush());
73
- }
74
- this.#committed = this.#end;
75
- }
76
- /** Keeps unread audio, while removing paused time from the next segment. */
77
- restart() {
78
- this.#origin = null;
79
- this.#originFrame = this.#end;
80
- for (const input of this.#inputs.values()) {
81
- input.cursor = null;
82
- input.resampler.reset();
83
- }
84
- }
85
- read() {
86
- const cursors = [...this.#inputs.values()]
87
- .map((input) => input.cursor)
88
- .filter((cursor) => cursor !== null);
89
- let ready = this.#committed;
90
- if (cursors.length > 0) {
91
- const lead = Math.max(...cursors);
92
- // A track more than half a second behind contributes silence.
93
- ready = Math.max(ready, Math.min(...cursors.filter((cursor) => lead - cursor <= this.#sampleRate / 2)));
94
- }
95
- const end = Math.min(ready, this.#emitted + this.#blockFrames);
96
- if (end <= this.#emitted)
97
- return null;
98
- const output = Buffer.allocUnsafe((end - this.#emitted) * 2);
99
- for (let frame = this.#emitted; frame < end; frame++) {
100
- const block = this.#blocks.get(Math.floor(frame / this.#blockFrames));
101
- const sample = Math.max(-1, Math.min(1, block?.[frame % this.#blockFrames] ?? 0));
102
- output.writeInt16LE(Math.round(sample < 0 ? sample * 0x8000 : sample * 0x7fff), (frame - this.#emitted) * 2);
103
- }
104
- for (const blockIndex of this.#blocks.keys()) {
105
- if ((blockIndex + 1) * this.#blockFrames <= end)
106
- this.#blocks.delete(blockIndex);
107
- }
108
- this.#emitted = end;
109
- return output;
110
- }
111
- #input(source) {
112
- const input = this.#inputs.get(source);
113
- if (!input)
114
- throw new Error("Not a source of this mixer");
115
- return input;
116
- }
117
- }
118
- export function getLevel(pcm) {
119
- let sum = 0;
120
- for (let offset = 0; offset < pcm.length; offset += 2) {
121
- const sample = pcm.readInt16LE(offset) / 0x8000;
122
- sum += sample * sample;
123
- }
124
- return Math.sqrt(sum / (pcm.length / 2));
125
- }
126
- //# sourceMappingURL=pcm-mixer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pcm-mixer.js","sourceRoot":"","sources":["../src/pcm-mixer.ts"],"names":[],"mappings":"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"}