speechrecorderng 2.25.2 → 3.0.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.
- package/esm2020/lib/audio/array_audio_buffer.mjs +101 -0
- package/esm2020/lib/audio/array_audio_buffer_input_stream.mjs +86 -0
- package/esm2020/lib/audio/audio_data_holder.mjs +109 -0
- package/esm2020/lib/audio/audio_display.mjs +5 -5
- package/esm2020/lib/audio/audio_player.mjs +9 -7
- package/esm2020/lib/audio/capture/capture.mjs +6 -1
- package/esm2020/lib/audio/dsp/level_measure.mjs +97 -55
- package/esm2020/lib/audio/io/stream.mjs +3 -3
- package/esm2020/lib/audio/persistor.mjs +12 -6
- package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +265 -0
- package/esm2020/lib/audio/playback/player.mjs +184 -50
- package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +25 -13
- package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +2 -2
- package/esm2020/lib/audio/ui/audiosignal.mjs +206 -77
- package/esm2020/lib/audio/ui/container.mjs +14 -14
- package/esm2020/lib/audio/ui/livelevel.mjs +17 -3
- package/esm2020/lib/audio/ui/sonagram.mjs +343 -160
- package/esm2020/lib/io/stream.mjs +77 -1
- package/esm2020/lib/net/uploader.mjs +15 -3
- package/esm2020/lib/speechrecorder/recording.mjs +63 -7
- package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +96 -7
- package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +119 -106
- package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +34 -7
- package/esm2020/lib/speechrecorder/session/progress.mjs +2 -2
- package/esm2020/lib/speechrecorder/session/prompting.mjs +2 -2
- package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +6 -3
- package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +195 -0
- package/esm2020/lib/speechrecorder/session/recording_list.mjs +23 -10
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +12 -6
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +5 -5
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +13 -9
- package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +8 -5
- package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +123 -101
- package/esm2020/lib/speechrecorderng.component.mjs +2 -2
- package/esm2020/lib/speechrecorderng.module.mjs +5 -4
- package/esm2020/lib/spr.module.version.mjs +2 -2
- package/esm2020/lib/ui/recordingitem_display.mjs +2 -2
- package/fesm2015/speechrecorderng.mjs +2355 -753
- package/fesm2015/speechrecorderng.mjs.map +1 -1
- package/fesm2020/speechrecorderng.mjs +2338 -746
- package/fesm2020/speechrecorderng.mjs.map +1 -1
- package/lib/audio/array_audio_buffer.d.ts +15 -0
- package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -0
- package/lib/audio/audio_data_holder.d.ts +29 -0
- package/lib/audio/audio_display.d.ts +2 -1
- package/lib/audio/audio_player.d.ts +2 -1
- package/lib/audio/capture/capture.d.ts +2 -0
- package/lib/audio/dsp/level_measure.d.ts +2 -1
- package/lib/audio/persistor.d.ts +8 -3
- package/lib/audio/playback/array_audio_buffer_source_node.d.ts +24 -0
- package/lib/audio/playback/player.d.ts +6 -0
- package/lib/audio/ui/audio_canvas_layer_comp.d.ts +4 -1
- package/lib/audio/ui/audio_display_scroll_pane.d.ts +2 -1
- package/lib/audio/ui/audiosignal.d.ts +3 -2
- package/lib/audio/ui/container.d.ts +3 -2
- package/lib/audio/ui/livelevel.d.ts +4 -2
- package/lib/audio/ui/sonagram.d.ts +3 -2
- package/lib/io/stream.d.ts +17 -0
- package/lib/net/uploader.d.ts +6 -1
- package/lib/speechrecorder/recording.d.ts +16 -3
- package/lib/speechrecorder/recordings/recordings.service.d.ts +2 -0
- package/lib/speechrecorder/session/audiorecorder.d.ts +2 -7
- package/lib/speechrecorder/session/basicrecorder.d.ts +10 -5
- package/lib/speechrecorder/session/progress.d.ts +1 -1
- package/lib/speechrecorder/session/prompting.d.ts +1 -1
- package/lib/speechrecorder/session/recorder_combi_pane.d.ts +3 -1
- package/lib/speechrecorder/session/recording_file_cache.d.ts +33 -0
- package/lib/speechrecorder/session/recording_list.d.ts +3 -1
- package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +2 -1
- package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +1 -0
- package/lib/speechrecorder/session/sessionmanager.d.ts +5 -11
- package/lib/speechrecorderng.module.d.ts +2 -1
- package/lib/spr.module.version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class ArrayAudioBuffer {
|
|
2
|
+
private _channelCount;
|
|
3
|
+
private _sampleRate;
|
|
4
|
+
private _data;
|
|
5
|
+
private _chunkCount;
|
|
6
|
+
private _frameLen;
|
|
7
|
+
constructor(_channelCount: number, _sampleRate: number, _data: Array<Array<Float32Array>>);
|
|
8
|
+
static fromAudioBuffer(audioBuffer: AudioBuffer, chunkFrameSize?: number): ArrayAudioBuffer;
|
|
9
|
+
get channelCount(): number;
|
|
10
|
+
frames(framePos: number, frameLen: number, bufs: Float32Array[]): number;
|
|
11
|
+
get sampleRate(): number;
|
|
12
|
+
get frameLen(): number;
|
|
13
|
+
get chunkCount(): number;
|
|
14
|
+
get data(): Array<Array<Float32Array>>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Float32ArrayInputStream } from "../io/stream";
|
|
2
|
+
import { ArrayAudioBuffer } from "./array_audio_buffer";
|
|
3
|
+
export declare class ArrayAudioBufferInputStream implements Float32ArrayInputStream {
|
|
4
|
+
private arrayAudioBuffer;
|
|
5
|
+
private _framePos;
|
|
6
|
+
private chunkFramePos;
|
|
7
|
+
private chunkIdx;
|
|
8
|
+
private eod;
|
|
9
|
+
constructor(arrayAudioBuffer: ArrayAudioBuffer);
|
|
10
|
+
close(): void;
|
|
11
|
+
skipFrames(n: number): void;
|
|
12
|
+
read(buffers: Array<Float32Array>): number;
|
|
13
|
+
get framePos(): number;
|
|
14
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ArrayAudioBuffer } from "./array_audio_buffer";
|
|
2
|
+
import { Float32ArrayInputStream } from "../io/stream";
|
|
3
|
+
export declare class AudioDataHolder {
|
|
4
|
+
private _buffer;
|
|
5
|
+
private _arrayBuffer;
|
|
6
|
+
get duration(): number;
|
|
7
|
+
private _numberOfChannels;
|
|
8
|
+
private _sampleRate;
|
|
9
|
+
private _frameLen;
|
|
10
|
+
private _duration;
|
|
11
|
+
private static readonly ONE_OF_MUST_BE_SET_ERR_MSG;
|
|
12
|
+
constructor(_buffer: AudioBuffer | null, _arrayBuffer?: ArrayAudioBuffer | null);
|
|
13
|
+
get sampleRate(): number;
|
|
14
|
+
get numberOfChannels(): number;
|
|
15
|
+
get frameLen(): number;
|
|
16
|
+
sampleCounts(): number;
|
|
17
|
+
frames(framePos: number, frameLen: number, bufs: Float32Array[]): number;
|
|
18
|
+
audioInputStream(): Float32ArrayInputStream;
|
|
19
|
+
get buffer(): AudioBuffer | null;
|
|
20
|
+
get arrayBuffer(): ArrayAudioBuffer | null;
|
|
21
|
+
}
|
|
22
|
+
export declare class AudioBufferInputStream implements Float32ArrayInputStream {
|
|
23
|
+
private audioBuffer;
|
|
24
|
+
private framePos;
|
|
25
|
+
constructor(audioBuffer: AudioBuffer);
|
|
26
|
+
close(): void;
|
|
27
|
+
skipFrames(n: number): void;
|
|
28
|
+
read(buffers: Array<Float32Array>): number;
|
|
29
|
+
}
|
|
@@ -3,6 +3,7 @@ import { AudioClip } from './persistor';
|
|
|
3
3
|
import { ActivatedRoute } from "@angular/router";
|
|
4
4
|
import { Action } from "../action/action";
|
|
5
5
|
import { AudioDisplayScrollPane } from "./ui/audio_display_scroll_pane";
|
|
6
|
+
import { AudioDataHolder } from "./audio_data_holder";
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
export declare class AudioDisplay implements OnInit, AfterViewInit {
|
|
8
9
|
private route;
|
|
@@ -27,7 +28,7 @@ export declare class AudioDisplay implements OnInit, AfterViewInit {
|
|
|
27
28
|
ngAfterViewInit(): void;
|
|
28
29
|
layout(): void;
|
|
29
30
|
started(): void;
|
|
30
|
-
set audioData(
|
|
31
|
+
set audioData(audioData: AudioDataHolder);
|
|
31
32
|
set audioClip(audioClip: AudioClip | null);
|
|
32
33
|
get audioClip(): AudioClip | null;
|
|
33
34
|
set playFramePosition(playFramePosition: number);
|
|
@@ -3,6 +3,7 @@ import { AudioClip } from './persistor';
|
|
|
3
3
|
import { AudioPlayer, AudioPlayerListener, AudioPlayerEvent } from './playback/player';
|
|
4
4
|
import { ActivatedRoute } from "@angular/router";
|
|
5
5
|
import { Action } from "../action/action";
|
|
6
|
+
import { AudioDataHolder } from "./audio_data_holder";
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
export declare class AudioDisplayPlayer implements AudioPlayerListener, OnInit, AfterContentInit, AfterContentChecked, AfterViewInit, AfterViewChecked {
|
|
8
9
|
protected route: ActivatedRoute;
|
|
@@ -39,7 +40,7 @@ export declare class AudioDisplayPlayer implements AudioPlayerListener, OnInit,
|
|
|
39
40
|
started(): void;
|
|
40
41
|
private load;
|
|
41
42
|
private loaded;
|
|
42
|
-
set audioData(
|
|
43
|
+
set audioData(audioData: AudioDataHolder);
|
|
43
44
|
startSelectionDisabled(): boolean;
|
|
44
45
|
set audioClip(audioClip: AudioClip | null);
|
|
45
46
|
get audioClip(): AudioClip | null;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SequenceAudioFloat32OutStream } from "../io/stream";
|
|
2
2
|
import { AutoGainControlConfig } from "../../speechrecorder/project/project";
|
|
3
|
+
import { ArrayAudioBuffer } from "../array_audio_buffer";
|
|
3
4
|
export declare const CHROME_ACTIVATE_ECHO_CANCELLATION_WITH_AGC = false;
|
|
4
5
|
export interface AudioCaptureListener {
|
|
5
6
|
opened(): void;
|
|
@@ -39,4 +40,5 @@ export declare class AudioCapture {
|
|
|
39
40
|
stop(): void;
|
|
40
41
|
close(): void;
|
|
41
42
|
audioBuffer(): AudioBuffer;
|
|
43
|
+
audioBufferArray(): ArrayAudioBuffer;
|
|
42
44
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SequenceAudioFloat32OutStream } from "../io/stream";
|
|
2
|
+
import { AudioDataHolder } from "../audio_data_holder";
|
|
2
3
|
export declare const MIN_DB_LEVEL = -40;
|
|
3
4
|
export declare class LevelInfo {
|
|
4
5
|
readonly channelCount: number;
|
|
@@ -52,7 +53,7 @@ export declare class LevelMeasure {
|
|
|
52
53
|
private readonly workerURL;
|
|
53
54
|
private worker;
|
|
54
55
|
constructor();
|
|
55
|
-
calcBufferLevelInfos(
|
|
56
|
+
calcBufferLevelInfos(audioDataHolder: AudioDataHolder, bufferTimeLength: number): Promise<LevelInfos>;
|
|
56
57
|
private terminateWorker;
|
|
57
58
|
workerFunction(): void;
|
|
58
59
|
}
|
package/lib/audio/persistor.d.ts
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
|
+
import { LevelInfos } from "./dsp/level_measure";
|
|
2
|
+
import { AudioDataHolder } from "./audio_data_holder";
|
|
1
3
|
export declare class AudioClip {
|
|
2
|
-
private
|
|
4
|
+
private _audioDataHolder;
|
|
3
5
|
private _selection;
|
|
6
|
+
private _levelInfos;
|
|
4
7
|
private selectionObservers;
|
|
5
|
-
constructor(
|
|
6
|
-
get
|
|
8
|
+
constructor(_audioDataHolder: AudioDataHolder);
|
|
9
|
+
get audioDataHolder(): AudioDataHolder;
|
|
7
10
|
get selection(): Selection | null;
|
|
8
11
|
set selection(value: Selection | null);
|
|
12
|
+
get levelInfos(): LevelInfos | null;
|
|
13
|
+
set levelInfos(value: LevelInfos | null);
|
|
9
14
|
addSelectionObserver(selectionObserver: (audioClip: AudioClip) => void, init?: boolean): void;
|
|
10
15
|
removeSelectionObserver(selectionObserver: (audioClip: AudioClip) => void): void;
|
|
11
16
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ArrayAudioBuffer } from "../array_audio_buffer";
|
|
2
|
+
export declare class ArrayAudioBufferSourceNode extends AudioWorkletNode {
|
|
3
|
+
static readonly QUANTUM_FRAME_LEN = 128;
|
|
4
|
+
static readonly DEFAULT_BUFFER_FILL_SECONDS = 10;
|
|
5
|
+
private _bufferFillSeconds;
|
|
6
|
+
private bufferFillFrames;
|
|
7
|
+
private _arrayAudioBuffer;
|
|
8
|
+
private _audioInputStream;
|
|
9
|
+
private _aisBufs;
|
|
10
|
+
private filledFrames;
|
|
11
|
+
onended: (() => void) | null;
|
|
12
|
+
constructor(context: AudioContext);
|
|
13
|
+
private fillBuffer;
|
|
14
|
+
get arrayAudioBuffer(): ArrayAudioBuffer | null;
|
|
15
|
+
set arrayAudioBuffer(value: ArrayAudioBuffer | null);
|
|
16
|
+
get bufferFillSeconds(): number;
|
|
17
|
+
set bufferFillSeconds(value: number);
|
|
18
|
+
start(when?: number | undefined, offset?: number | undefined, duration?: number | undefined): void;
|
|
19
|
+
stop(): void;
|
|
20
|
+
}
|
|
21
|
+
export declare class AudioSourceWorkletModuleLoader {
|
|
22
|
+
private static moduleLoaded;
|
|
23
|
+
static loadModule(context: AudioContext): Promise<void>;
|
|
24
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Action } from '../../action/action';
|
|
2
2
|
import { AudioClip } from '../persistor';
|
|
3
|
+
import { ArrayAudioBuffer } from "../array_audio_buffer";
|
|
4
|
+
import { ArrayAudioBufferSourceNode } from "./array_audio_buffer_source_node";
|
|
3
5
|
export declare enum EventType {
|
|
4
6
|
CLOSED = 0,
|
|
5
7
|
READY = 1,
|
|
@@ -31,7 +33,9 @@ export declare class AudioPlayer {
|
|
|
31
33
|
listener: AudioPlayerListener;
|
|
32
34
|
_audioClip: AudioClip | null;
|
|
33
35
|
_audioBuffer: AudioBuffer | null;
|
|
36
|
+
_arrayAudioBuffer: ArrayAudioBuffer | null;
|
|
34
37
|
sourceBufferNode: AudioBufferSourceNode | null;
|
|
38
|
+
sourceAudioWorkletNode: ArrayAudioBufferSourceNode | null;
|
|
35
39
|
buffPos: number;
|
|
36
40
|
private zeroBufCnt;
|
|
37
41
|
n: any;
|
|
@@ -45,6 +49,8 @@ export declare class AudioPlayer {
|
|
|
45
49
|
set audioClip(audioClip: AudioClip | null);
|
|
46
50
|
set audioBuffer(audioBuffer: AudioBuffer | null);
|
|
47
51
|
get audioBuffer(): AudioBuffer | null;
|
|
52
|
+
set arrayAudioBuffer(arrayAudioBuffer: ArrayAudioBuffer | null);
|
|
53
|
+
get arrayAudioBuffer(): ArrayAudioBuffer | null;
|
|
48
54
|
start(): void;
|
|
49
55
|
startSelectionDisabled(): boolean;
|
|
50
56
|
startSelected(): void;
|
|
@@ -3,6 +3,7 @@ import { Selection } from '../persistor';
|
|
|
3
3
|
import { ElementRef, EventEmitter } from "@angular/core";
|
|
4
4
|
import { Marker } from "./common";
|
|
5
5
|
import { Dimension, Rectangle } from "../../math/2d/geometry";
|
|
6
|
+
import { AudioDataHolder } from "../audio_data_holder";
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
export declare class ViewSelection {
|
|
8
9
|
private _startX;
|
|
@@ -13,9 +14,10 @@ export declare class ViewSelection {
|
|
|
13
14
|
constructor(_startX: number, _endX: number);
|
|
14
15
|
}
|
|
15
16
|
export declare abstract class BasicAudioCanvasLayerComponent extends CanvasLayerComponent {
|
|
16
|
-
protected
|
|
17
|
+
protected _audioDataHolder: AudioDataHolder | null;
|
|
17
18
|
protected _bgColor: string | null;
|
|
18
19
|
protected _selectColor: string;
|
|
20
|
+
private frameLength;
|
|
19
21
|
/**
|
|
20
22
|
* Returns pixel position depending on current zoom setting.
|
|
21
23
|
* @param framePos audio frame (sample) position
|
|
@@ -32,6 +34,7 @@ export declare abstract class BasicAudioCanvasLayerComponent extends CanvasLayer
|
|
|
32
34
|
static ɵdir: i0.ɵɵDirectiveDeclaration<BasicAudioCanvasLayerComponent, never, never, {}, {}, never>;
|
|
33
35
|
}
|
|
34
36
|
export declare abstract class AudioCanvasLayerComponent extends BasicAudioCanvasLayerComponent {
|
|
37
|
+
protected static readonly ENABLE_STREAMING_NUMBER_OF_SAMPLES_THRESHOLD: number;
|
|
35
38
|
_pointerPosition: Marker | null;
|
|
36
39
|
protected selectStartX: number | null;
|
|
37
40
|
bgCanvasRef: ElementRef;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ElementRef } from '@angular/core';
|
|
2
2
|
import { Action } from "../../action/action";
|
|
3
3
|
import { AudioClip, Selection } from "../persistor";
|
|
4
|
+
import { AudioDataHolder } from "../audio_data_holder";
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
export declare class AudioDisplayScrollPane {
|
|
6
7
|
private ref;
|
|
@@ -17,7 +18,7 @@ export declare class AudioDisplayScrollPane {
|
|
|
17
18
|
onResize(event: Event): void;
|
|
18
19
|
layout(): void;
|
|
19
20
|
selectionChanged(s: Selection | null): void;
|
|
20
|
-
set audioData(audioData:
|
|
21
|
+
set audioData(audioData: AudioDataHolder | null);
|
|
21
22
|
set audioClip(audioClip: AudioClip | null);
|
|
22
23
|
set playFramePosition(framePos: number);
|
|
23
24
|
static ɵfac: i0.ɵɵFactoryDeclaration<AudioDisplayScrollPane, never>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ElementRef } from '@angular/core';
|
|
2
2
|
import { AudioCanvasLayerComponent } from "./audio_canvas_layer_comp";
|
|
3
|
+
import { AudioDataHolder } from "../audio_data_holder";
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
export declare class AudioSignal extends AudioCanvasLayerComponent {
|
|
5
6
|
private ref;
|
|
@@ -20,9 +21,9 @@ export declare class AudioSignal extends AudioCanvasLayerComponent {
|
|
|
20
21
|
workerFunction(): void;
|
|
21
22
|
startDraw(clear?: boolean): void;
|
|
22
23
|
private startRender;
|
|
23
|
-
drawRendered(
|
|
24
|
+
drawRendered(left: number, w: number, h: number, chs: number, psMinMax: Float32Array): void;
|
|
24
25
|
redraw(): void;
|
|
25
|
-
setData(audioData:
|
|
26
|
+
setData(audioData: AudioDataHolder | null): void;
|
|
26
27
|
static ɵfac: i0.ɵɵFactoryDeclaration<AudioSignal, never>;
|
|
27
28
|
static ɵcmp: i0.ɵɵComponentDeclaration<AudioSignal, "audio-signal", never, {}, {}, never, never>;
|
|
28
29
|
}
|
|
@@ -5,6 +5,7 @@ import { Marker } from './common';
|
|
|
5
5
|
import { Rectangle } from "../../math/2d/geometry";
|
|
6
6
|
import { AudioClip, Selection } from "../persistor";
|
|
7
7
|
import { BasicAudioCanvasLayerComponent } from "./audio_canvas_layer_comp";
|
|
8
|
+
import { AudioDataHolder } from "../audio_data_holder";
|
|
8
9
|
import * as i0 from "@angular/core";
|
|
9
10
|
export declare class AudioClipUIContainer extends BasicAudioCanvasLayerComponent implements OnInit, AfterViewInit {
|
|
10
11
|
private ref;
|
|
@@ -52,8 +53,8 @@ export declare class AudioClipUIContainer extends BasicAudioCanvasLayerComponent
|
|
|
52
53
|
private _layout;
|
|
53
54
|
layoutScaled(): void;
|
|
54
55
|
layout(clear?: boolean): void;
|
|
55
|
-
set audioData(
|
|
56
|
-
get audioData():
|
|
56
|
+
set audioData(audioDataHolder: AudioDataHolder | null);
|
|
57
|
+
get audioData(): AudioDataHolder | null;
|
|
57
58
|
set audioClip(audioClip: AudioClip | null);
|
|
58
59
|
get playFramePosition(): number | null;
|
|
59
60
|
set playFramePosition(playFramePosition: number | null);
|
|
@@ -24,13 +24,15 @@ export declare class LevelBar implements LevelListener, AfterViewInit {
|
|
|
24
24
|
private _streamingMode;
|
|
25
25
|
private _staticLevelInfos;
|
|
26
26
|
private _playFramePosition;
|
|
27
|
+
private _stateLoading;
|
|
27
28
|
warnDBLevel: number;
|
|
28
29
|
constructor(ref: ElementRef, changeDetectorRef: ChangeDetectorRef);
|
|
29
30
|
ngAfterViewInit(): void;
|
|
30
31
|
onScroll(se: Event): void;
|
|
31
32
|
private updateViewportPosition;
|
|
32
33
|
set streamingMode(streamingMode: boolean);
|
|
33
|
-
set displayLevelInfos(levelInfos: LevelInfos | null);
|
|
34
|
+
set displayLevelInfos(levelInfos: LevelInfos | null | undefined);
|
|
35
|
+
set stateLoading(loading: boolean);
|
|
34
36
|
set channelCount(channelCount: number);
|
|
35
37
|
set playFramePosition(playFramePosition: number);
|
|
36
38
|
onResize(event: Event): void;
|
|
@@ -47,5 +49,5 @@ export declare class LevelBar implements LevelListener, AfterViewInit {
|
|
|
47
49
|
private framesPerPixel;
|
|
48
50
|
private drawPlayPosition;
|
|
49
51
|
static ɵfac: i0.ɵɵFactoryDeclaration<LevelBar, never>;
|
|
50
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<LevelBar, "audio-levelbar", never, { "streamingMode": "streamingMode"; "displayLevelInfos": "displayLevelInfos"; }, {}, never, never>;
|
|
52
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LevelBar, "audio-levelbar", never, { "streamingMode": "streamingMode"; "displayLevelInfos": "displayLevelInfos"; "stateLoading": "stateLoading"; }, {}, never, never>;
|
|
51
53
|
}
|
|
@@ -2,6 +2,7 @@ import { DFTFloat32 } from '../../math/dft';
|
|
|
2
2
|
import { Marker } from './common';
|
|
3
3
|
import { ElementRef } from "@angular/core";
|
|
4
4
|
import { AudioCanvasLayerComponent } from "./audio_canvas_layer_comp";
|
|
5
|
+
import { AudioDataHolder } from "../audio_data_holder";
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
export declare class Sonagram extends AudioCanvasLayerComponent {
|
|
7
8
|
private ref;
|
|
@@ -27,9 +28,9 @@ export declare class Sonagram extends AudioCanvasLayerComponent {
|
|
|
27
28
|
workerFunction(): void;
|
|
28
29
|
startDraw(clear?: boolean): void;
|
|
29
30
|
private startRender;
|
|
30
|
-
drawRendered(
|
|
31
|
+
drawRendered(w: number, h: number, imgData: Uint8ClampedArray): void;
|
|
31
32
|
redraw(): void;
|
|
32
|
-
setData(audioData:
|
|
33
|
+
setData(audioData: AudioDataHolder | null): void;
|
|
33
34
|
static ɵfac: i0.ɵɵFactoryDeclaration<Sonagram, never>;
|
|
34
35
|
static ɵcmp: i0.ɵɵComponentDeclaration<Sonagram, "audio-sonagram", never, {}, {}, never, never>;
|
|
35
36
|
}
|
package/lib/io/stream.d.ts
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
export interface Float32ArrayInputStream {
|
|
2
|
+
read(buffers: Array<Float32Array>): number;
|
|
3
|
+
skipFrames(n: number): void;
|
|
4
|
+
close(): void;
|
|
5
|
+
}
|
|
6
|
+
export declare class EditFloat32ArrayInputStream implements Float32ArrayInputStream {
|
|
7
|
+
private _srcInputStream;
|
|
8
|
+
private offset;
|
|
9
|
+
private length?;
|
|
10
|
+
private framePos;
|
|
11
|
+
private readFrames;
|
|
12
|
+
constructor(_srcInputStream: Float32ArrayInputStream, offset?: number, length?: number | undefined);
|
|
13
|
+
private skipToOffset;
|
|
14
|
+
read(buffers: Array<Float32Array>): number;
|
|
15
|
+
skipFrames(n: number): void;
|
|
16
|
+
close(): void;
|
|
17
|
+
}
|
|
1
18
|
export interface Float32ArrayOutStream {
|
|
2
19
|
write(buffers: Array<Float32Array>): number;
|
|
3
20
|
flush(): void;
|
package/lib/net/uploader.d.ts
CHANGED
|
@@ -25,14 +25,19 @@ export declare class UploaderStatusChangeEvent {
|
|
|
25
25
|
percentDone(): number;
|
|
26
26
|
}
|
|
27
27
|
export declare class Upload {
|
|
28
|
+
private serverPersistable;
|
|
28
29
|
private _data;
|
|
29
30
|
private _url;
|
|
30
31
|
status: UploadStatus;
|
|
31
|
-
constructor(blob: Blob | FormData, url: string);
|
|
32
|
+
constructor(blob: Blob | FormData, url: string, serverPersistable?: ServerPersistable | null);
|
|
32
33
|
get url(): string;
|
|
33
34
|
get data(): Blob | FormData;
|
|
35
|
+
done(): void;
|
|
34
36
|
toString: () => string;
|
|
35
37
|
}
|
|
38
|
+
export interface ServerPersistable {
|
|
39
|
+
serverPersisted: boolean;
|
|
40
|
+
}
|
|
36
41
|
export declare class Uploader {
|
|
37
42
|
private http;
|
|
38
43
|
private withCredentials;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { PromptItem } from "./script/script";
|
|
2
|
+
import { AudioDataHolder } from "../audio/audio_data_holder";
|
|
2
3
|
export interface RecordingFileDescriptor {
|
|
3
4
|
recording: PromptItem;
|
|
4
5
|
version: number;
|
|
@@ -11,23 +12,35 @@ export declare class RecordingFileDescriptorImpl {
|
|
|
11
12
|
export declare class RecordingFile {
|
|
12
13
|
recordingFileId: string | number | null;
|
|
13
14
|
uuid: string | null;
|
|
15
|
+
serverPersisted: boolean;
|
|
16
|
+
keepAudioDataCache: boolean;
|
|
14
17
|
date: string | null;
|
|
15
18
|
_dateAsDateObj: Date | null;
|
|
16
19
|
startedDate: string | null;
|
|
17
20
|
_startedAsDateObj?: Date | null;
|
|
18
|
-
|
|
21
|
+
audioDataHolder: AudioDataHolder | null;
|
|
19
22
|
session: string | number | null;
|
|
20
23
|
frames: number | null;
|
|
24
|
+
timeLength: number | null;
|
|
21
25
|
editSampleRate: number | null;
|
|
22
26
|
editStartFrame: number | null;
|
|
23
27
|
editEndFrame: number | null;
|
|
24
|
-
constructor(uuid: string, sessionId: string | number,
|
|
28
|
+
constructor(uuid: string, sessionId: string | number, audioDataHolder: AudioDataHolder | null);
|
|
25
29
|
filenameString(): string;
|
|
30
|
+
equals(otherRecordingFile: RecordingFile | null): boolean;
|
|
31
|
+
toString(): string;
|
|
26
32
|
}
|
|
27
33
|
export declare class SprRecordingFile extends RecordingFile implements RecordingFileDescriptor {
|
|
28
34
|
itemCode: string;
|
|
29
35
|
recording: PromptItem;
|
|
30
36
|
version: number;
|
|
31
|
-
constructor(sessionId: string | number, itemcode: string, version: number,
|
|
37
|
+
constructor(sessionId: string | number, itemcode: string, version: number, audioDataHolder: AudioDataHolder | null);
|
|
32
38
|
filenameString(): string;
|
|
39
|
+
toString(): string;
|
|
40
|
+
}
|
|
41
|
+
export declare class RecordingFileUtils {
|
|
42
|
+
static equals(recordinFile: RecordingFile | null, otherRecordingFile: RecordingFile | null): boolean;
|
|
43
|
+
static setAudioData(rf: RecordingFile, audioDataHolder: AudioDataHolder | null): void;
|
|
44
|
+
static sampleCount(rf: RecordingFile): number;
|
|
45
|
+
static expireAudioData(rf: RecordingFile): AudioDataHolder | null;
|
|
33
46
|
}
|
|
@@ -23,7 +23,9 @@ export declare class RecordingService {
|
|
|
23
23
|
private audioRequest;
|
|
24
24
|
private fetchAudiofile;
|
|
25
25
|
private fetchSprAudiofile;
|
|
26
|
+
fetchRecordingFileAudioBuffer(aCtx: AudioContext, projectName: string, recordingFile: RecordingFile): Observable<AudioBuffer | null>;
|
|
26
27
|
fetchAndApplyRecordingFile(aCtx: AudioContext, projectName: string, recordingFile: RecordingFile): Observable<RecordingFile | null>;
|
|
28
|
+
fetchSprRecordingFileAudioBuffer(aCtx: AudioContext, projectName: string, recordingFile: SprRecordingFile): Observable<AudioBuffer | null>;
|
|
27
29
|
fetchAndApplySprRecordingFile(aCtx: AudioContext, projectName: string, recordingFile: SprRecordingFile): Observable<SprRecordingFile | null>;
|
|
28
30
|
fetchRecordingFile(aCtx: AudioContext, projectName: string, sessId: string | number, itemcode: string, version: number): Observable<SprRecordingFile | null>;
|
|
29
31
|
static ɵfac: i0.ɵɵFactoryDeclaration<RecordingService, never>;
|
|
@@ -33,14 +33,10 @@ export declare class Item {
|
|
|
33
33
|
constructor(promptAsString: string, training: boolean);
|
|
34
34
|
}
|
|
35
35
|
export declare class AudioRecorder extends BasicRecorder implements OnInit, AfterViewInit, OnDestroy, AudioCaptureListener, ReadyStateProvider {
|
|
36
|
-
private changeDetectorRef;
|
|
37
36
|
private renderer;
|
|
38
37
|
private route;
|
|
39
|
-
dialog: MatDialog;
|
|
40
|
-
protected sessionService: SessionService;
|
|
41
38
|
private recFileService;
|
|
42
39
|
protected uploader: SpeechRecorderUploader;
|
|
43
|
-
config?: SpeechRecorderConfig | undefined;
|
|
44
40
|
_project: Project | undefined | null;
|
|
45
41
|
projectName: string | undefined | null;
|
|
46
42
|
enableUploadRecordings: boolean;
|
|
@@ -58,7 +54,7 @@ export declare class AudioRecorder extends BasicRecorder implements OnInit, Afte
|
|
|
58
54
|
private _promptIndex;
|
|
59
55
|
private _displayRecFile;
|
|
60
56
|
private displayRecFileVersion;
|
|
61
|
-
constructor(changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, route: ActivatedRoute, dialog: MatDialog, sessionService: SessionService, recFileService: RecordingService, uploader: SpeechRecorderUploader, config?: SpeechRecorderConfig
|
|
57
|
+
constructor(changeDetectorRef: ChangeDetectorRef, renderer: Renderer2, route: ActivatedRoute, dialog: MatDialog, sessionService: SessionService, recFileService: RecordingService, uploader: SpeechRecorderUploader, config?: SpeechRecorderConfig);
|
|
62
58
|
ngAfterViewInit(): void;
|
|
63
59
|
ready(): boolean;
|
|
64
60
|
ngOnDestroy(): void;
|
|
@@ -86,7 +82,6 @@ export declare class AudioRecorder extends BasicRecorder implements OnInit, Afte
|
|
|
86
82
|
downloadRecording(): void;
|
|
87
83
|
set displayRecFile(displayRecFile: RecordingFile | null);
|
|
88
84
|
get displayRecFile(): RecordingFile | null;
|
|
89
|
-
showRecording(): void;
|
|
90
85
|
updateStartActionDisableState(): void;
|
|
91
86
|
start(): void;
|
|
92
87
|
isRecording(): boolean;
|
|
@@ -101,7 +96,7 @@ export declare class AudioRecorder extends BasicRecorder implements OnInit, Afte
|
|
|
101
96
|
stopRecording(): void;
|
|
102
97
|
stopRecordingMaxRec(): void;
|
|
103
98
|
stopped(): void;
|
|
104
|
-
postRecordingMultipart(wavFile: Uint8Array,
|
|
99
|
+
postRecordingMultipart(wavFile: Uint8Array, recUrl: string, rf: RecordingFile): void;
|
|
105
100
|
postChunkAudioBuffer(audioBuffer: AudioBuffer, chunkIdx: number): void;
|
|
106
101
|
stop(): void;
|
|
107
102
|
private updateControlPlaybackPosition;
|
|
@@ -5,15 +5,16 @@ import { Session } from "./session";
|
|
|
5
5
|
import { SessionService } from "./session.service";
|
|
6
6
|
import { AudioCapture } from "../../audio/capture/capture";
|
|
7
7
|
import { AudioDevice, AutoGainControlConfig } from "../project/project";
|
|
8
|
-
import {
|
|
8
|
+
import { LevelMeasure, StreamLevelMeasure } from "../../audio/dsp/level_measure";
|
|
9
9
|
import { AudioPlayer } from "../../audio/playback/player";
|
|
10
10
|
import { Subscription } from "rxjs";
|
|
11
11
|
import { AudioClip } from "../../audio/persistor";
|
|
12
12
|
import { Action } from "../../action/action";
|
|
13
|
+
import { ChangeDetectorRef } from "@angular/core";
|
|
13
14
|
import { SpeechRecorderConfig } from "../../spr.config";
|
|
14
15
|
import { SpeechRecorderUploader } from "../spruploader";
|
|
15
16
|
import { SequenceAudioFloat32OutStream } from "../../audio/io/stream";
|
|
16
|
-
import { SprRecordingFile } from "../recording";
|
|
17
|
+
import { RecordingFile, SprRecordingFile } from "../recording";
|
|
17
18
|
export declare const FORCE_REQUEST_AUDIO_PERMISSIONS = false;
|
|
18
19
|
export declare const RECFILE_API_CTX = "recfile";
|
|
19
20
|
export declare const MAX_RECORDING_TIME_MS: number;
|
|
@@ -39,10 +40,12 @@ export declare class ChunkManager implements SequenceAudioFloat32OutStream {
|
|
|
39
40
|
write(buffers: Array<Float32Array>): number;
|
|
40
41
|
}
|
|
41
42
|
export declare abstract class BasicRecorder {
|
|
43
|
+
protected changeDetectorRef: ChangeDetectorRef;
|
|
42
44
|
dialog: MatDialog;
|
|
43
45
|
protected sessionService: SessionService;
|
|
44
46
|
protected uploader: SpeechRecorderUploader;
|
|
45
47
|
config?: SpeechRecorderConfig | undefined;
|
|
48
|
+
static readonly FORCE_ARRRAY_AUDIO_BUFFER = false;
|
|
46
49
|
get uploadChunkSizeSeconds(): number | null;
|
|
47
50
|
set uploadChunkSizeSeconds(value: number | null);
|
|
48
51
|
static readonly DEFAULT_CHUNK_SIZE_SECONDS = 30;
|
|
@@ -61,6 +64,7 @@ export declare abstract class BasicRecorder {
|
|
|
61
64
|
protected _channelCount: number;
|
|
62
65
|
protected _autoGainControlConfigs: Array<AutoGainControlConfig> | null | undefined;
|
|
63
66
|
_session: Session | null;
|
|
67
|
+
protected _recordingFile: RecordingFile | null;
|
|
64
68
|
transportActions: TransportActions;
|
|
65
69
|
playStartAction: Action<void>;
|
|
66
70
|
protected startedDate: Date | null;
|
|
@@ -70,16 +74,16 @@ export declare abstract class BasicRecorder {
|
|
|
70
74
|
protected streamLevelMeasure: StreamLevelMeasure;
|
|
71
75
|
protected levelMeasure: LevelMeasure;
|
|
72
76
|
peakLevelInDb: number;
|
|
73
|
-
displayLevelInfos: LevelInfos | null;
|
|
74
77
|
protected _controlAudioPlayer: AudioPlayer;
|
|
75
78
|
displayAudioClip: AudioClip | null;
|
|
76
79
|
protected audioFetchSubscription: Subscription | null;
|
|
80
|
+
audioFetching: boolean;
|
|
77
81
|
protected destroyed: boolean;
|
|
78
82
|
protected navigationDisabled: boolean;
|
|
79
83
|
private _uploadChunkSizeSeconds;
|
|
80
84
|
protected _screenLocked: boolean;
|
|
81
85
|
private wakeLockManager?;
|
|
82
|
-
constructor(dialog: MatDialog, sessionService: SessionService, uploader: SpeechRecorderUploader, config?: SpeechRecorderConfig | undefined);
|
|
86
|
+
constructor(changeDetectorRef: ChangeDetectorRef, dialog: MatDialog, sessionService: SessionService, uploader: SpeechRecorderUploader, config?: SpeechRecorderConfig | undefined);
|
|
83
87
|
get wakeLock(): boolean;
|
|
84
88
|
set wakeLock(value: boolean);
|
|
85
89
|
enableWakeLockCond(): void;
|
|
@@ -92,10 +96,11 @@ export declare abstract class BasicRecorder {
|
|
|
92
96
|
get session(): Session | null;
|
|
93
97
|
enableStartUserGesture(): void;
|
|
94
98
|
configureStreamCaptureStream(): void;
|
|
99
|
+
showRecording(): void;
|
|
95
100
|
start(): void;
|
|
96
101
|
startItem(): void;
|
|
97
102
|
started(): void;
|
|
98
|
-
postRecording(wavFile: Uint8Array, recUrl: string): void;
|
|
103
|
+
postRecording(wavFile: Uint8Array, recUrl: string, rf: RecordingFile | null): void;
|
|
99
104
|
postAudioStreamStart(): void;
|
|
100
105
|
abstract postChunkAudioBuffer(audioBuffer: AudioBuffer, chunkIdx: number): void;
|
|
101
106
|
postAudioStreamEnd(chunkCount: number): void;
|
|
@@ -2,7 +2,7 @@ import { EventEmitter } from '@angular/core';
|
|
|
2
2
|
import { Item } from './item';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class Progress {
|
|
5
|
-
items: Array<Item> |
|
|
5
|
+
items: Array<Item> | undefined;
|
|
6
6
|
selectedItemIdx: number;
|
|
7
7
|
enableDownload: boolean;
|
|
8
8
|
onRowSelect: EventEmitter<number>;
|
|
@@ -96,7 +96,7 @@ export declare class Prompting {
|
|
|
96
96
|
startStopSignalState: StartStopSignalState;
|
|
97
97
|
promptItem: PromptItem | null;
|
|
98
98
|
showPrompt: boolean;
|
|
99
|
-
items: Array<Item> |
|
|
99
|
+
items: Array<Item> | undefined;
|
|
100
100
|
selectedItemIdx: number;
|
|
101
101
|
transportActions: TransportActions;
|
|
102
102
|
enableDownload: boolean;
|
|
@@ -4,6 +4,7 @@ import { RecordingList } from "./recording_list";
|
|
|
4
4
|
import { AudioClip } from "../../audio/persistor";
|
|
5
5
|
import { Action } from "../../action/action";
|
|
6
6
|
import { AudioDisplay } from "../../audio/audio_display";
|
|
7
|
+
import { AudioDataHolder } from "../../audio/audio_data_holder";
|
|
7
8
|
import * as i0 from "@angular/core";
|
|
8
9
|
export declare class RecorderCombiPane implements AfterViewInit {
|
|
9
10
|
recordingListComp: RecordingList;
|
|
@@ -19,7 +20,8 @@ export declare class RecorderCombiPane implements AfterViewInit {
|
|
|
19
20
|
playStopAction: Action<void> | undefined;
|
|
20
21
|
constructor();
|
|
21
22
|
ngAfterViewInit(): void;
|
|
22
|
-
|
|
23
|
+
addRecFile(rf: RecordingFile): void;
|
|
24
|
+
setRecFileAudioData(recFile: RecordingFile, adh: AudioDataHolder | null): void;
|
|
23
25
|
selectRecordingFile(rf: RecordingFile): void;
|
|
24
26
|
selectTop(): void;
|
|
25
27
|
static ɵfac: i0.ɵɵFactoryDeclaration<RecorderCombiPane, never>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { RecordingFile, SprRecordingFile } from "../recording";
|
|
2
|
+
import { Item } from "./item";
|
|
3
|
+
import { AudioDataHolder } from "../../audio/audio_data_holder";
|
|
4
|
+
export declare abstract class BasicRecFilesCache {
|
|
5
|
+
static readonly DEBUG = false;
|
|
6
|
+
static readonly DEFAULT_MAX_SAMPLES: number;
|
|
7
|
+
protected _sampleCount: number;
|
|
8
|
+
maxSampleCount: number;
|
|
9
|
+
private _currentRecordingFile;
|
|
10
|
+
protected abstract expire(): void;
|
|
11
|
+
get currentRecordingFile(): RecordingFile | null;
|
|
12
|
+
set currentRecordingFile(value: RecordingFile | null);
|
|
13
|
+
}
|
|
14
|
+
export declare class SprItemsCache extends BasicRecFilesCache {
|
|
15
|
+
private _items;
|
|
16
|
+
get items(): Array<Item>;
|
|
17
|
+
addItem(item: Item): void;
|
|
18
|
+
getItem(index: number): Item;
|
|
19
|
+
length(): number;
|
|
20
|
+
private tryExpire;
|
|
21
|
+
protected expire(): void;
|
|
22
|
+
addSprRecFile(item: Item, sprRecFile: SprRecordingFile): void;
|
|
23
|
+
setSprRecFileAudioData(sprRecFile: SprRecordingFile, adh: AudioDataHolder | null): void;
|
|
24
|
+
}
|
|
25
|
+
export declare class RecFilesCache extends BasicRecFilesCache {
|
|
26
|
+
private _recFiles;
|
|
27
|
+
get recFiles(): Array<RecordingFile>;
|
|
28
|
+
getRecFile(index: number): RecordingFile;
|
|
29
|
+
length(): number;
|
|
30
|
+
protected expire(): void;
|
|
31
|
+
addRecFile(recFile: RecordingFile): void;
|
|
32
|
+
setRecFileAudioData(recFile: RecordingFile, adh: AudioDataHolder | null): void;
|
|
33
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AfterViewInit, EventEmitter } from "@angular/core";
|
|
2
2
|
import { RecordingFile } from "../recording";
|
|
3
3
|
import { MatTableDataSource } from "@angular/material/table";
|
|
4
|
+
import { AudioDataHolder } from "../../audio/audio_data_holder";
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
export declare class RecordingList implements AfterViewInit {
|
|
6
7
|
private recordingList;
|
|
@@ -12,7 +13,8 @@ export declare class RecordingList implements AfterViewInit {
|
|
|
12
13
|
constructor();
|
|
13
14
|
ngAfterViewInit(): void;
|
|
14
15
|
private buildDataSource;
|
|
15
|
-
|
|
16
|
+
addRecFile(rf: RecordingFile): void;
|
|
17
|
+
setRecFileAudioData(recFile: RecordingFile, adh: AudioDataHolder | null): void;
|
|
16
18
|
selectRecordingFile(rf: RecordingFile): void;
|
|
17
19
|
selectTop(): void;
|
|
18
20
|
lengthTimeFormatted(rf: RecordingFile): string;
|
|
@@ -3,11 +3,12 @@ import * as i0 from "@angular/core";
|
|
|
3
3
|
export declare class RecordingFileMetaComponent {
|
|
4
4
|
sessionId: string | number | null;
|
|
5
5
|
private _recordingFile;
|
|
6
|
+
stateLoading: boolean;
|
|
6
7
|
get recordingFile(): SprRecordingFile | null;
|
|
7
8
|
set recordingFile(recordingFile: SprRecordingFile | null);
|
|
8
9
|
itemCode: string | null;
|
|
9
10
|
uuid: string | null | undefined;
|
|
10
11
|
recordingAsPlainText(): string | null;
|
|
11
12
|
static ɵfac: i0.ɵɵFactoryDeclaration<RecordingFileMetaComponent, never>;
|
|
12
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<RecordingFileMetaComponent, "app-recording-file-meta", never, { "sessionId": "sessionId"; "recordingFile": "recordingFile"; }, {}, never, never>;
|
|
13
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RecordingFileMetaComponent, "app-recording-file-meta", never, { "sessionId": "sessionId"; "stateLoading": "stateLoading"; "recordingFile": "recordingFile"; }, {}, never, never>;
|
|
13
14
|
}
|