speechrecorderng 3.6.0 → 3.8.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/esm2022/lib/action/action.mjs +73 -0
- package/{esm2020 → esm2022}/lib/audio/array_audio_buffer.mjs +163 -163
- package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_input_stream.mjs +85 -85
- package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_random_access_stream.mjs +15 -15
- package/esm2022/lib/audio/audio_data_holder.mjs +264 -0
- package/{esm2020 → esm2022}/lib/audio/audio_display.mjs +93 -93
- package/{esm2020 → esm2022}/lib/audio/audio_player.mjs +213 -213
- package/esm2022/lib/audio/capture/capture.mjs +855 -0
- package/esm2022/lib/audio/context.mjs +79 -0
- package/{esm2020 → esm2022}/lib/audio/dsp/level_measure.mjs +515 -515
- package/{esm2020 → esm2022}/lib/audio/format.mjs +16 -16
- package/esm2022/lib/audio/impl/wavformat.mjs +6 -0
- package/{esm2020 → esm2022}/lib/audio/impl/wavreader.mjs +133 -133
- package/esm2022/lib/audio/impl/wavwriter.mjs +105 -0
- package/esm2022/lib/audio/inddb_audio_buffer.mjs +508 -0
- package/{esm2020 → esm2022}/lib/audio/io/stream.mjs +58 -58
- package/esm2022/lib/audio/net_audio_buffer.mjs +293 -0
- package/{esm2020 → esm2022}/lib/audio/persistor.mjs +80 -80
- package/{esm2020 → esm2022}/lib/audio/playback/array_audio_buffer_source_node.mjs +125 -125
- package/esm2022/lib/audio/playback/audio_source_node.mjs +18 -0
- package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
- package/{esm2020 → esm2022}/lib/audio/playback/inddb_audio_buffer_source_node.mjs +166 -166
- package/{esm2020 → esm2022}/lib/audio/playback/net_audio_buffer_source_node.mjs +217 -217
- package/esm2022/lib/audio/playback/player.mjs +402 -0
- package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +347 -0
- package/{esm2020 → esm2022}/lib/audio/ui/audio_display_control.mjs +65 -65
- package/{esm2020 → esm2022}/lib/audio/ui/audio_display_scroll_pane.mjs +139 -139
- package/{esm2020 → esm2022}/lib/audio/ui/audiosignal.mjs +524 -524
- package/{esm2020 → esm2022}/lib/audio/ui/common.mjs +18 -18
- package/esm2022/lib/audio/ui/container.mjs +414 -0
- package/{esm2020 → esm2022}/lib/audio/ui/livelevel.mjs +352 -352
- package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +11 -0
- package/esm2022/lib/audio/ui/sonagram.mjs +900 -0
- package/esm2022/lib/db/inddb.mjs +120 -0
- package/esm2022/lib/dsp/utils.mjs +48 -0
- package/{esm2020 → esm2022}/lib/io/BinaryReader.mjs +84 -84
- package/esm2022/lib/io/BinaryWriter.mjs +74 -0
- package/{esm2020 → esm2022}/lib/io/stream.mjs +258 -258
- package/{esm2020 → esm2022}/lib/math/2d/geometry.mjs +27 -27
- package/esm2022/lib/math/complex.mjs +58 -0
- package/{esm2020 → esm2022}/lib/math/dft.mjs +195 -195
- package/{esm2020 → esm2022}/lib/media/utils.mjs +13 -13
- package/esm2022/lib/net/uploader.mjs +367 -0
- package/{esm2020 → esm2022}/lib/recorder_component.mjs +64 -64
- package/esm2022/lib/speechrecorder/project/project.mjs +49 -0
- package/esm2022/lib/speechrecorder/project/project.service.mjs +64 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/recording.mjs +123 -123
- package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +218 -0
- package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +1014 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/script/script.mjs +114 -114
- package/{esm2020 → esm2022}/lib/speechrecorder/script/script.service.mjs +47 -47
- package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +1179 -0
- package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +668 -0
- package/esm2022/lib/speechrecorder/session/controlpanel.mjs +416 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/item.mjs +29 -29
- package/{esm2020 → esm2022}/lib/speechrecorder/session/progress.mjs +69 -69
- package/{esm2020 → esm2022}/lib/speechrecorder/session/prompting.mjs +571 -571
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recorder_combi_pane.mjs +65 -65
- package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +195 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recording_list.mjs +103 -103
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +63 -63
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +51 -51
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +104 -104
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +381 -381
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file.mjs +67 -67
- package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +288 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/session.mjs +1 -1
- package/esm2022/lib/speechrecorder/session/session.service.mjs +69 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/session_finished_dialog.mjs +29 -29
- package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +1386 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/warning_bar.mjs +28 -28
- package/{esm2020 → esm2022}/lib/speechrecorder/spruploader.mjs +22 -22
- package/{esm2020 → esm2022}/lib/speechrecorder/startstopsignal/startstopsignal.mjs +1 -1
- package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +57 -0
- package/{esm2020 → esm2022}/lib/speechrecorderng.component.mjs +388 -388
- package/{esm2020 → esm2022}/lib/speechrecorderng.module.mjs +100 -100
- package/{esm2020 → esm2022}/lib/spr.config.mjs +26 -26
- package/{esm2020 → esm2022}/lib/spr.module.version.mjs +2 -2
- package/{esm2020 → esm2022}/lib/ui/canvas_layer_comp.mjs +38 -38
- package/{esm2020 → esm2022}/lib/ui/message_dialog.mjs +30 -30
- package/esm2022/lib/ui/recordingitem_display.mjs +253 -0
- package/{esm2020 → esm2022}/lib/ui/responsive_component.mjs +24 -24
- package/{esm2020 → esm2022}/lib/utils/scrollIntoViewToBottom.mjs +23 -23
- package/esm2022/lib/utils/ua-parser.mjs +190 -0
- package/esm2022/lib/utils/utils.mjs +105 -0
- package/esm2022/lib/utils/wake_lock.mjs +114 -0
- package/{esm2020 → esm2022}/lib/utils/wake_lock_media.mjs +1 -1
- package/{esm2020 → esm2022}/public-api.mjs +33 -33
- package/{esm2020 → esm2022}/speechrecorderng.mjs +4 -4
- package/{fesm2020 → fesm2022}/speechrecorderng.mjs +16518 -16454
- package/fesm2022/speechrecorderng.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/action/action.d.ts +27 -27
- package/lib/audio/array_audio_buffer.d.ts +31 -31
- package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -14
- package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -9
- package/lib/audio/audio_data_holder.d.ts +84 -84
- package/lib/audio/audio_display.d.ts +36 -36
- package/lib/audio/audio_player.d.ts +47 -47
- package/lib/audio/capture/capture.d.ts +67 -67
- package/lib/audio/context.d.ts +6 -6
- package/lib/audio/dsp/level_measure.d.ts +60 -60
- package/lib/audio/format.d.ts +11 -11
- package/lib/audio/impl/wavformat.d.ts +5 -5
- package/lib/audio/impl/wavreader.d.ts +16 -16
- package/lib/audio/impl/wavwriter.d.ts +13 -13
- package/lib/audio/inddb_audio_buffer.d.ts +68 -68
- package/lib/audio/io/stream.d.ts +28 -28
- package/lib/audio/net_audio_buffer.d.ts +57 -57
- package/lib/audio/persistor.d.ts +29 -29
- package/lib/audio/playback/array_audio_buffer_source_node.d.ts +18 -18
- package/lib/audio/playback/audio_source_node.d.ts +10 -10
- package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -4
- package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -21
- package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -27
- package/lib/audio/playback/player.d.ts +65 -65
- package/lib/audio/ui/audio_canvas_layer_comp.d.ts +68 -68
- package/lib/audio/ui/audio_display_control.d.ts +25 -25
- package/lib/audio/ui/audio_display_scroll_pane.d.ts +26 -26
- package/lib/audio/ui/audiosignal.d.ts +30 -30
- package/lib/audio/ui/common.d.ts +11 -11
- package/lib/audio/ui/container.d.ts +63 -63
- package/lib/audio/ui/livelevel.d.ts +60 -60
- package/lib/audio/ui/scroll_pane_horizontal.d.ts +5 -5
- package/lib/audio/ui/sonagram.d.ts +37 -37
- package/lib/db/inddb.d.ts +21 -21
- package/lib/dsp/utils.d.ts +19 -19
- package/lib/io/BinaryReader.d.ts +18 -18
- package/lib/io/BinaryWriter.d.ts +15 -15
- package/lib/io/stream.d.ts +59 -59
- package/lib/math/2d/geometry.d.ts +18 -18
- package/lib/math/complex.d.ts +17 -17
- package/lib/math/dft.d.ts +22 -22
- package/lib/media/utils.d.ts +3 -3
- package/lib/net/uploader.d.ts +81 -81
- package/lib/recorder_component.d.ts +16 -16
- package/lib/speechrecorder/project/project.d.ts +59 -59
- package/lib/speechrecorder/project/project.service.d.ts +21 -21
- package/lib/speechrecorder/recording.d.ts +51 -51
- package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -27
- package/lib/speechrecorder/recordings/recordings.service.d.ts +48 -48
- package/lib/speechrecorder/script/script.d.ts +80 -79
- package/lib/speechrecorder/script/script.service.d.ts +16 -16
- package/lib/speechrecorder/session/audiorecorder.d.ts +122 -122
- package/lib/speechrecorder/session/basicrecorder.d.ts +139 -139
- package/lib/speechrecorder/session/controlpanel.d.ts +109 -107
- package/lib/speechrecorder/session/item.d.ts +12 -12
- package/lib/speechrecorder/session/progress.d.ts +17 -17
- package/lib/speechrecorder/session/prompting.d.ts +121 -121
- package/lib/speechrecorder/session/recorder_combi_pane.d.ts +32 -32
- package/lib/speechrecorder/session/recording_file_cache.d.ts +33 -33
- package/lib/speechrecorder/session/recording_list.d.ts +24 -24
- package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +15 -15
- package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +20 -20
- package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +31 -31
- package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +55 -55
- package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +7 -7
- package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +24 -24
- package/lib/speechrecorder/session/session.d.ts +15 -15
- package/lib/speechrecorder/session/session.service.d.ts +20 -20
- package/lib/speechrecorder/session/session_finished_dialog.d.ts +10 -10
- package/lib/speechrecorder/session/sessionmanager.d.ts +129 -123
- package/lib/speechrecorder/session/warning_bar.d.ts +8 -8
- package/lib/speechrecorder/spruploader.d.ts +11 -11
- package/lib/speechrecorder/startstopsignal/startstopsignal.d.ts +10 -10
- package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +11 -11
- package/lib/speechrecorderng.component.d.ts +61 -61
- package/lib/speechrecorderng.module.d.ts +56 -56
- package/lib/spr.config.d.ts +17 -17
- package/lib/spr.module.version.d.ts +1 -1
- package/lib/ui/canvas_layer_comp.d.ts +13 -13
- package/lib/ui/message_dialog.d.ts +10 -10
- package/lib/ui/recordingitem_display.d.ts +84 -84
- package/lib/ui/responsive_component.d.ts +9 -9
- package/lib/utils/scrollIntoViewToBottom.d.ts +9 -9
- package/lib/utils/ua-parser.d.ts +43 -43
- package/lib/utils/utils.d.ts +19 -19
- package/lib/utils/wake_lock.d.ts +23 -23
- package/lib/utils/wake_lock_media.d.ts +1 -1
- package/package.json +17 -23
- package/public-api.d.ts +33 -33
- package/esm2020/lib/action/action.mjs +0 -73
- package/esm2020/lib/audio/audio_data_holder.mjs +0 -264
- package/esm2020/lib/audio/capture/capture.mjs +0 -855
- package/esm2020/lib/audio/context.mjs +0 -79
- package/esm2020/lib/audio/impl/wavformat.mjs +0 -6
- package/esm2020/lib/audio/impl/wavwriter.mjs +0 -105
- package/esm2020/lib/audio/inddb_audio_buffer.mjs +0 -508
- package/esm2020/lib/audio/net_audio_buffer.mjs +0 -293
- package/esm2020/lib/audio/playback/audio_source_node.mjs +0 -18
- package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
- package/esm2020/lib/audio/playback/player.mjs +0 -402
- package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
- package/esm2020/lib/audio/ui/container.mjs +0 -414
- package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
- package/esm2020/lib/audio/ui/sonagram.mjs +0 -900
- package/esm2020/lib/db/inddb.mjs +0 -120
- package/esm2020/lib/dsp/utils.mjs +0 -48
- package/esm2020/lib/io/BinaryWriter.mjs +0 -74
- package/esm2020/lib/math/complex.mjs +0 -58
- package/esm2020/lib/net/uploader.mjs +0 -367
- package/esm2020/lib/speechrecorder/project/project.mjs +0 -49
- package/esm2020/lib/speechrecorder/project/project.service.mjs +0 -64
- package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -216
- package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
- package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
- package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +0 -666
- package/esm2020/lib/speechrecorder/session/controlpanel.mjs +0 -409
- package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
- package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
- package/esm2020/lib/speechrecorder/session/session.service.mjs +0 -69
- package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +0 -1333
- package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
- package/esm2020/lib/ui/recordingitem_display.mjs +0 -253
- package/esm2020/lib/utils/ua-parser.mjs +0 -190
- package/esm2020/lib/utils/utils.mjs +0 -105
- package/esm2020/lib/utils/wake_lock.mjs +0 -114
- package/fesm2015/speechrecorderng.mjs +0 -17708
- package/fesm2015/speechrecorderng.mjs.map +0 -1
- package/fesm2020/speechrecorderng.mjs.map +0 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export class ActionEvent {
|
|
2
|
+
get value() {
|
|
3
|
+
return this._value;
|
|
4
|
+
}
|
|
5
|
+
constructor(_value = null) {
|
|
6
|
+
this._value = _value;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export class Action {
|
|
10
|
+
get value() {
|
|
11
|
+
return this._value;
|
|
12
|
+
}
|
|
13
|
+
constructor(name, value = null) {
|
|
14
|
+
this._disabled = true;
|
|
15
|
+
this._onAction = null;
|
|
16
|
+
this._name = name;
|
|
17
|
+
this._value = value;
|
|
18
|
+
this.listeners = new Array();
|
|
19
|
+
this.controls = [];
|
|
20
|
+
}
|
|
21
|
+
get name() {
|
|
22
|
+
return this._name;
|
|
23
|
+
}
|
|
24
|
+
get onAction() {
|
|
25
|
+
return this._onAction;
|
|
26
|
+
}
|
|
27
|
+
set onAction(value) {
|
|
28
|
+
this._onAction = value;
|
|
29
|
+
}
|
|
30
|
+
createActionEvent(value = null) {
|
|
31
|
+
// default:
|
|
32
|
+
return new ActionEvent(value);
|
|
33
|
+
}
|
|
34
|
+
perform(value = null) {
|
|
35
|
+
this._value = value;
|
|
36
|
+
if (!this.disabled && this._onAction) {
|
|
37
|
+
let ae = this.createActionEvent(value);
|
|
38
|
+
this._onAction(ae);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
set disabled(disabled) {
|
|
42
|
+
//console.debug("Action: "+this._name+" disabled: "+disabled)
|
|
43
|
+
this._disabled = disabled;
|
|
44
|
+
for (let c of this.controls) {
|
|
45
|
+
c.disabled = this._disabled;
|
|
46
|
+
}
|
|
47
|
+
//let disStr=this.disabled?"disabled":"enabled";
|
|
48
|
+
//console.log(this._name+": "+disStr);
|
|
49
|
+
}
|
|
50
|
+
get disabled() {
|
|
51
|
+
return this._disabled;
|
|
52
|
+
}
|
|
53
|
+
addControl(ctrl, actionEventName) {
|
|
54
|
+
if (ctrl) {
|
|
55
|
+
if (this.controls.indexOf(ctrl) < 0) {
|
|
56
|
+
ctrl.disabled = this.disabled;
|
|
57
|
+
this.controls.push(ctrl);
|
|
58
|
+
if (actionEventName) {
|
|
59
|
+
ctrl.addEventListener(actionEventName, () => {
|
|
60
|
+
this.perform();
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
removeControl(ctrl) {
|
|
67
|
+
const i = this.controls.indexOf(ctrl);
|
|
68
|
+
if (i >= 0) {
|
|
69
|
+
this.controls = this.controls.splice(i, 1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2FjdGlvbi9hY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0ksTUFBTSxPQUFPLFdBQVc7SUFDcEIsSUFBSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxZQUFvQixTQUFjLElBQUk7UUFBbEIsV0FBTSxHQUFOLE1BQU0sQ0FBWTtJQUV0QyxDQUFDO0NBQ0o7QUFNRCxNQUFNLE9BQU8sTUFBTTtJQUNmLElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBU0QsWUFBWSxJQUFXLEVBQUMsUUFBYSxJQUFJO1FBTHpDLGNBQVMsR0FBQyxJQUFJLENBQUM7UUFDUCxjQUFTLEdBQTZCLElBQUksQ0FBQztRQUsvQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsTUFBTSxHQUFDLEtBQUssQ0FBQTtRQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksS0FBSyxFQUEwQixDQUFDO1FBQ3JELElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUdELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsS0FBaUM7UUFDMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVVLGlCQUFpQixDQUFDLFFBQWMsSUFBSTtRQUMzQyxXQUFXO1FBQ1gsT0FBTyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsT0FBTyxDQUFDLFFBQWMsSUFBSTtRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFDLEtBQUssQ0FBQTtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xDLElBQUksRUFBRSxHQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3RCO0lBQ0wsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLFFBQWdCO1FBQzFCLDZEQUE2RDtRQUM1RCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUMxQixLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDekIsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQy9CO1FBQ0QsZ0RBQWdEO1FBQ2hELHNDQUFzQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBc0IsRUFBRSxlQUF3QjtRQUN2RCxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QixJQUFJLGVBQWUsRUFBRTtvQkFDakIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7d0JBQ3hDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDbkIsQ0FBQyxDQUFDLENBQUM7aUJBQ047YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFxQjtRQUMvQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDUixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUM5QztJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIlxyXG4gICAgZXhwb3J0IGNsYXNzIEFjdGlvbkV2ZW50PFQ+IHtcclxuICAgICAgICBnZXQgdmFsdWUoKTogVHxudWxsIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF92YWx1ZTpUfG51bGw9bnVsbCkge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBBY3Rpb25FdmVudExpc3RlbmVyPFQ+e1xyXG4gICAgICAgIChhZTpBY3Rpb25FdmVudDxUPik6dm9pZDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgQWN0aW9uPFQ+IHtcclxuICAgICAgICBnZXQgdmFsdWUoKTogVHxudWxsIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbmFtZTpzdHJpbmc7XHJcbiAgICAgICAgcHJpdmF0ZSBfdmFsdWU6VHxudWxsO1xyXG4gICAgICAgIF9kaXNhYmxlZD10cnVlO1xyXG4gICAgICAgIHByaXZhdGUgX29uQWN0aW9uOkFjdGlvbkV2ZW50TGlzdGVuZXI8VD58bnVsbD1udWxsO1xyXG4gICAgICAgIGxpc3RlbmVyczpBcnJheTxBY3Rpb25FdmVudExpc3RlbmVyPFQ+PjtcclxuICAgICAgICBwcml2YXRlIGNvbnRyb2xzOkhUTUxJbnB1dEVsZW1lbnRbXTtcclxuXHJcbiAgICAgICAgY29uc3RydWN0b3IobmFtZTpzdHJpbmcsdmFsdWU6VHxudWxsPW51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlPXZhbHVlXHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IEFycmF5PEFjdGlvbkV2ZW50TGlzdGVuZXI8VD4+KCk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbHMgPSBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldCBuYW1lKCk6c3RyaW5nIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25hbWU7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZ2V0IG9uQWN0aW9uKCk6QWN0aW9uRXZlbnRMaXN0ZW5lcjxUPnxudWxsIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29uQWN0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0IG9uQWN0aW9uKHZhbHVlOkFjdGlvbkV2ZW50TGlzdGVuZXI8VD58bnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9vbkFjdGlvbiA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJvdGVjdGVkICBjcmVhdGVBY3Rpb25FdmVudCh2YWx1ZTogVHxudWxsPW51bGwpOkFjdGlvbkV2ZW50PFQ+IHtcclxuICAgICAgICAgICAgLy8gZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3Rpb25FdmVudCh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwZXJmb3JtKHZhbHVlOiBUfG51bGw9bnVsbCk6dm9pZCB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlPXZhbHVlXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiB0aGlzLl9vbkFjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGFlPXRoaXMuY3JlYXRlQWN0aW9uRXZlbnQodmFsdWUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkFjdGlvbihhZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldCBkaXNhYmxlZChkaXNhYmxlZDpib29sZWFuKSB7XHJcbiAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQWN0aW9uOiBcIit0aGlzLl9uYW1lK1wiIGRpc2FibGVkOiBcIitkaXNhYmxlZClcclxuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBkaXNhYmxlZDtcclxuICAgICAgICAgICAgZm9yIChsZXQgYyBvZiB0aGlzLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICBjLmRpc2FibGVkID0gdGhpcy5fZGlzYWJsZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9sZXQgZGlzU3RyPXRoaXMuZGlzYWJsZWQ/XCJkaXNhYmxlZFwiOlwiZW5hYmxlZFwiO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuX25hbWUrXCI6IFwiK2Rpc1N0cik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXQgZGlzYWJsZWQoKTpib29sZWFuIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYWRkQ29udHJvbChjdHJsOiBIVE1MSW5wdXRFbGVtZW50LCBhY3Rpb25FdmVudE5hbWU/OiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgaWYgKGN0cmwpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xzLmluZGV4T2YoY3RybCkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3RybC5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9scy5wdXNoKGN0cmwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25FdmVudE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3RybC5hZGRFdmVudExpc3RlbmVyKGFjdGlvbkV2ZW50TmFtZSwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVtb3ZlQ29udHJvbChjdHJsOkhUTUxJbnB1dEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuY29udHJvbHMuaW5kZXhPZihjdHJsKTtcclxuICAgICAgICAgICAgaWYgKGkgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9scyA9IHRoaXMuY29udHJvbHMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuIl19
|
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
import { BasicAudioSource } from "./audio_data_holder";
|
|
2
|
-
import { Observable } from "rxjs";
|
|
3
|
-
import { ArrayAudioBufferRandomAccessStream } from "./array_audio_buffer_random_access_stream";
|
|
4
|
-
import { ArrayAudioBufferInputStream } from "./array_audio_buffer_input_stream";
|
|
5
|
-
export class ArrayAudioBuffer extends BasicAudioSource {
|
|
6
|
-
constructor(_channelCount, _sampleRate, _data) {
|
|
7
|
-
super();
|
|
8
|
-
this._channelCount = _channelCount;
|
|
9
|
-
this._sampleRate = _sampleRate;
|
|
10
|
-
this._data = _data;
|
|
11
|
-
this._chunkCount = 0;
|
|
12
|
-
this._frameLen = 0;
|
|
13
|
-
this._duration = 0;
|
|
14
|
-
this._sealed = false;
|
|
15
|
-
this.updateFrameLen();
|
|
16
|
-
this.ready();
|
|
17
|
-
}
|
|
18
|
-
updateFrameLen() {
|
|
19
|
-
this._frameLen = 0;
|
|
20
|
-
this._chunkCount = 0;
|
|
21
|
-
if (this._data.length > 0) {
|
|
22
|
-
let ch0Data = this.data[0];
|
|
23
|
-
for (let ch0Chk of ch0Data) {
|
|
24
|
-
this._chunkCount++;
|
|
25
|
-
this._frameLen += ch0Chk.length;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
this._duration = this._frameLen / this._sampleRate;
|
|
29
|
-
}
|
|
30
|
-
seal() {
|
|
31
|
-
this._sealed = true;
|
|
32
|
-
}
|
|
33
|
-
sealed() {
|
|
34
|
-
return this._sealed;
|
|
35
|
-
}
|
|
36
|
-
static fromAudioBuffer(audioBuffer, chunkFrameSize = 8192) {
|
|
37
|
-
let aab;
|
|
38
|
-
let chs = audioBuffer.numberOfChannels;
|
|
39
|
-
let frameLength = audioBuffer.length;
|
|
40
|
-
//let chunksSize=Math.ceil(frameLength/chunkFrameSize);
|
|
41
|
-
let framePos = 0;
|
|
42
|
-
let data = new Array(chs);
|
|
43
|
-
for (let ch = 0; ch < chs; ch++) {
|
|
44
|
-
data[ch] = new Array();
|
|
45
|
-
}
|
|
46
|
-
let toCopy = frameLength - framePos;
|
|
47
|
-
while (toCopy > 0) {
|
|
48
|
-
let toCopyChunk = chunkFrameSize;
|
|
49
|
-
if (toCopyChunk > toCopy) {
|
|
50
|
-
// last chunk, the rest
|
|
51
|
-
toCopyChunk = toCopy;
|
|
52
|
-
}
|
|
53
|
-
for (let ch = 0; ch < chs; ch++) {
|
|
54
|
-
data[ch].push(audioBuffer.getChannelData(ch).slice(framePos, framePos + toCopyChunk));
|
|
55
|
-
}
|
|
56
|
-
framePos += toCopyChunk;
|
|
57
|
-
toCopy -= toCopyChunk;
|
|
58
|
-
}
|
|
59
|
-
aab = new ArrayAudioBuffer(chs, audioBuffer.sampleRate, data);
|
|
60
|
-
return aab;
|
|
61
|
-
}
|
|
62
|
-
appendAudioBuffer(audioBuffer) {
|
|
63
|
-
let chs = audioBuffer.numberOfChannels;
|
|
64
|
-
if (this._channelCount !== chs) {
|
|
65
|
-
throw new Error('Cannot append audio buffer with ' + chs + ' channels to this array audio buffer with ' + this._channelCount + ' channels. Number of channels must match.');
|
|
66
|
-
}
|
|
67
|
-
let sr = audioBuffer.sampleRate;
|
|
68
|
-
if (sr !== this._sampleRate) {
|
|
69
|
-
throw new Error('Cannot append audio buffer with samplerate ' + sr + ' to this array audio buffer with samplerate ' + this._sampleRate + '. Samplerates must match.');
|
|
70
|
-
}
|
|
71
|
-
for (let ch = 0; ch < chs; ch++) {
|
|
72
|
-
let chAbSlice = audioBuffer.getChannelData(ch).slice();
|
|
73
|
-
//console.debug("Append audio buffer ch: "+ch+": "+chAbSlice.length);
|
|
74
|
-
this._data[ch].push(chAbSlice);
|
|
75
|
-
}
|
|
76
|
-
this.updateFrameLen();
|
|
77
|
-
}
|
|
78
|
-
get channelCount() {
|
|
79
|
-
return this._channelCount;
|
|
80
|
-
}
|
|
81
|
-
frames(framePos, frameLen, bufs) {
|
|
82
|
-
let ccFramePos = 0;
|
|
83
|
-
let trgFramePos = framePos;
|
|
84
|
-
let ch0Data = this.data[0];
|
|
85
|
-
let cPos = 0;
|
|
86
|
-
let filled = 0;
|
|
87
|
-
let ci = 0;
|
|
88
|
-
while (filled < frameLen && ci < this._chunkCount) {
|
|
89
|
-
// Current chunk
|
|
90
|
-
let cc0 = ch0Data[ci];
|
|
91
|
-
let ccLen = cc0.length;
|
|
92
|
-
let ccFrameEndPos = ccFramePos + ccLen;
|
|
93
|
-
if (trgFramePos >= ccFramePos && trgFramePos < ccFrameEndPos) {
|
|
94
|
-
let toCp = frameLen - filled;
|
|
95
|
-
cPos = trgFramePos - ccFramePos;
|
|
96
|
-
if (cPos + toCp > ccLen) {
|
|
97
|
-
toCp = ccLen - cPos;
|
|
98
|
-
}
|
|
99
|
-
for (let ch = 0; ch < bufs.length; ch++) {
|
|
100
|
-
let cc = this.data[ch][ci];
|
|
101
|
-
for (let i = 0; i < toCp; i++) {
|
|
102
|
-
bufs[ch][filled + i] = cc[cPos + i];
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
filled += toCp;
|
|
106
|
-
trgFramePos += toCp;
|
|
107
|
-
cPos += toCp;
|
|
108
|
-
ccFramePos += toCp;
|
|
109
|
-
if (cPos >= ccLen) {
|
|
110
|
-
ccFramePos = ccFrameEndPos;
|
|
111
|
-
cPos = 0;
|
|
112
|
-
ci++;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
// next chunk
|
|
117
|
-
ccFramePos = ccFrameEndPos;
|
|
118
|
-
cPos = 0;
|
|
119
|
-
ci++;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return filled;
|
|
123
|
-
}
|
|
124
|
-
get sampleRate() {
|
|
125
|
-
return this._sampleRate;
|
|
126
|
-
}
|
|
127
|
-
get frameLen() {
|
|
128
|
-
return this._frameLen;
|
|
129
|
-
}
|
|
130
|
-
get chunkCount() {
|
|
131
|
-
return this._chunkCount;
|
|
132
|
-
}
|
|
133
|
-
get data() {
|
|
134
|
-
return this._data;
|
|
135
|
-
}
|
|
136
|
-
asyncAudioInputStream() {
|
|
137
|
-
return null;
|
|
138
|
-
}
|
|
139
|
-
audioInputStream() {
|
|
140
|
-
return new ArrayAudioBufferInputStream(this);
|
|
141
|
-
}
|
|
142
|
-
get duration() {
|
|
143
|
-
return this._duration;
|
|
144
|
-
}
|
|
145
|
-
get numberOfChannels() {
|
|
146
|
-
return this._channelCount;
|
|
147
|
-
}
|
|
148
|
-
releaseAudioData() {
|
|
149
|
-
return new Observable(subscriber => {
|
|
150
|
-
// No persistent respectively async deletable storage, they should be finally removed by the GC
|
|
151
|
-
//this._audioBuffer=null;
|
|
152
|
-
//this._arrayBuffer=null;
|
|
153
|
-
subscriber.next();
|
|
154
|
-
subscriber.complete();
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
sampleCounts() {
|
|
158
|
-
return this._channelCount * this._frameLen;
|
|
159
|
-
}
|
|
160
|
-
randomAccessAudioStream() {
|
|
161
|
-
return new ArrayAudioBufferRandomAccessStream(this);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
1
|
+
import { BasicAudioSource } from "./audio_data_holder";
|
|
2
|
+
import { Observable } from "rxjs";
|
|
3
|
+
import { ArrayAudioBufferRandomAccessStream } from "./array_audio_buffer_random_access_stream";
|
|
4
|
+
import { ArrayAudioBufferInputStream } from "./array_audio_buffer_input_stream";
|
|
5
|
+
export class ArrayAudioBuffer extends BasicAudioSource {
|
|
6
|
+
constructor(_channelCount, _sampleRate, _data) {
|
|
7
|
+
super();
|
|
8
|
+
this._channelCount = _channelCount;
|
|
9
|
+
this._sampleRate = _sampleRate;
|
|
10
|
+
this._data = _data;
|
|
11
|
+
this._chunkCount = 0;
|
|
12
|
+
this._frameLen = 0;
|
|
13
|
+
this._duration = 0;
|
|
14
|
+
this._sealed = false;
|
|
15
|
+
this.updateFrameLen();
|
|
16
|
+
this.ready();
|
|
17
|
+
}
|
|
18
|
+
updateFrameLen() {
|
|
19
|
+
this._frameLen = 0;
|
|
20
|
+
this._chunkCount = 0;
|
|
21
|
+
if (this._data.length > 0) {
|
|
22
|
+
let ch0Data = this.data[0];
|
|
23
|
+
for (let ch0Chk of ch0Data) {
|
|
24
|
+
this._chunkCount++;
|
|
25
|
+
this._frameLen += ch0Chk.length;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
this._duration = this._frameLen / this._sampleRate;
|
|
29
|
+
}
|
|
30
|
+
seal() {
|
|
31
|
+
this._sealed = true;
|
|
32
|
+
}
|
|
33
|
+
sealed() {
|
|
34
|
+
return this._sealed;
|
|
35
|
+
}
|
|
36
|
+
static fromAudioBuffer(audioBuffer, chunkFrameSize = 8192) {
|
|
37
|
+
let aab;
|
|
38
|
+
let chs = audioBuffer.numberOfChannels;
|
|
39
|
+
let frameLength = audioBuffer.length;
|
|
40
|
+
//let chunksSize=Math.ceil(frameLength/chunkFrameSize);
|
|
41
|
+
let framePos = 0;
|
|
42
|
+
let data = new Array(chs);
|
|
43
|
+
for (let ch = 0; ch < chs; ch++) {
|
|
44
|
+
data[ch] = new Array();
|
|
45
|
+
}
|
|
46
|
+
let toCopy = frameLength - framePos;
|
|
47
|
+
while (toCopy > 0) {
|
|
48
|
+
let toCopyChunk = chunkFrameSize;
|
|
49
|
+
if (toCopyChunk > toCopy) {
|
|
50
|
+
// last chunk, the rest
|
|
51
|
+
toCopyChunk = toCopy;
|
|
52
|
+
}
|
|
53
|
+
for (let ch = 0; ch < chs; ch++) {
|
|
54
|
+
data[ch].push(audioBuffer.getChannelData(ch).slice(framePos, framePos + toCopyChunk));
|
|
55
|
+
}
|
|
56
|
+
framePos += toCopyChunk;
|
|
57
|
+
toCopy -= toCopyChunk;
|
|
58
|
+
}
|
|
59
|
+
aab = new ArrayAudioBuffer(chs, audioBuffer.sampleRate, data);
|
|
60
|
+
return aab;
|
|
61
|
+
}
|
|
62
|
+
appendAudioBuffer(audioBuffer) {
|
|
63
|
+
let chs = audioBuffer.numberOfChannels;
|
|
64
|
+
if (this._channelCount !== chs) {
|
|
65
|
+
throw new Error('Cannot append audio buffer with ' + chs + ' channels to this array audio buffer with ' + this._channelCount + ' channels. Number of channels must match.');
|
|
66
|
+
}
|
|
67
|
+
let sr = audioBuffer.sampleRate;
|
|
68
|
+
if (sr !== this._sampleRate) {
|
|
69
|
+
throw new Error('Cannot append audio buffer with samplerate ' + sr + ' to this array audio buffer with samplerate ' + this._sampleRate + '. Samplerates must match.');
|
|
70
|
+
}
|
|
71
|
+
for (let ch = 0; ch < chs; ch++) {
|
|
72
|
+
let chAbSlice = audioBuffer.getChannelData(ch).slice();
|
|
73
|
+
//console.debug("Append audio buffer ch: "+ch+": "+chAbSlice.length);
|
|
74
|
+
this._data[ch].push(chAbSlice);
|
|
75
|
+
}
|
|
76
|
+
this.updateFrameLen();
|
|
77
|
+
}
|
|
78
|
+
get channelCount() {
|
|
79
|
+
return this._channelCount;
|
|
80
|
+
}
|
|
81
|
+
frames(framePos, frameLen, bufs) {
|
|
82
|
+
let ccFramePos = 0;
|
|
83
|
+
let trgFramePos = framePos;
|
|
84
|
+
let ch0Data = this.data[0];
|
|
85
|
+
let cPos = 0;
|
|
86
|
+
let filled = 0;
|
|
87
|
+
let ci = 0;
|
|
88
|
+
while (filled < frameLen && ci < this._chunkCount) {
|
|
89
|
+
// Current chunk
|
|
90
|
+
let cc0 = ch0Data[ci];
|
|
91
|
+
let ccLen = cc0.length;
|
|
92
|
+
let ccFrameEndPos = ccFramePos + ccLen;
|
|
93
|
+
if (trgFramePos >= ccFramePos && trgFramePos < ccFrameEndPos) {
|
|
94
|
+
let toCp = frameLen - filled;
|
|
95
|
+
cPos = trgFramePos - ccFramePos;
|
|
96
|
+
if (cPos + toCp > ccLen) {
|
|
97
|
+
toCp = ccLen - cPos;
|
|
98
|
+
}
|
|
99
|
+
for (let ch = 0; ch < bufs.length; ch++) {
|
|
100
|
+
let cc = this.data[ch][ci];
|
|
101
|
+
for (let i = 0; i < toCp; i++) {
|
|
102
|
+
bufs[ch][filled + i] = cc[cPos + i];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
filled += toCp;
|
|
106
|
+
trgFramePos += toCp;
|
|
107
|
+
cPos += toCp;
|
|
108
|
+
ccFramePos += toCp;
|
|
109
|
+
if (cPos >= ccLen) {
|
|
110
|
+
ccFramePos = ccFrameEndPos;
|
|
111
|
+
cPos = 0;
|
|
112
|
+
ci++;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// next chunk
|
|
117
|
+
ccFramePos = ccFrameEndPos;
|
|
118
|
+
cPos = 0;
|
|
119
|
+
ci++;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return filled;
|
|
123
|
+
}
|
|
124
|
+
get sampleRate() {
|
|
125
|
+
return this._sampleRate;
|
|
126
|
+
}
|
|
127
|
+
get frameLen() {
|
|
128
|
+
return this._frameLen;
|
|
129
|
+
}
|
|
130
|
+
get chunkCount() {
|
|
131
|
+
return this._chunkCount;
|
|
132
|
+
}
|
|
133
|
+
get data() {
|
|
134
|
+
return this._data;
|
|
135
|
+
}
|
|
136
|
+
asyncAudioInputStream() {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
audioInputStream() {
|
|
140
|
+
return new ArrayAudioBufferInputStream(this);
|
|
141
|
+
}
|
|
142
|
+
get duration() {
|
|
143
|
+
return this._duration;
|
|
144
|
+
}
|
|
145
|
+
get numberOfChannels() {
|
|
146
|
+
return this._channelCount;
|
|
147
|
+
}
|
|
148
|
+
releaseAudioData() {
|
|
149
|
+
return new Observable(subscriber => {
|
|
150
|
+
// No persistent respectively async deletable storage, they should be finally removed by the GC
|
|
151
|
+
//this._audioBuffer=null;
|
|
152
|
+
//this._arrayBuffer=null;
|
|
153
|
+
subscriber.next();
|
|
154
|
+
subscriber.complete();
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
sampleCounts() {
|
|
158
|
+
return this._channelCount * this._frameLen;
|
|
159
|
+
}
|
|
160
|
+
randomAccessAudioStream() {
|
|
161
|
+
return new ArrayAudioBufferRandomAccessStream(this);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
164
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlfYXVkaW9fYnVmZmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL2FycmF5X2F1ZGlvX2J1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsZ0JBQWdCLEVBQTBCLE1BQU0scUJBQXFCLENBQUM7QUFFOUUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUM3RixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUc5RSxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsZ0JBQWdCO0lBT3BELFlBQW9CLGFBQXFCLEVBQVUsV0FBbUIsRUFBVSxLQUFpQztRQUMvRyxLQUFLLEVBQUUsQ0FBQztRQURVLGtCQUFhLEdBQWIsYUFBYSxDQUFRO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUE0QjtRQUx6RyxnQkFBVyxHQUFDLENBQUMsQ0FBQztRQUNkLGNBQVMsR0FBUSxDQUFDLENBQUM7UUFDbkIsY0FBUyxHQUFRLENBQUMsQ0FBQztRQUNuQixZQUFPLEdBQUMsS0FBSyxDQUFDO1FBSXBCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFDLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsV0FBVyxHQUFDLENBQUMsQ0FBQztRQUNuQixJQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBRTtZQUN0QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLEtBQUss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SUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCxnQkFBZ0I7UUFDVixPQUFPLElBQUksVUFBVSxDQUFPLFVBQVUsQ0FBQyxFQUFFO1lBQ3pDLCtGQUErRjtZQUMvRix5QkFBeUI7WUFDekIseUJBQXlCO1lBQ3pCLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFMUIsQ0FBQyxDQUFDLENBQUM7SUFFTCxDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLGFBQWEsR0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzNDLENBQUM7SUFFRCx1QkFBdUI7UUFDdEIsT0FBTyxJQUFJLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JELENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QmFzaWNBdWRpb1NvdXJjZSwgUmFuZG9tQWNjZXNzQXVkaW9TdHJlYW19IGZyb20gXCIuL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcbmltcG9ydCB7QXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSwgRmxvYXQzMkFycmF5SW5wdXRTdHJlYW19IGZyb20gXCIuLi9pby9zdHJlYW1cIjtcclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge0FycmF5QXVkaW9CdWZmZXJSYW5kb21BY2Nlc3NTdHJlYW19IGZyb20gXCIuL2FycmF5X2F1ZGlvX2J1ZmZlcl9yYW5kb21fYWNjZXNzX3N0cmVhbVwiO1xyXG5pbXBvcnQge0FycmF5QXVkaW9CdWZmZXJJbnB1dFN0cmVhbX0gZnJvbSBcIi4vYXJyYXlfYXVkaW9fYnVmZmVyX2lucHV0X3N0cmVhbVwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBBcnJheUF1ZGlvQnVmZmVyIGV4dGVuZHMgQmFzaWNBdWRpb1NvdXJjZXtcclxuXHJcbiAgcHJpdmF0ZSBfY2h1bmtDb3VudD0wO1xyXG4gIHByaXZhdGUgX2ZyYW1lTGVuOm51bWJlcj0wO1xyXG4gIHByaXZhdGUgX2R1cmF0aW9uOm51bWJlcj0wO1xyXG4gIHByaXZhdGUgX3NlYWxlZD1mYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY2hhbm5lbENvdW50OiBudW1iZXIsIHByaXZhdGUgX3NhbXBsZVJhdGU6IG51bWJlciwgcHJpdmF0ZSBfZGF0YTogQXJyYXk8QXJyYXk8RmxvYXQzMkFycmF5Pj4pIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUZyYW1lTGVuKCk7XHJcbiAgICB0aGlzLnJlYWR5KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZyYW1lTGVuKCl7XHJcbiAgICB0aGlzLl9mcmFtZUxlbj0wO1xyXG4gICAgdGhpcy5fY2h1bmtDb3VudD0wO1xyXG4gICAgaWYodGhpcy5fZGF0YS5sZW5ndGg+MCkge1xyXG4gICAgICBsZXQgY2gwRGF0YSA9IHRoaXMuZGF0YVswXTtcclxuICAgICAgZm9yIChsZXQgY2gwQ2hrIG9mIGNoMERhdGEpIHtcclxuICAgICAgICB0aGlzLl9jaHVua0NvdW50Kys7XHJcbiAgICAgICAgdGhpcy5fZnJhbWVMZW4gKz0gY2gwQ2hrLmxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fZHVyYXRpb249dGhpcy5fZnJhbWVMZW4vdGhpcy5fc2FtcGxlUmF0ZTtcclxuICB9XHJcblxyXG4gIHNlYWwoKXtcclxuICAgIHRoaXMuX3NlYWxlZD10cnVlO1xyXG4gIH1cclxuXHJcbiAgc2VhbGVkKCk6Ym9vbGVhbntcclxuICAgIHJldHVybiB0aGlzLl9zZWFsZWQ7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZnJvbUF1ZGlvQnVmZmVyKGF1ZGlvQnVmZmVyOkF1ZGlvQnVmZmVyLGNodW5rRnJhbWVTaXplPTgxOTIpOkFycmF5QXVkaW9CdWZmZXJ7XHJcbiAgICBsZXQgYWFiOkFycmF5QXVkaW9CdWZmZXI7XHJcbiAgICBsZXQgY2hzPWF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHM7XHJcbiAgICBsZXQgZnJhbWVMZW5ndGg9YXVkaW9CdWZmZXIubGVuZ3RoO1xyXG4gICAgLy9sZXQgY2h1bmtzU2l6ZT1NYXRoLmNlaWwoZnJhbWVMZW5ndGgvY2h1bmtGcmFtZVNpemUpO1xyXG4gICAgbGV0IGZyYW1lUG9zPTA7XHJcbiAgICBsZXQgZGF0YT1uZXcgQXJyYXk8QXJyYXk8RmxvYXQzMkFycmF5Pj4oY2hzKTtcclxuICAgIGZvcihsZXQgY2g9MDtjaDxjaHM7Y2grKykge1xyXG4gICAgICBkYXRhW2NoXT1uZXcgQXJyYXk8RmxvYXQzMkFycmF5PigpO1xyXG4gICAgfVxyXG4gICAgbGV0IHRvQ29weT1mcmFtZUxlbmd0aC1mcmFtZVBvcztcclxuICAgICAgd2hpbGUodG9Db3B5PjApe1xyXG5cclxuICAgICAgICBsZXQgdG9Db3B5Q2h1bms9Y2h1bmtGcmFtZVNpemU7XHJcbiAgICAgICAgaWYodG9Db3B5Q2h1bms+dG9Db3B5KXtcclxuICAgICAgICAgIC8vIGxhc3QgY2h1bmssIHRoZSByZXN0XHJcbiAgICAgICAgICB0b0NvcHlDaHVuaz10b0NvcHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvcihsZXQgY2g9MDtjaDxjaHM7Y2grKykge1xyXG4gICAgICAgICAgZGF0YVtjaF0ucHVzaChhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YShjaCkuc2xpY2UoZnJhbWVQb3MsIGZyYW1lUG9zICsgdG9Db3B5Q2h1bmspKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZnJhbWVQb3MrPXRvQ29weUNodW5rO1xyXG4gICAgICAgIHRvQ29weS09dG9Db3B5Q2h1bms7XHJcbiAgICAgIH1cclxuICAgIGFhYj1uZXcgQXJyYXlBdWRpb0J1ZmZlcihjaHMsYXVkaW9CdWZmZXIuc2FtcGxlUmF0ZSxkYXRhKTtcclxuICAgIHJldHVybiBhYWI7XHJcbiAgfVxyXG5cclxuICBhcHBlbmRBdWRpb0J1ZmZlcihhdWRpb0J1ZmZlcjpBdWRpb0J1ZmZlcil7XHJcbiAgICBsZXQgY2hzPWF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHM7XHJcbiAgICBpZih0aGlzLl9jaGFubmVsQ291bnQhPT0gY2hzKXtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYXBwZW5kIGF1ZGlvIGJ1ZmZlciB3aXRoICcrY2hzKycgY2hhbm5lbHMgdG8gdGhpcyBhcnJheSBhdWRpbyBidWZmZXIgd2l0aCAnK3RoaXMuX2NoYW5uZWxDb3VudCsnIGNoYW5uZWxzLiBOdW1iZXIgb2YgY2hhbm5lbHMgbXVzdCBtYXRjaC4nKTtcclxuICAgIH1cclxuICAgIGxldCBzcj1hdWRpb0J1ZmZlci5zYW1wbGVSYXRlO1xyXG4gICAgaWYoc3IhPT10aGlzLl9zYW1wbGVSYXRlKXtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYXBwZW5kIGF1ZGlvIGJ1ZmZlciB3aXRoIHNhbXBsZXJhdGUgJytzcisnIHRvIHRoaXMgYXJyYXkgYXVkaW8gYnVmZmVyIHdpdGggc2FtcGxlcmF0ZSAnK3RoaXMuX3NhbXBsZVJhdGUrJy4gU2FtcGxlcmF0ZXMgbXVzdCBtYXRjaC4nKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IobGV0IGNoPTA7Y2g8Y2hzO2NoKyspIHtcclxuICAgICAgbGV0IGNoQWJTbGljZT1hdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YShjaCkuc2xpY2UoKTtcclxuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQXBwZW5kIGF1ZGlvIGJ1ZmZlciBjaDogXCIrY2grXCI6IFwiK2NoQWJTbGljZS5sZW5ndGgpO1xyXG4gICAgICB0aGlzLl9kYXRhW2NoXS5wdXNoKGNoQWJTbGljZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUZyYW1lTGVuKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0IGNoYW5uZWxDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5uZWxDb3VudDtcclxuICB9XHJcblxyXG4gIGZyYW1lcyhmcmFtZVBvczpudW1iZXIsZnJhbWVMZW46bnVtYmVyLGJ1ZnM6RmxvYXQzMkFycmF5W10pOm51bWJlcntcclxuXHJcbiAgICBsZXQgY2NGcmFtZVBvcz0wO1xyXG4gICAgbGV0IHRyZ0ZyYW1lUG9zPWZyYW1lUG9zO1xyXG4gICAgbGV0IGNoMERhdGEgPSB0aGlzLmRhdGFbMF07XHJcbiAgICBsZXQgY1Bvcz0wO1xyXG4gICAgbGV0IGZpbGxlZD0wO1xyXG4gICAgbGV0IGNpPTA7XHJcblxyXG4gICAgd2hpbGUoZmlsbGVkPGZyYW1lTGVuICYmIGNpPHRoaXMuX2NodW5rQ291bnQpe1xyXG4gICAgICAvLyBDdXJyZW50IGNodW5rXHJcbiAgICAgIGxldCBjYzA9Y2gwRGF0YVtjaV07XHJcbiAgICAgIGxldCBjY0xlbj1jYzAubGVuZ3RoO1xyXG4gICAgICBsZXQgY2NGcmFtZUVuZFBvcz1jY0ZyYW1lUG9zK2NjTGVuO1xyXG5cclxuICAgICAgaWYodHJnRnJhbWVQb3M+PWNjRnJhbWVQb3MgJiYgdHJnRnJhbWVQb3M8Y2NGcmFtZUVuZFBvcyl7XHJcbiAgICAgICAgbGV0IHRvQ3A9ZnJhbWVMZW4tZmlsbGVkO1xyXG4gICAgICAgIGNQb3M9dHJnRnJhbWVQb3MtY2NGcmFtZVBvcztcclxuICAgICAgICBpZihjUG9zK3RvQ3A+Y2NMZW4pe1xyXG4gICAgICAgICAgdG9DcD1jY0xlbi1jUG9zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IobGV0IGNoPTA7Y2g8YnVmcy5sZW5ndGg7Y2grKyl7XHJcbiAgICAgICAgICBsZXQgY2M9dGhpcy5kYXRhW2NoXVtjaV07XHJcblxyXG4gICAgICAgICAgZm9yKGxldCBpPTA7aTx0b0NwO2krKyl7XHJcbiAgICAgICAgICAgIGJ1ZnNbY2hdW2ZpbGxlZCtpXT1jY1tjUG9zK2ldO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmaWxsZWQrPXRvQ3A7XHJcbiAgICAgICAgdHJnRnJhbWVQb3MrPXRvQ3A7XHJcbiAgICAgICAgY1Bvcys9dG9DcDtcclxuICAgICAgICBjY0ZyYW1lUG9zKz10b0NwO1xyXG4gICAgICAgIGlmKGNQb3M+PWNjTGVuKXtcclxuICAgICAgICAgIGNjRnJhbWVQb3M9Y2NGcmFtZUVuZFBvcztcclxuICAgICAgICAgIGNQb3M9MDtcclxuICAgICAgICAgIGNpKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgLy8gbmV4dCBjaHVua1xyXG4gICAgICAgIGNjRnJhbWVQb3M9Y2NGcmFtZUVuZFBvcztcclxuICAgICAgICBjUG9zPTA7XHJcbiAgICAgICAgY2krKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpbGxlZDtcclxuICB9XHJcblxyXG4gIGdldCBzYW1wbGVSYXRlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2FtcGxlUmF0ZTtcclxuICB9XHJcblxyXG4gIGdldCBmcmFtZUxlbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZyYW1lTGVuO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNodW5rQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaHVua0NvdW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGEoKTogQXJyYXk8QXJyYXk8RmxvYXQzMkFycmF5Pj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgfVxyXG5cclxuICBhc3luY0F1ZGlvSW5wdXRTdHJlYW0oKTogQXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSB8IG51bGwge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBhdWRpb0lucHV0U3RyZWFtKCk6IEZsb2F0MzJBcnJheUlucHV0U3RyZWFtIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gbmV3IEFycmF5QXVkaW9CdWZmZXJJbnB1dFN0cmVhbSh0aGlzKTtcclxuICB9XHJcblxyXG4gIGdldCBkdXJhdGlvbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2R1cmF0aW9uO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG51bWJlck9mQ2hhbm5lbHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFubmVsQ291bnQ7XHJcbiAgfVxyXG5cclxuICByZWxlYXNlQXVkaW9EYXRhKCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTx2b2lkPihzdWJzY3JpYmVyID0+IHtcclxuICAgICAgICAvLyBObyBwZXJzaXN0ZW50IHJlc3BlY3RpdmVseSBhc3luYyBkZWxldGFibGUgc3RvcmFnZSwgdGhleSBzaG91bGQgYmUgZmluYWxseSByZW1vdmVkIGJ5IHRoZSBHQ1xyXG4gICAgICAgIC8vdGhpcy5fYXVkaW9CdWZmZXI9bnVsbDtcclxuICAgICAgICAvL3RoaXMuX2FycmF5QnVmZmVyPW51bGw7XHJcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XHJcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHNhbXBsZUNvdW50cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5uZWxDb3VudCp0aGlzLl9mcmFtZUxlbjtcclxuICB9XHJcblxyXG4gIHJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtKCk6IFJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtIHtcclxuICAgcmV0dXJuIG5ldyBBcnJheUF1ZGlvQnVmZmVyUmFuZG9tQWNjZXNzU3RyZWFtKHRoaXMpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
|
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
export class ArrayAudioBufferInputStream {
|
|
2
|
-
constructor(arrayAudioBuffer) {
|
|
3
|
-
this.arrayAudioBuffer = arrayAudioBuffer;
|
|
4
|
-
this._framePos = 0;
|
|
5
|
-
this.chunkFramePos = 0;
|
|
6
|
-
this.chunkIdx = 0;
|
|
7
|
-
this.eod = false;
|
|
8
|
-
//console.debug("Array audio input stream array audio buffer frames: "+arrayAudioBuffer.frameLen);
|
|
9
|
-
}
|
|
10
|
-
close() {
|
|
11
|
-
}
|
|
12
|
-
skipFrames(n) {
|
|
13
|
-
let toSkip = n;
|
|
14
|
-
if (this.chunkIdx >= this.arrayAudioBuffer.chunkCount) {
|
|
15
|
-
this.eod = true;
|
|
16
|
-
if (toSkip > 0) {
|
|
17
|
-
throw Error('Skip out of bounds: Cannot skip ' + toSkip + ' frames.');
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
let chunkBuf0 = this.arrayAudioBuffer.data[0][this.chunkIdx];
|
|
22
|
-
let chunkBufsLen = chunkBuf0.length;
|
|
23
|
-
let currBufSkippable = chunkBufsLen - this.chunkFramePos;
|
|
24
|
-
if (n >= currBufSkippable) {
|
|
25
|
-
this._framePos += currBufSkippable;
|
|
26
|
-
toSkip -= currBufSkippable;
|
|
27
|
-
this.chunkIdx++;
|
|
28
|
-
this.chunkFramePos = 0;
|
|
29
|
-
if (this.chunkIdx < this.arrayAudioBuffer.chunkCount) {
|
|
30
|
-
this.skipFrames(toSkip);
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
if (toSkip > 0) {
|
|
34
|
-
throw Error('Skip out of bounds: Cannot skip ' + toSkip + ' frames.');
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
toSkip -= n;
|
|
40
|
-
this.chunkFramePos += n;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
read(buffers) {
|
|
45
|
-
let read = 0;
|
|
46
|
-
let toRead = buffers[0].length;
|
|
47
|
-
while (read < toRead && !this.eod) {
|
|
48
|
-
//console.debug("Chunk "+this.chunkIdx+" of "+this.arrayAudioBuffer.chunkCount+" chunks.")
|
|
49
|
-
if (this.chunkIdx >= this.arrayAudioBuffer.chunkCount) {
|
|
50
|
-
this.eod = true;
|
|
51
|
-
//console.debug("Array audio input stream end of data read frames: "+this.framePos);
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
let chunkBuf0 = this.arrayAudioBuffer.data[0][this.chunkIdx];
|
|
55
|
-
let chunkBufsLen = chunkBuf0.length;
|
|
56
|
-
const chunkBufAvail = chunkBufsLen - this.chunkFramePos;
|
|
57
|
-
let r = chunkBufAvail;
|
|
58
|
-
if (r > toRead - read) {
|
|
59
|
-
r = toRead - read;
|
|
60
|
-
}
|
|
61
|
-
for (let ch = 0; ch < buffers.length; ch++) {
|
|
62
|
-
let chChunkBuf = this.arrayAudioBuffer.data[ch][this.chunkIdx];
|
|
63
|
-
for (let bi = 0; bi < r; bi++) {
|
|
64
|
-
buffers[ch][read + bi] = chChunkBuf[this.chunkFramePos + bi];
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
read += r;
|
|
68
|
-
this.chunkFramePos += r;
|
|
69
|
-
if (this.chunkFramePos >= chunkBufsLen) {
|
|
70
|
-
this.chunkIdx++;
|
|
71
|
-
this.chunkFramePos = 0;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
this._framePos += read;
|
|
76
|
-
//console.debug("Read: "+read+", frame pos: "+this.framePos)
|
|
77
|
-
if (this._framePos > this.arrayAudioBuffer.frameLen) {
|
|
78
|
-
console.error("Array audio input stream frame pos: " + this._framePos + " greater then frame length: " + this.arrayAudioBuffer.frameLen);
|
|
79
|
-
}
|
|
80
|
-
return read;
|
|
81
|
-
}
|
|
82
|
-
get framePos() {
|
|
83
|
-
return this._framePos;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
1
|
+
export class ArrayAudioBufferInputStream {
|
|
2
|
+
constructor(arrayAudioBuffer) {
|
|
3
|
+
this.arrayAudioBuffer = arrayAudioBuffer;
|
|
4
|
+
this._framePos = 0;
|
|
5
|
+
this.chunkFramePos = 0;
|
|
6
|
+
this.chunkIdx = 0;
|
|
7
|
+
this.eod = false;
|
|
8
|
+
//console.debug("Array audio input stream array audio buffer frames: "+arrayAudioBuffer.frameLen);
|
|
9
|
+
}
|
|
10
|
+
close() {
|
|
11
|
+
}
|
|
12
|
+
skipFrames(n) {
|
|
13
|
+
let toSkip = n;
|
|
14
|
+
if (this.chunkIdx >= this.arrayAudioBuffer.chunkCount) {
|
|
15
|
+
this.eod = true;
|
|
16
|
+
if (toSkip > 0) {
|
|
17
|
+
throw Error('Skip out of bounds: Cannot skip ' + toSkip + ' frames.');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
let chunkBuf0 = this.arrayAudioBuffer.data[0][this.chunkIdx];
|
|
22
|
+
let chunkBufsLen = chunkBuf0.length;
|
|
23
|
+
let currBufSkippable = chunkBufsLen - this.chunkFramePos;
|
|
24
|
+
if (n >= currBufSkippable) {
|
|
25
|
+
this._framePos += currBufSkippable;
|
|
26
|
+
toSkip -= currBufSkippable;
|
|
27
|
+
this.chunkIdx++;
|
|
28
|
+
this.chunkFramePos = 0;
|
|
29
|
+
if (this.chunkIdx < this.arrayAudioBuffer.chunkCount) {
|
|
30
|
+
this.skipFrames(toSkip);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
if (toSkip > 0) {
|
|
34
|
+
throw Error('Skip out of bounds: Cannot skip ' + toSkip + ' frames.');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
toSkip -= n;
|
|
40
|
+
this.chunkFramePos += n;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
read(buffers) {
|
|
45
|
+
let read = 0;
|
|
46
|
+
let toRead = buffers[0].length;
|
|
47
|
+
while (read < toRead && !this.eod) {
|
|
48
|
+
//console.debug("Chunk "+this.chunkIdx+" of "+this.arrayAudioBuffer.chunkCount+" chunks.")
|
|
49
|
+
if (this.chunkIdx >= this.arrayAudioBuffer.chunkCount) {
|
|
50
|
+
this.eod = true;
|
|
51
|
+
//console.debug("Array audio input stream end of data read frames: "+this.framePos);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
let chunkBuf0 = this.arrayAudioBuffer.data[0][this.chunkIdx];
|
|
55
|
+
let chunkBufsLen = chunkBuf0.length;
|
|
56
|
+
const chunkBufAvail = chunkBufsLen - this.chunkFramePos;
|
|
57
|
+
let r = chunkBufAvail;
|
|
58
|
+
if (r > toRead - read) {
|
|
59
|
+
r = toRead - read;
|
|
60
|
+
}
|
|
61
|
+
for (let ch = 0; ch < buffers.length; ch++) {
|
|
62
|
+
let chChunkBuf = this.arrayAudioBuffer.data[ch][this.chunkIdx];
|
|
63
|
+
for (let bi = 0; bi < r; bi++) {
|
|
64
|
+
buffers[ch][read + bi] = chChunkBuf[this.chunkFramePos + bi];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
read += r;
|
|
68
|
+
this.chunkFramePos += r;
|
|
69
|
+
if (this.chunkFramePos >= chunkBufsLen) {
|
|
70
|
+
this.chunkIdx++;
|
|
71
|
+
this.chunkFramePos = 0;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
this._framePos += read;
|
|
76
|
+
//console.debug("Read: "+read+", frame pos: "+this.framePos)
|
|
77
|
+
if (this._framePos > this.arrayAudioBuffer.frameLen) {
|
|
78
|
+
console.error("Array audio input stream frame pos: " + this._framePos + " greater then frame length: " + this.arrayAudioBuffer.frameLen);
|
|
79
|
+
}
|
|
80
|
+
return read;
|
|
81
|
+
}
|
|
82
|
+
get framePos() {
|
|
83
|
+
return this._framePos;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
86
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlfYXVkaW9fYnVmZmVyX2lucHV0X3N0cmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9hcnJheV9hdWRpb19idWZmZXJfaW5wdXRfc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTywyQkFBMkI7SUFNdEMsWUFBb0IsZ0JBQWlDO1FBQWpDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFKN0MsY0FBUyxHQUFDLENBQUMsQ0FBQztRQUNaLGtCQUFhLEdBQUMsQ0FBQyxDQUFDO1FBQ2hCLGFBQVEsR0FBQyxDQUFDLENBQUM7UUFDWCxRQUFHLEdBQUMsS0FBSyxDQUFDO1FBRWhCLGtHQUFrRztJQUNwRyxDQUFDO0lBRUQsS0FBSztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsQ0FBUTtRQUNqQixJQUFJLE1BQU0sR0FBQyxDQUFDLENBQUM7UUFDYixJQUFHLElBQUksQ0FBQyxRQUFRLElBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRTtZQUNsRCxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztZQUNoQixJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2QsTUFBTSxLQUFLLENBQUMsa0NBQWtDLEdBQUcsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFBO2FBQ3RFO1NBQ0Y7YUFBSztZQUNKLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdELElBQUksWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDcEMsSUFBSSxnQkFBZ0IsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN6RCxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsRUFBRTtnQkFDekIs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LENBQUMsUUFBUSxDQUFDLENBQUM7U0FDcEk7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFJRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbX0gZnJvbSBcIi4uL2lvL3N0cmVhbVwiO1xyXG5pbXBvcnQge0FycmF5QXVkaW9CdWZmZXJ9IGZyb20gXCIuL2FycmF5X2F1ZGlvX2J1ZmZlclwiO1xyXG5leHBvcnQgY2xhc3MgQXJyYXlBdWRpb0J1ZmZlcklucHV0U3RyZWFtIGltcGxlbWVudHMgRmxvYXQzMkFycmF5SW5wdXRTdHJlYW17XHJcblxyXG4gIHByaXZhdGUgX2ZyYW1lUG9zPTA7XHJcbiAgcHJpdmF0ZSBjaHVua0ZyYW1lUG9zPTA7XHJcbiAgcHJpdmF0ZSBjaHVua0lkeD0wO1xyXG4gIHByaXZhdGUgZW9kPWZhbHNlO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYXJyYXlBdWRpb0J1ZmZlcjpBcnJheUF1ZGlvQnVmZmVyKSB7XHJcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJBcnJheSBhdWRpbyBpbnB1dCBzdHJlYW0gYXJyYXkgYXVkaW8gYnVmZmVyIGZyYW1lczogXCIrYXJyYXlBdWRpb0J1ZmZlci5mcmFtZUxlbik7XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIHNraXBGcmFtZXMobjpudW1iZXIpe1xyXG4gICAgbGV0IHRvU2tpcD1uO1xyXG4gICAgaWYodGhpcy5jaHVua0lkeD49dGhpcy5hcnJheUF1ZGlvQnVmZmVyLmNodW5rQ291bnQpIHtcclxuICAgICAgdGhpcy5lb2QgPSB0cnVlO1xyXG4gICAgICBpZiAodG9Ta2lwID4gMCkge1xyXG4gICAgICAgIHRocm93IEVycm9yKCdTa2lwIG91dCBvZiBib3VuZHM6IENhbm5vdCBza2lwICcgKyB0b1NraXAgKyAnIGZyYW1lcy4nKVxyXG4gICAgICB9XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIGxldCBjaHVua0J1ZjAgPSB0aGlzLmFycmF5QXVkaW9CdWZmZXIuZGF0YVswXVt0aGlzLmNodW5rSWR4XTtcclxuICAgICAgbGV0IGNodW5rQnVmc0xlbiA9IGNodW5rQnVmMC5sZW5ndGg7XHJcbiAgICAgIGxldCBjdXJyQnVmU2tpcHBhYmxlID0gY2h1bmtCdWZzTGVuIC0gdGhpcy5jaHVua0ZyYW1lUG9zO1xyXG4gICAgICBpZiAobiA+PSBjdXJyQnVmU2tpcHBhYmxlKSB7XHJcbiAgICAgICAgdGhpcy5fZnJhbWVQb3MgKz0gY3VyckJ1ZlNraXBwYWJsZTtcclxuICAgICAgICB0b1NraXAgLT0gY3VyckJ1ZlNraXBwYWJsZTtcclxuICAgICAgICB0aGlzLmNodW5rSWR4KytcclxuICAgICAgICB0aGlzLmNodW5rRnJhbWVQb3MgPSAwO1xyXG4gICAgICAgIGlmICh0aGlzLmNodW5rSWR4IDwgdGhpcy5hcnJheUF1ZGlvQnVmZmVyLmNodW5rQ291bnQpIHtcclxuICAgICAgICAgIHRoaXMuc2tpcEZyYW1lcyh0b1NraXApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAodG9Ta2lwID4gMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcignU2tpcCBvdXQgb2YgYm91bmRzOiBDYW5ub3Qgc2tpcCAnICsgdG9Ta2lwICsgJyBmcmFtZXMuJylcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdG9Ta2lwIC09IG47XHJcbiAgICAgICAgdGhpcy5jaHVua0ZyYW1lUG9zICs9IG47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlYWQoYnVmZmVyczogQXJyYXk8RmxvYXQzMkFycmF5Pik6IG51bWJlciB7XHJcbiAgICBsZXQgcmVhZD0wO1xyXG5cclxuICAgIGxldCB0b1JlYWQ9YnVmZmVyc1swXS5sZW5ndGg7XHJcblxyXG4gICAgICB3aGlsZShyZWFkPHRvUmVhZCAmJiAhdGhpcy5lb2Qpe1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkNodW5rIFwiK3RoaXMuY2h1bmtJZHgrXCIgb2YgXCIrdGhpcy5hcnJheUF1ZGlvQnVmZmVyLmNodW5rQ291bnQrXCIgY2h1bmtzLlwiKVxyXG4gICAgICAgIGlmKHRoaXMuY2h1bmtJZHg+PXRoaXMuYXJyYXlBdWRpb0J1ZmZlci5jaHVua0NvdW50KSB7XHJcbiAgICAgICAgICB0aGlzLmVvZCA9IHRydWU7XHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJBcnJheSBhdWRpbyBpbnB1dCBzdHJlYW0gZW5kIG9mIGRhdGEgcmVhZCBmcmFtZXM6IFwiK3RoaXMuZnJhbWVQb3MpO1xyXG4gICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgIGxldCBjaHVua0J1ZjAgPSB0aGlzLmFycmF5QXVkaW9CdWZmZXIuZGF0YVswXVt0aGlzLmNodW5rSWR4XTtcclxuICAgICAgICAgIGxldCBjaHVua0J1ZnNMZW4gPSBjaHVua0J1ZjAubGVuZ3RoO1xyXG4gICAgICAgICAgY29uc3QgY2h1bmtCdWZBdmFpbCA9IGNodW5rQnVmc0xlbiAtIHRoaXMuY2h1bmtGcmFtZVBvcztcclxuICAgICAgICAgIGxldCByID0gY2h1bmtCdWZBdmFpbDtcclxuICAgICAgICAgIGlmIChyID4gdG9SZWFkIC0gcmVhZCkge1xyXG4gICAgICAgICAgICByID0gdG9SZWFkIC0gcmVhZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBidWZmZXJzLmxlbmd0aDsgY2grKykge1xyXG4gICAgICAgICAgICBsZXQgY2hDaHVua0J1Zj10aGlzLmFycmF5QXVkaW9CdWZmZXIuZGF0YVtjaF1bdGhpcy5jaHVua0lkeF07XHJcbiAgICAgICAgICAgIGZvciAobGV0IGJpID0gMDsgYmkgPCByOyBiaSsrKSB7XHJcbiAgICAgICAgICAgICAgYnVmZmVyc1tjaF1bcmVhZCArIGJpXSA9IGNoQ2h1bmtCdWZbdGhpcy5jaHVua0ZyYW1lUG9zICsgYmldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZWFkICs9IHI7XHJcblxyXG4gICAgICAgICAgdGhpcy5jaHVua0ZyYW1lUG9zICs9IHI7XHJcbiAgICAgICAgICBpZiAodGhpcy5jaHVua0ZyYW1lUG9zID49IGNodW5rQnVmc0xlbikge1xyXG4gICAgICAgICAgICB0aGlzLmNodW5rSWR4Kys7XHJcbiAgICAgICAgICAgIHRoaXMuY2h1bmtGcmFtZVBvcyA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB0aGlzLl9mcmFtZVBvcys9cmVhZDtcclxuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiUmVhZDogXCIrcmVhZCtcIiwgZnJhbWUgcG9zOiBcIit0aGlzLmZyYW1lUG9zKVxyXG4gICAgaWYodGhpcy5fZnJhbWVQb3M+dGhpcy5hcnJheUF1ZGlvQnVmZmVyLmZyYW1lTGVuKXtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkFycmF5IGF1ZGlvIGlucHV0IHN0cmVhbSBmcmFtZSBwb3M6IFwiK3RoaXMuX2ZyYW1lUG9zK1wiIGdyZWF0ZXIgdGhlbiBmcmFtZSBsZW5ndGg6IFwiK3RoaXMuYXJyYXlBdWRpb0J1ZmZlci5mcmFtZUxlbik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVhZDtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgZ2V0IGZyYW1lUG9zKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZnJhbWVQb3M7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
|