speechrecorderng 3.10.13 → 3.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/fesm2022/speechrecorderng.mjs +204 -201
- package/fesm2022/speechrecorderng.mjs.map +1 -1
- package/lib/audio/ui/audio_canvas_layer_comp.d.ts +2 -2
- package/lib/spr.module.version.d.ts +1 -1
- package/lib/ui/canvas_layer_comp.d.ts +1 -1
- package/lib/ui/responsive_component.d.ts +1 -1
- package/package.json +13 -15
- package/esm2022/lib/action/action.mjs +0 -73
- package/esm2022/lib/audio/array_audio_buffer.mjs +0 -164
- package/esm2022/lib/audio/array_audio_buffer_input_stream.mjs +0 -86
- package/esm2022/lib/audio/array_audio_buffer_random_access_stream.mjs +0 -16
- package/esm2022/lib/audio/audio_data_holder.mjs +0 -264
- package/esm2022/lib/audio/audio_display.mjs +0 -118
- package/esm2022/lib/audio/audio_player.mjs +0 -238
- package/esm2022/lib/audio/capture/capture.mjs +0 -855
- package/esm2022/lib/audio/context.mjs +0 -79
- package/esm2022/lib/audio/dsp/level_measure.mjs +0 -517
- package/esm2022/lib/audio/format.mjs +0 -20
- package/esm2022/lib/audio/impl/wavformat.mjs +0 -7
- package/esm2022/lib/audio/impl/wavreader.mjs +0 -144
- package/esm2022/lib/audio/impl/wavwriter.mjs +0 -191
- package/esm2022/lib/audio/inddb_audio_buffer.mjs +0 -508
- package/esm2022/lib/audio/io/stream.mjs +0 -59
- package/esm2022/lib/audio/net_audio_buffer.mjs +0 -293
- package/esm2022/lib/audio/persistor.mjs +0 -81
- package/esm2022/lib/audio/playback/array_audio_buffer_source_node.mjs +0 -126
- package/esm2022/lib/audio/playback/audio_source_node.mjs +0 -18
- package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
- package/esm2022/lib/audio/playback/inddb_audio_buffer_source_node.mjs +0 -167
- package/esm2022/lib/audio/playback/net_audio_buffer_source_node.mjs +0 -218
- package/esm2022/lib/audio/playback/player.mjs +0 -402
- package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
- package/esm2022/lib/audio/ui/audio_display_control.mjs +0 -150
- package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +0 -146
- package/esm2022/lib/audio/ui/audiosignal.mjs +0 -533
- package/esm2022/lib/audio/ui/common.mjs +0 -19
- package/esm2022/lib/audio/ui/container.mjs +0 -414
- package/esm2022/lib/audio/ui/livelevel.mjs +0 -361
- package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
- package/esm2022/lib/audio/ui/sonagram.mjs +0 -900
- package/esm2022/lib/db/inddb.mjs +0 -120
- package/esm2022/lib/dsp/utils.mjs +0 -48
- package/esm2022/lib/environment/environment.defaults.mjs +0 -9
- package/esm2022/lib/io/BinaryReader.mjs +0 -93
- package/esm2022/lib/io/BinaryWriter.mjs +0 -80
- package/esm2022/lib/io/stream.mjs +0 -259
- package/esm2022/lib/math/2d/geometry.mjs +0 -28
- package/esm2022/lib/math/complex.mjs +0 -58
- package/esm2022/lib/math/dft.mjs +0 -196
- package/esm2022/lib/media/utils.mjs +0 -14
- package/esm2022/lib/net/uploader.mjs +0 -367
- package/esm2022/lib/recorder_component.mjs +0 -65
- package/esm2022/lib/speechrecorder/project/project.mjs +0 -54
- package/esm2022/lib/speechrecorder/project/project.service.mjs +0 -64
- package/esm2022/lib/speechrecorder/recording.mjs +0 -124
- package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -221
- package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
- package/esm2022/lib/speechrecorder/script/script.mjs +0 -114
- package/esm2022/lib/speechrecorder/script/script.service.mjs +0 -47
- package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
- package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +0 -676
- package/esm2022/lib/speechrecorder/session/controlpanel.mjs +0 -416
- package/esm2022/lib/speechrecorder/session/item.mjs +0 -30
- package/esm2022/lib/speechrecorder/session/progress.mjs +0 -135
- package/esm2022/lib/speechrecorder/session/prompting.mjs +0 -639
- package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +0 -88
- package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
- package/esm2022/lib/speechrecorder/session/recording_list.mjs +0 -188
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +0 -128
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +0 -114
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +0 -146
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +0 -424
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file.mjs +0 -68
- package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
- package/esm2022/lib/speechrecorder/session/session.mjs +0 -2
- package/esm2022/lib/speechrecorder/session/session.service.mjs +0 -69
- package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +0 -46
- package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +0 -1385
- package/esm2022/lib/speechrecorder/session/warning_bar.mjs +0 -33
- package/esm2022/lib/speechrecorder/spruploader.mjs +0 -22
- package/esm2022/lib/speechrecorder/startstopsignal/startstopsignal.mjs +0 -2
- package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
- package/esm2022/lib/speechrecorderng.component.mjs +0 -392
- package/esm2022/lib/speechrecorderng.module.mjs +0 -97
- package/esm2022/lib/spr.config.mjs +0 -27
- package/esm2022/lib/spr.module.version.mjs +0 -2
- package/esm2022/lib/ui/canvas_layer_comp.mjs +0 -38
- package/esm2022/lib/ui/intersection-observer.directive.mjs +0 -32
- package/esm2022/lib/ui/message_dialog.mjs +0 -51
- package/esm2022/lib/ui/recordingitem_display.mjs +0 -253
- package/esm2022/lib/ui/responsive_component.mjs +0 -24
- package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +0 -23
- package/esm2022/lib/utils/ua-parser.mjs +0 -190
- package/esm2022/lib/utils/utils.mjs +0 -132
- package/esm2022/lib/utils/wake_lock.mjs +0 -114
- package/esm2022/lib/utils/wake_lock_media.mjs +0 -2
- package/esm2022/public-api.mjs +0 -35
- package/esm2022/speechrecorderng.mjs +0 -5
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
import { CanvasLayerComponent } from "../../ui/canvas_layer_comp";
|
|
2
|
-
import { Selection } from '../persistor';
|
|
3
|
-
import { EventEmitter, HostListener, Input, Output, ViewChild, Directive } from "@angular/core";
|
|
4
|
-
import { Marker } from "./common";
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export class ViewSelection {
|
|
7
|
-
get startX() {
|
|
8
|
-
return this._startX;
|
|
9
|
-
}
|
|
10
|
-
get endX() {
|
|
11
|
-
return this._endX;
|
|
12
|
-
}
|
|
13
|
-
width() {
|
|
14
|
-
return this._endX - this._startX;
|
|
15
|
-
}
|
|
16
|
-
constructor(_startX, _endX) {
|
|
17
|
-
this._startX = _startX;
|
|
18
|
-
this._endX = _endX;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
export class BasicAudioCanvasLayerComponent extends CanvasLayerComponent {
|
|
22
|
-
constructor() {
|
|
23
|
-
super(...arguments);
|
|
24
|
-
this._audioDataHolder = null;
|
|
25
|
-
this._bgColor = 'white';
|
|
26
|
-
this._selectColor = 'rgba(0%,0%,100%,25%)';
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Returns pixel position depending on current zoom setting.
|
|
30
|
-
* @param framePos audio frame (sample) position
|
|
31
|
-
*/
|
|
32
|
-
frameToXPixelPosition(framePos) {
|
|
33
|
-
let pixelPos = null;
|
|
34
|
-
let frameLength = this._audioDataHolder?.frameLen;
|
|
35
|
-
if (frameLength !== undefined) {
|
|
36
|
-
let vw;
|
|
37
|
-
if (this.bounds) {
|
|
38
|
-
vw = this.bounds.dimension.width;
|
|
39
|
-
}
|
|
40
|
-
if (this.virtualDimension) {
|
|
41
|
-
vw = this.virtualDimension.width;
|
|
42
|
-
}
|
|
43
|
-
if (vw !== undefined) {
|
|
44
|
-
pixelPos = framePos * vw / frameLength;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return pixelPos;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Returns pixel position in view port (visible window of scroll pane).
|
|
51
|
-
* @param framePos audio frame (sample) position
|
|
52
|
-
*/
|
|
53
|
-
frameToViewPortXPixelPosition(framePos) {
|
|
54
|
-
let pixelPos = this.frameToXPixelPosition(framePos);
|
|
55
|
-
if (pixelPos != null) {
|
|
56
|
-
return this.toXViewPortPixelPosition(pixelPos);
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
viewPortXPixelToFramePosition(xViewPortPixelPos) {
|
|
63
|
-
let vpXframePos = null;
|
|
64
|
-
const frameLength = this._audioDataHolder?.frameLen;
|
|
65
|
-
if (frameLength !== undefined) {
|
|
66
|
-
let vw = undefined;
|
|
67
|
-
if (this.bounds) {
|
|
68
|
-
vw = this.bounds.dimension.width;
|
|
69
|
-
}
|
|
70
|
-
if (this.virtualDimension) {
|
|
71
|
-
vw = this.virtualDimension.width;
|
|
72
|
-
}
|
|
73
|
-
if (vw !== undefined) {
|
|
74
|
-
const xVirtualPixelPos = this.toXVirtualPixelPosition(xViewPortPixelPos);
|
|
75
|
-
const framesPerPixel = frameLength / vw;
|
|
76
|
-
let framePos = framesPerPixel * xVirtualPixelPos;
|
|
77
|
-
if (framePos < 0) {
|
|
78
|
-
framePos = 0;
|
|
79
|
-
}
|
|
80
|
-
if (framePos >= frameLength) {
|
|
81
|
-
framePos = frameLength - 1;
|
|
82
|
-
}
|
|
83
|
-
vpXframePos = Math.round(framePos);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return vpXframePos;
|
|
87
|
-
}
|
|
88
|
-
layoutBounds(bounds, virtualDimension, redraw) {
|
|
89
|
-
this.bounds = bounds;
|
|
90
|
-
this.virtualDimension = virtualDimension;
|
|
91
|
-
for (let ci = 0; ci < this.canvasLayers.length; ci++) {
|
|
92
|
-
const cl = this.canvasLayers[ci];
|
|
93
|
-
const leftStyle = bounds.position.left + 'px';
|
|
94
|
-
if (cl.style.left != leftStyle) {
|
|
95
|
-
cl.style.left = leftStyle;
|
|
96
|
-
}
|
|
97
|
-
const topStyle = bounds.position.top + 'px';
|
|
98
|
-
if (cl.style.top != topStyle) {
|
|
99
|
-
cl.style.top = topStyle;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
if (bounds.dimension.width) {
|
|
103
|
-
const intW = Math.floor(bounds.dimension.width);
|
|
104
|
-
if (redraw) {
|
|
105
|
-
// Do not set width of background canvas (causes flicker on start render)
|
|
106
|
-
for (let ci = 1; ci < this.canvasLayers.length; ci++) {
|
|
107
|
-
let cl = this.canvasLayers[ci];
|
|
108
|
-
if (cl.width != intW) {
|
|
109
|
-
cl.width = intW;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
const wStr = intW.toString() + 'px';
|
|
114
|
-
for (let ci = 0; ci < this.canvasLayers.length; ci++) {
|
|
115
|
-
let cl = this.canvasLayers[ci];
|
|
116
|
-
if (cl.style.width != wStr) {
|
|
117
|
-
cl.style.width = wStr;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
if (bounds.dimension.height) {
|
|
122
|
-
const intH = Math.floor(bounds.dimension.height);
|
|
123
|
-
if (redraw) {
|
|
124
|
-
// Do not set height of background canvas (causes flicker on start render)
|
|
125
|
-
for (let ci = 1; ci < this.canvasLayers.length; ci++) {
|
|
126
|
-
let cl = this.canvasLayers[ci];
|
|
127
|
-
if (cl.height != intH) {
|
|
128
|
-
cl.height = intH;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
const hStr = intH + 'px';
|
|
133
|
-
for (let ci = 0; ci < this.canvasLayers.length; ci++) {
|
|
134
|
-
let cl = this.canvasLayers[ci];
|
|
135
|
-
if (cl.style.height != hStr) {
|
|
136
|
-
cl.style.height = hStr;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: BasicAudioCanvasLayerComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
|
|
142
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: BasicAudioCanvasLayerComponent, usesInheritance: true, ngImport: i0 }); }
|
|
143
|
-
}
|
|
144
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: BasicAudioCanvasLayerComponent, decorators: [{
|
|
145
|
-
type: Directive
|
|
146
|
-
}] });
|
|
147
|
-
export class AudioCanvasLayerComponent extends BasicAudioCanvasLayerComponent {
|
|
148
|
-
constructor() {
|
|
149
|
-
super(...arguments);
|
|
150
|
-
this._pointerPosition = null;
|
|
151
|
-
this.selectStartX = null;
|
|
152
|
-
this._selecting = null;
|
|
153
|
-
this._selection = null;
|
|
154
|
-
this.pointerPositionEventEmitter = new EventEmitter();
|
|
155
|
-
this.selectingEventEmitter = new EventEmitter();
|
|
156
|
-
this.selectedEventEmitter = new EventEmitter();
|
|
157
|
-
}
|
|
158
|
-
static { this.ENABLE_STREAMING_NUMBER_OF_SAMPLES_THRESHOLD = 10 * 60 * 48000; } // Use streaming/chunking if audio clip has more than this number of samples
|
|
159
|
-
onMouseup(me) {
|
|
160
|
-
this.selectionCommit(me);
|
|
161
|
-
}
|
|
162
|
-
layoutBounds(bounds, virtualDimension, redraw, clear = true) {
|
|
163
|
-
super.layoutBounds(bounds, virtualDimension, redraw);
|
|
164
|
-
if (redraw) {
|
|
165
|
-
this.startDraw(clear);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
set pointerPosition(pointerPosition) {
|
|
169
|
-
this._pointerPosition = pointerPosition;
|
|
170
|
-
this.drawCursorLayer();
|
|
171
|
-
}
|
|
172
|
-
set selecting(selecting) {
|
|
173
|
-
this._selecting = selecting;
|
|
174
|
-
this.drawBg();
|
|
175
|
-
this.drawCursorLayer();
|
|
176
|
-
}
|
|
177
|
-
get selecting() {
|
|
178
|
-
return this._selecting;
|
|
179
|
-
}
|
|
180
|
-
set selection(selection) {
|
|
181
|
-
this._selection = selection;
|
|
182
|
-
this.selecting = null;
|
|
183
|
-
this.drawBg();
|
|
184
|
-
this.drawCursorLayer();
|
|
185
|
-
}
|
|
186
|
-
get selection() {
|
|
187
|
-
return this._selection;
|
|
188
|
-
}
|
|
189
|
-
selectionStart(me) {
|
|
190
|
-
this.selectStartX = me.offsetX;
|
|
191
|
-
}
|
|
192
|
-
selectionCommit(me) {
|
|
193
|
-
let vs = null;
|
|
194
|
-
if (this.selectStartX != null) {
|
|
195
|
-
vs = new ViewSelection(this.selectStartX, me.offsetX);
|
|
196
|
-
this.selectStartX = null;
|
|
197
|
-
this.select(vs);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
updateCursorCanvas(me, showCursorPosition = true) {
|
|
201
|
-
if (this.cursorCanvas) {
|
|
202
|
-
if (me) {
|
|
203
|
-
if (this.selectStartX) {
|
|
204
|
-
this.pointerPositionChanged(null);
|
|
205
|
-
this.selectingChange(new ViewSelection(this.selectStartX, me.offsetX));
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
if (showCursorPosition) {
|
|
209
|
-
this.pointerPositionChanged(me.offsetX);
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
this.pointerPositionChanged(null);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
pointerPositionChanged(xPosition) {
|
|
219
|
-
let pointerPosition = undefined;
|
|
220
|
-
if (xPosition) {
|
|
221
|
-
pointerPosition = new Marker();
|
|
222
|
-
let vpXPos = this.viewPortXPixelToFramePosition(xPosition);
|
|
223
|
-
if (vpXPos != null) {
|
|
224
|
-
pointerPosition.framePosition = vpXPos;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
this.pointerPositionEventEmitter.emit(pointerPosition);
|
|
228
|
-
}
|
|
229
|
-
_selectingChange(viewSel) {
|
|
230
|
-
let ns = undefined;
|
|
231
|
-
if (viewSel) {
|
|
232
|
-
let frameStart = this.viewPortXPixelToFramePosition(viewSel.startX);
|
|
233
|
-
let frameEnd = this.viewPortXPixelToFramePosition(viewSel.endX);
|
|
234
|
-
if (this._audioDataHolder && frameStart != null && frameEnd != null) {
|
|
235
|
-
ns = new Selection(this._audioDataHolder.sampleRate, frameStart, frameEnd);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
return ns;
|
|
239
|
-
}
|
|
240
|
-
selectingChange(viewSel) {
|
|
241
|
-
const ns = this._selectingChange(viewSel);
|
|
242
|
-
this.selectingEventEmitter.emit(ns);
|
|
243
|
-
}
|
|
244
|
-
select(viewSel) {
|
|
245
|
-
const ns = this._selectingChange(viewSel);
|
|
246
|
-
this.selectedEventEmitter.emit(ns);
|
|
247
|
-
}
|
|
248
|
-
viewSelection() {
|
|
249
|
-
let vs = null;
|
|
250
|
-
let s = null;
|
|
251
|
-
if (this._selecting) {
|
|
252
|
-
s = this._selecting;
|
|
253
|
-
}
|
|
254
|
-
else if (this._selection) {
|
|
255
|
-
s = this._selection;
|
|
256
|
-
}
|
|
257
|
-
if (s) {
|
|
258
|
-
const sf = s.startFrame;
|
|
259
|
-
const ef = s.endFrame;
|
|
260
|
-
const xs = this.frameToViewPortXPixelPosition(sf);
|
|
261
|
-
const xe = this.frameToViewPortXPixelPosition(ef);
|
|
262
|
-
if (xs != null && xe != null) {
|
|
263
|
-
vs = new ViewSelection(xs, xe);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
return vs;
|
|
267
|
-
}
|
|
268
|
-
drawBg() {
|
|
269
|
-
if (this.bgCanvas && this.bounds) {
|
|
270
|
-
this.bgCanvas.style.left = Math.round(this.bounds.position.left).toString() + 'px';
|
|
271
|
-
this.bgCanvas.width = Math.round(this.bounds.dimension.width);
|
|
272
|
-
this.bgCanvas.height = Math.round(this.bounds.dimension.height);
|
|
273
|
-
let g1 = this.bgCanvas.getContext("2d");
|
|
274
|
-
if (g1) {
|
|
275
|
-
const w = this.bgCanvas.width;
|
|
276
|
-
const h = this.bgCanvas.height;
|
|
277
|
-
g1.clearRect(0, 0, w, h);
|
|
278
|
-
if (this._bgColor) {
|
|
279
|
-
g1.fillStyle = this._bgColor;
|
|
280
|
-
g1.fillRect(0, 0, w, h);
|
|
281
|
-
}
|
|
282
|
-
let vs = this.viewSelection();
|
|
283
|
-
if (vs) {
|
|
284
|
-
g1.fillStyle = this._selectColor;
|
|
285
|
-
g1.fillRect(vs.startX, 0, vs.width(), h);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
drawCursorLayer() {
|
|
291
|
-
if (this.cursorCanvas) {
|
|
292
|
-
const w = this.cursorCanvas.width;
|
|
293
|
-
const h = this.cursorCanvas.height;
|
|
294
|
-
const g = this.cursorCanvas.getContext("2d");
|
|
295
|
-
if (g) {
|
|
296
|
-
g.clearRect(0, 0, w, h);
|
|
297
|
-
if (this._pointerPosition) {
|
|
298
|
-
let framePos = this._pointerPosition.framePosition;
|
|
299
|
-
if (framePos) {
|
|
300
|
-
let xViewPortPixelpos = this.frameToViewPortXPixelPosition(framePos);
|
|
301
|
-
if (xViewPortPixelpos) {
|
|
302
|
-
g.fillStyle = 'yellow';
|
|
303
|
-
g.strokeStyle = 'yellow';
|
|
304
|
-
g.beginPath();
|
|
305
|
-
g.moveTo(xViewPortPixelpos, 0);
|
|
306
|
-
g.lineTo(xViewPortPixelpos, h);
|
|
307
|
-
g.closePath();
|
|
308
|
-
g.stroke();
|
|
309
|
-
if (this._audioDataHolder) {
|
|
310
|
-
g.font = '14px sans-serif';
|
|
311
|
-
g.fillStyle = 'yellow';
|
|
312
|
-
g.fillText(framePos.toString(), xViewPortPixelpos + 2, 50);
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AudioCanvasLayerComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
|
|
321
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: AudioCanvasLayerComponent, inputs: { pointerPosition: "pointerPosition", selecting: "selecting", selection: "selection" }, outputs: { pointerPositionEventEmitter: "pointerPositionEventEmitter", selectingEventEmitter: "selectingEventEmitter", selectedEventEmitter: "selectedEventEmitter" }, host: { listeners: { "document:mouseup": "onMouseup($event)" } }, viewQueries: [{ propertyName: "bgCanvasRef", first: true, predicate: ["bg"], descendants: true, static: true }, { propertyName: "cursorCanvasRef", first: true, predicate: ["cursor"], descendants: true, static: true }], usesInheritance: true, ngImport: i0 }); }
|
|
322
|
-
}
|
|
323
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AudioCanvasLayerComponent, decorators: [{
|
|
324
|
-
type: Directive
|
|
325
|
-
}], propDecorators: { bgCanvasRef: [{
|
|
326
|
-
type: ViewChild,
|
|
327
|
-
args: ['bg', { static: true }]
|
|
328
|
-
}], cursorCanvasRef: [{
|
|
329
|
-
type: ViewChild,
|
|
330
|
-
args: ['cursor', { static: true }]
|
|
331
|
-
}], onMouseup: [{
|
|
332
|
-
type: HostListener,
|
|
333
|
-
args: ['document:mouseup', ['$event']]
|
|
334
|
-
}], pointerPosition: [{
|
|
335
|
-
type: Input
|
|
336
|
-
}], selecting: [{
|
|
337
|
-
type: Input
|
|
338
|
-
}], selection: [{
|
|
339
|
-
type: Input
|
|
340
|
-
}], pointerPositionEventEmitter: [{
|
|
341
|
-
type: Output
|
|
342
|
-
}], selectingEventEmitter: [{
|
|
343
|
-
type: Output
|
|
344
|
-
}], selectedEventEmitter: [{
|
|
345
|
-
type: Output
|
|
346
|
-
}] } });
|
|
347
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9fY2FudmFzX2xheWVyX2NvbXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvYXVkaW8vdWkvYXVkaW9fY2FudmFzX2xheWVyX2NvbXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUN0QyxPQUFPLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQzs7QUFLaEMsTUFBTSxPQUFPLGFBQWE7SUFDeEIsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELEtBQUs7UUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLEdBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUNoQyxDQUFDO0lBRUQsWUFBb0IsT0FBYyxFQUFVLEtBQVk7UUFBcEMsWUFBTyxHQUFQLE9BQU8sQ0FBTztRQUFVLFVBQUssR0FBTCxLQUFLLENBQU87SUFBRSxDQUFDO0NBQzVEO0FBR0QsTUFBTSxPQUFnQiw4QkFBK0IsU0FBUSxvQkFBb0I7SUFEakY7O1FBRVkscUJBQWdCLEdBQXVCLElBQUksQ0FBQztRQUM1QyxhQUFRLEdBQWEsT0FBTyxDQUFDO1FBQzdCLGlCQUFZLEdBQUMsc0JBQXNCLENBQUM7S0FzSC9DO0lBcEhDOzs7T0FHRztJQUNILHFCQUFxQixDQUFDLFFBQWdCO1FBQ3BDLElBQUksUUFBUSxHQUFDLElBQUks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QUEyQjtzQkFBcEMsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDYW52YXNMYXllckNvbXBvbmVudH0gZnJvbSBcIi4uLy4uL3VpL2NhbnZhc19sYXllcl9jb21wXCI7XHJcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tICcuLi9wZXJzaXN0b3InXHJcbmltcG9ydCB7IEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIERpcmVjdGl2ZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7TWFya2VyfSBmcm9tIFwiLi9jb21tb25cIjtcclxuaW1wb3J0IHtEaW1lbnNpb24sIFJlY3RhbmdsZX0gZnJvbSBcIi4uLy4uL21hdGgvMmQvZ2VvbWV0cnlcIjtcclxuaW1wb3J0IHtBdWRpb0RhdGFIb2xkZXJ9IGZyb20gXCIuLi9hdWRpb19kYXRhX2hvbGRlclwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBWaWV3U2VsZWN0aW9ue1xyXG4gIGdldCBzdGFydFgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9zdGFydFg7XHJcbiAgfVxyXG5cclxuICBnZXQgZW5kWCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZFg7XHJcbiAgfVxyXG5cclxuICB3aWR0aCgpOm51bWJlcntcclxuICAgIHJldHVybiB0aGlzLl9lbmRYLXRoaXMuX3N0YXJ0WFxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc3RhcnRYOm51bWJlciwgcHJpdmF0ZSBfZW5kWDpudW1iZXIpe31cclxufVxyXG5cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNpY0F1ZGlvQ2FudmFzTGF5ZXJDb21wb25lbnQgZXh0ZW5kcyBDYW52YXNMYXllckNvbXBvbmVudCB7XHJcbiAgcHJvdGVjdGVkIF9hdWRpb0RhdGFIb2xkZXI6QXVkaW9EYXRhSG9sZGVyfCBudWxsPW51bGw7XHJcbiAgcHJvdGVjdGVkIF9iZ0NvbG9yOnN0cmluZ3xudWxsPSd3aGl0ZSc7XHJcbiAgcHJvdGVjdGVkIF9zZWxlY3RDb2xvcj0ncmdiYSgwJSwwJSwxMDAlLDI1JSknO1xyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHBpeGVsIHBvc2l0aW9uIGRlcGVuZGluZyBvbiBjdXJyZW50IHpvb20gc2V0dGluZy5cclxuICAgKiBAcGFyYW0gZnJhbWVQb3MgYXVkaW8gZnJhbWUgKHNhbXBsZSkgcG9zaXRpb25cclxuICAgKi9cclxuICBmcmFtZVRvWFBpeGVsUG9zaXRpb24oZnJhbWVQb3M6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xyXG4gICAgbGV0IHBpeGVsUG9zPW51bGw7XHJcbiAgICBsZXQgZnJhbWVMZW5ndGggPSB0aGlzLl9hdWRpb0RhdGFIb2xkZXI/LmZyYW1lTGVuO1xyXG5cclxuICAgIGlmKGZyYW1lTGVuZ3RoIT09dW5kZWZpbmVkKSB7XHJcbiAgICAgIGxldCB2dztcclxuICAgICAgaWYgKHRoaXMuYm91bmRzKSB7XHJcbiAgICAgICAgdncgPSB0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGg7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMudmlydHVhbERpbWVuc2lvbikge1xyXG4gICAgICAgIHZ3ID0gdGhpcy52aXJ0dWFsRGltZW5zaW9uLndpZHRoO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh2dyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcGl4ZWxQb3MgPSBmcmFtZVBvcyAqIHZ3IC8gZnJhbWVMZW5ndGg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBwaXhlbFBvcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgcGl4ZWwgcG9zaXRpb24gaW4gdmlldyBwb3J0ICh2aXNpYmxlIHdpbmRvdyBvZiBzY3JvbGwgcGFuZSkuXHJcbiAgICogQHBhcmFtIGZyYW1lUG9zIGF1ZGlvIGZyYW1lIChzYW1wbGUpIHBvc2l0aW9uXHJcbiAgICovXHJcbiAgZnJhbWVUb1ZpZXdQb3J0WFBpeGVsUG9zaXRpb24oZnJhbWVQb3M6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xyXG4gICAgbGV0IHBpeGVsUG9zPXRoaXMuZnJhbWVUb1hQaXhlbFBvc2l0aW9uKGZyYW1lUG9zKTtcclxuICAgIGlmKHBpeGVsUG9zIT1udWxsKXtcclxuICAgICAgcmV0dXJuIHRoaXMudG9YVmlld1BvcnRQaXhlbFBvc2l0aW9uKHBpeGVsUG9zKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmlld1BvcnRYUGl4ZWxUb0ZyYW1lUG9zaXRpb24oeFZpZXdQb3J0UGl4ZWxQb3M6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xyXG4gICAgbGV0IHZwWGZyYW1lUG9zPW51bGw7XHJcbiAgICBjb25zdCBmcmFtZUxlbmd0aCA9IHRoaXMuX2F1ZGlvRGF0YUhvbGRlcj8uZnJhbWVMZW47XHJcbiAgICBpZihmcmFtZUxlbmd0aCE9PXVuZGVmaW5lZCkge1xyXG4gICAgICBsZXQgdnc6bnVtYmVyfHVuZGVmaW5lZD11bmRlZmluZWQ7XHJcbiAgICAgIGlmICh0aGlzLmJvdW5kcykge1xyXG4gICAgICAgIHZ3PSB0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGg7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMudmlydHVhbERpbWVuc2lvbikge1xyXG4gICAgICAgIHZ3ID0gdGhpcy52aXJ0dWFsRGltZW5zaW9uLndpZHRoO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHZ3IT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnN0IHhWaXJ0dWFsUGl4ZWxQb3MgPSB0aGlzLnRvWFZpcnR1YWxQaXhlbFBvc2l0aW9uKHhWaWV3UG9ydFBpeGVsUG9zKVxyXG4gICAgICAgIGNvbnN0IGZyYW1lc1BlclBpeGVsID0gZnJhbWVMZW5ndGggLyB2dztcclxuICAgICAgICBsZXQgZnJhbWVQb3MgPSBmcmFtZXNQZXJQaXhlbCAqIHhWaXJ0dWFsUGl4ZWxQb3M7XHJcbiAgICAgICAgaWYgKGZyYW1lUG9zIDwgMCkge1xyXG4gICAgICAgICAgZnJhbWVQb3MgPSAwXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmcmFtZVBvcyA+PSBmcmFtZUxlbmd0aCkge1xyXG4gICAgICAgICAgZnJhbWVQb3MgPSBmcmFtZUxlbmd0aCAtIDFcclxuICAgICAgICB9XHJcbiAgICAgICAgdnBYZnJhbWVQb3MgPSBNYXRoLnJvdW5kKGZyYW1lUG9zKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZwWGZyYW1lUG9zO1xyXG4gIH1cclxuXHJcbiAgICBsYXlvdXRCb3VuZHMoYm91bmRzOlJlY3RhbmdsZSwgdmlydHVhbERpbWVuc2lvbjpEaW1lbnNpb24scmVkcmF3OiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5ib3VuZHM9Ym91bmRzO1xyXG4gICAgICAgIHRoaXMudmlydHVhbERpbWVuc2lvbj12aXJ0dWFsRGltZW5zaW9uO1xyXG4gICAgICAgIGZvcihsZXQgY2k9MDtjaTx0aGlzLmNhbnZhc0xheWVycy5sZW5ndGg7Y2krKykge1xyXG4gICAgICAgICAgICBjb25zdCBjbCA9IHRoaXMuY2FudmFzTGF5ZXJzW2NpXTtcclxuICAgICAgICAgICAgY29uc3QgbGVmdFN0eWxlPWJvdW5kcy5wb3NpdGlvbi5sZWZ0KyAncHgnO1xyXG4gICAgICAgICAgICBpZihjbC5zdHlsZS5sZWZ0IT1sZWZ0U3R5bGUpIHtcclxuICAgICAgICAgICAgICBjbC5zdHlsZS5sZWZ0ID0gbGVmdFN0eWxlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHRvcFN0eWxlPWJvdW5kcy5wb3NpdGlvbi50b3AgKyAncHgnO1xyXG4gICAgICAgICAgICBpZihjbC5zdHlsZS50b3AhPXRvcFN0eWxlKSB7XHJcbiAgICAgICAgICAgICAgY2wuc3R5bGUudG9wID0gdG9wU3R5bGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJvdW5kcy5kaW1lbnNpb24ud2lkdGgpIHtcclxuICAgICAgICAgICAgY29uc3QgaW50Vz1NYXRoLmZsb29yKGJvdW5kcy5kaW1lbnNpb24ud2lkdGgpO1xyXG4gICAgICAgICAgICBpZiAocmVkcmF3KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEbyBub3Qgc2V0IHdpZHRoIG9mIGJhY2tncm91bmQgY2FudmFzIChjYXVzZXMgZmxpY2tlciBvbiBzdGFydCByZW5kZXIpXHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IGNpPTE7Y2k8dGhpcy5jYW52YXNMYXllcnMubGVuZ3RoO2NpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2wgPSB0aGlzLmNhbnZhc0xheWVyc1tjaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY2wud2lkdGghPWludFcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNsLndpZHRoID0gaW50VztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3Qgd1N0ciA9IGludFcudG9TdHJpbmcoKSArICdweCc7XHJcbiAgICAgICAgICAgIGZvcihsZXQgY2k9MDtjaTx0aGlzLmNhbnZhc0xheWVycy5sZW5ndGg7Y2krKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNsID0gdGhpcy5jYW52YXNMYXllcnNbY2ldO1xyXG4gICAgICAgICAgICAgICAgaWYoY2wuc3R5bGUud2lkdGghPXdTdHIpIHtcclxuICAgICAgICAgICAgICAgICAgY2wuc3R5bGUud2lkdGggPSB3U3RyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChib3VuZHMuZGltZW5zaW9uLmhlaWdodCkge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRIPU1hdGguZmxvb3IoYm91bmRzLmRpbWVuc2lvbi5oZWlnaHQpXHJcbiAgICAgICAgICAgIGlmIChyZWRyYXcpIHtcclxuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzZXQgaGVpZ2h0IG9mIGJhY2tncm91bmQgY2FudmFzIChjYXVzZXMgZmxpY2tlciBvbiBzdGFydCByZW5kZXIpXHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IGNpPTE7Y2k8dGhpcy5jYW52YXNMYXllcnMubGVuZ3RoO2NpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2wgPSB0aGlzLmNhbnZhc0xheWVyc1tjaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY2wuaGVpZ2h0IT1pbnRIKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjbC5oZWlnaHQgPSBpbnRIO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBoU3RyID0gaW50SCArICdweCc7XHJcbiAgICAgICAgICAgIGZvcihsZXQgY2k9MDtjaTx0aGlzLmNhbnZhc0xheWVycy5sZW5ndGg7Y2krKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNsID0gdGhpcy5jYW52YXNMYXllcnNbY2ldO1xyXG4gICAgICAgICAgICAgICAgaWYoY2wuc3R5bGUuaGVpZ2h0IT1oU3RyKXtcclxuICAgICAgICAgICAgICAgICAgY2wuc3R5bGUuaGVpZ2h0ID0gaFN0cjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50IGV4dGVuZHMgQmFzaWNBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IEVOQUJMRV9TVFJFQU1JTkdfTlVNQkVSX09GX1NBTVBMRVNfVEhSRVNIT0xEPTEwKjYwKjQ4MDAwOyAgLy8gVXNlIHN0cmVhbWluZy9jaHVua2luZyBpZiBhdWRpbyBjbGlwIGhhcyBtb3JlIHRoYW4gdGhpcyBudW1iZXIgb2Ygc2FtcGxlc1xyXG5cclxuICAgIF9wb2ludGVyUG9zaXRpb246TWFya2VyfG51bGw9bnVsbDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgc2VsZWN0U3RhcnRYOm51bWJlcnxudWxsPW51bGw7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnYmcnLCB7IHN0YXRpYzogdHJ1ZSB9KSBiZ0NhbnZhc1JlZiE6IEVsZW1lbnRSZWY7XHJcbiAgICBiZ0NhbnZhcyE6IEhUTUxDYW52YXNFbGVtZW50O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2N1cnNvcicsIHsgc3RhdGljOiB0cnVlIH0pIGN1cnNvckNhbnZhc1JlZiE6IEVsZW1lbnRSZWY7XHJcbiAgICBjdXJzb3JDYW52YXMhOiBIVE1MQ2FudmFzRWxlbWVudDtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZXVwKG1lOiBNb3VzZUV2ZW50KSB7XHJcbiAgICB0aGlzLnNlbGVjdGlvbkNvbW1pdChtZSlcclxuICB9XHJcblxyXG4gICAgbGF5b3V0Qm91bmRzKGJvdW5kczpSZWN0YW5nbGUsIHZpcnR1YWxEaW1lbnNpb246RGltZW5zaW9uLHJlZHJhdzogYm9vbGVhbixjbGVhcjpib29sZWFuPXRydWUpIHtcclxuICAgICAgICBzdXBlci5sYXlvdXRCb3VuZHMoYm91bmRzLHZpcnR1YWxEaW1lbnNpb24scmVkcmF3KVxyXG4gICAgICAgIGlmIChyZWRyYXcpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGFydERyYXcoY2xlYXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKSBzZXQgcG9pbnRlclBvc2l0aW9uKHBvaW50ZXJQb3NpdGlvbjpNYXJrZXJ8bnVsbCl7XHJcbiAgICAgICAgdGhpcy5fcG9pbnRlclBvc2l0aW9uPXBvaW50ZXJQb3NpdGlvblxyXG4gICAgICAgIHRoaXMuZHJhd0N1cnNvckxheWVyKClcclxuICAgIH1cclxuXHJcbiAgICBfc2VsZWN0aW5nOiBTZWxlY3Rpb258bnVsbCA9bnVsbDtcclxuICAgIEBJbnB1dCgpIHNldCBzZWxlY3Rpbmcoc2VsZWN0aW5nOlNlbGVjdGlvbnwgbnVsbCl7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0aW5nPXNlbGVjdGluZ1xyXG4gICAgICAgIHRoaXMuZHJhd0JnKClcclxuICAgICAgICB0aGlzLmRyYXdDdXJzb3JMYXllcigpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNlbGVjdGluZygpOlNlbGVjdGlvbnxudWxse1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RpbmdcclxuICAgIH1cclxuXHJcbiAgICBfc2VsZWN0aW9uOiBTZWxlY3Rpb258bnVsbCA9bnVsbFxyXG4gICAgQElucHV0KCkgc2V0IHNlbGVjdGlvbihzZWxlY3Rpb246U2VsZWN0aW9ufG51bGwpe1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbj1zZWxlY3Rpb247XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpbmc9bnVsbDtcclxuICAgICAgICB0aGlzLmRyYXdCZygpXHJcbiAgICAgICAgdGhpcy5kcmF3Q3Vyc29yTGF5ZXIoKVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZWxlY3Rpb24oKTpTZWxlY3Rpb258bnVsbHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uXHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0aW9uU3RhcnQobWU6TW91c2VFdmVudCl7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RTdGFydFg9bWUub2Zmc2V0WDtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3Rpb25Db21taXQobWU6TW91c2VFdmVudCl7XHJcbiAgICAgICAgbGV0IHZzOlZpZXdTZWxlY3Rpb258bnVsbD1udWxsO1xyXG4gICAgICAgIGlmKHRoaXMuc2VsZWN0U3RhcnRYIT1udWxsKSB7XHJcbiAgICAgICAgICB2cz1uZXcgVmlld1NlbGVjdGlvbih0aGlzLnNlbGVjdFN0YXJ0WCxtZS5vZmZzZXRYKVxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RTdGFydFg9bnVsbDtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0KHZzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWJzdHJhY3Qgc3RhcnREcmF3KGNsZWFyOmJvb2xlYW4pOnZvaWQ7XHJcblxyXG4gICAgdXBkYXRlQ3Vyc29yQ2FudmFzKG1lOk1vdXNlRXZlbnQsc2hvd0N1cnNvclBvc2l0aW9uPXRydWUpe1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnNvckNhbnZhcykge1xyXG4gICAgICAgICAgICBpZiAobWUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdFN0YXJ0WCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnRlclBvc2l0aW9uQ2hhbmdlZChudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW5nQ2hhbmdlKG5ldyBWaWV3U2VsZWN0aW9uKHRoaXMuc2VsZWN0U3RhcnRYLCBtZS5vZmZzZXRYKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzaG93Q3Vyc29yUG9zaXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2ludGVyUG9zaXRpb25DaGFuZ2VkKG1lLm9mZnNldFgpXHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnRlclBvc2l0aW9uQ2hhbmdlZChudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBAT3V0cHV0KCkgcG9pbnRlclBvc2l0aW9uRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxNYXJrZXI+KCk7XHJcbiAgICBAT3V0cHV0KCkgc2VsZWN0aW5nRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3Rpb24+KCk7XHJcbiAgICBAT3V0cHV0KCkgc2VsZWN0ZWRFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdGlvbj4oKTtcclxuXHJcblxyXG4gICAgcG9pbnRlclBvc2l0aW9uQ2hhbmdlZCh4UG9zaXRpb246bnVtYmVyfCBudWxsKXtcclxuICAgICAgICBsZXQgcG9pbnRlclBvc2l0aW9uOk1hcmtlcnx1bmRlZmluZWQ9dW5kZWZpbmVkO1xyXG4gICAgICAgIGlmKHhQb3NpdGlvbil7XHJcbiAgICAgICAgICAgIHBvaW50ZXJQb3NpdGlvbj1uZXcgTWFya2VyKCk7XHJcbiAgICAgICAgICAgIGxldCB2cFhQb3M9dGhpcy52aWV3UG9ydFhQaXhlbFRvRnJhbWVQb3NpdGlvbih4UG9zaXRpb24pO1xyXG4gICAgICAgICAgICBpZih2cFhQb3MhPW51bGwpIHtcclxuICAgICAgICAgICAgICAgIHBvaW50ZXJQb3NpdGlvbi5mcmFtZVBvc2l0aW9uID12cFhQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wb2ludGVyUG9zaXRpb25FdmVudEVtaXR0ZXIuZW1pdChwb2ludGVyUG9zaXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NlbGVjdGluZ0NoYW5nZSh2aWV3U2VsOlZpZXdTZWxlY3Rpb258IG51bGwpOlNlbGVjdGlvbnx1bmRlZmluZWQge1xyXG4gICAgICBsZXQgbnM6IFNlbGVjdGlvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKHZpZXdTZWwpIHtcclxuICAgICAgICBsZXQgZnJhbWVTdGFydCA9IHRoaXMudmlld1BvcnRYUGl4ZWxUb0ZyYW1lUG9zaXRpb24odmlld1NlbC5zdGFydFgpXHJcbiAgICAgICAgbGV0IGZyYW1lRW5kID0gdGhpcy52aWV3UG9ydFhQaXhlbFRvRnJhbWVQb3NpdGlvbih2aWV3U2VsLmVuZFgpXHJcbiAgICAgICAgaWYgKHRoaXMuX2F1ZGlvRGF0YUhvbGRlciAmJiBmcmFtZVN0YXJ0ICE9IG51bGwgJiYgZnJhbWVFbmQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgbnMgPSBuZXcgU2VsZWN0aW9uKHRoaXMuX2F1ZGlvRGF0YUhvbGRlci5zYW1wbGVSYXRlLCBmcmFtZVN0YXJ0LCBmcmFtZUVuZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBucztcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RpbmdDaGFuZ2Uodmlld1NlbDpWaWV3U2VsZWN0aW9ufCBudWxsKXtcclxuICAgICAgICBjb25zdCBucz10aGlzLl9zZWxlY3RpbmdDaGFuZ2Uodmlld1NlbCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RpbmdFdmVudEVtaXR0ZXIuZW1pdChucylcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3Qodmlld1NlbDpWaWV3U2VsZWN0aW9ufCBudWxsKXtcclxuICAgICAgICBjb25zdCBucz10aGlzLl9zZWxlY3RpbmdDaGFuZ2Uodmlld1NlbCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEV2ZW50RW1pdHRlci5lbWl0KG5zKVxyXG4gICAgfVxyXG5cclxuICAgIHZpZXdTZWxlY3Rpb24oKTpWaWV3U2VsZWN0aW9ufG51bGx7XHJcbiAgICAgIGxldCB2czpWaWV3U2VsZWN0aW9ufG51bGw9bnVsbDtcclxuICAgICAgbGV0IHM6U2VsZWN0aW9ufG51bGw9bnVsbDtcclxuICAgICAgaWYodGhpcy5fc2VsZWN0aW5nKXtcclxuICAgICAgICBzPXRoaXMuX3NlbGVjdGluZ1xyXG4gICAgICB9ZWxzZSBpZih0aGlzLl9zZWxlY3Rpb24pe1xyXG4gICAgICAgIHM9dGhpcy5fc2VsZWN0aW9uXHJcbiAgICAgIH1cclxuICAgICAgaWYocyl7XHJcbiAgICAgICAgY29uc3Qgc2Y9cy5zdGFydEZyYW1lO1xyXG4gICAgICAgIGNvbnN0IGVmPXMuZW5kRnJhbWU7XHJcbiAgICAgICAgY29uc3QgeHM9dGhpcy5mcmFtZVRvVmlld1BvcnRYUGl4ZWxQb3NpdGlvbihzZilcclxuICAgICAgICBjb25zdCB4ZT10aGlzLmZyYW1lVG9WaWV3UG9ydFhQaXhlbFBvc2l0aW9uKGVmKVxyXG4gICAgICAgICAgaWYoeHMhPW51bGwgJiYgeGUhPW51bGwpIHtcclxuICAgICAgICAgICAgICB2cyA9IG5ldyBWaWV3U2VsZWN0aW9uKHhzLCB4ZSlcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdnM7XHJcbiAgICB9XHJcblxyXG5cclxuICBkcmF3QmcoKXtcclxuICAgICAgaWYodGhpcy5iZ0NhbnZhcyAmJiB0aGlzLmJvdW5kcykge1xyXG4gICAgICAgICAgdGhpcy5iZ0NhbnZhcy5zdHlsZS5sZWZ0ID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5wb3NpdGlvbi5sZWZ0KS50b1N0cmluZygpICsgJ3B4JztcclxuICAgICAgICAgIHRoaXMuYmdDYW52YXMud2lkdGggPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi53aWR0aCk7XHJcbiAgICAgICAgICB0aGlzLmJnQ2FudmFzLmhlaWdodCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMuZGltZW5zaW9uLmhlaWdodCk7XHJcbiAgICAgICAgbGV0IGcxID0gdGhpcy5iZ0NhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgaWYgKGcxKSB7XHJcbiAgICAgICAgICBjb25zdCB3ID0gdGhpcy5iZ0NhbnZhcy53aWR0aDtcclxuICAgICAgICAgIGNvbnN0IGggPSB0aGlzLmJnQ2FudmFzLmhlaWdodDtcclxuICAgICAgICAgIGcxLmNsZWFyUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgICAgIGlmKHRoaXMuX2JnQ29sb3IpIHtcclxuICAgICAgICAgICAgZzEuZmlsbFN0eWxlID0gdGhpcy5fYmdDb2xvcjtcclxuICAgICAgICAgICAgZzEuZmlsbFJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgdnMgPSB0aGlzLnZpZXdTZWxlY3Rpb24oKVxyXG4gICAgICAgICAgaWYgKHZzKSB7XHJcbiAgICAgICAgICAgIGcxLmZpbGxTdHlsZSA9IHRoaXMuX3NlbGVjdENvbG9yO1xyXG4gICAgICAgICAgICBnMS5maWxsUmVjdCh2cy5zdGFydFgsIDAsIHZzLndpZHRoKCksIGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gIH1cclxuICAgIGRyYXdDdXJzb3JMYXllcigpe1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnNvckNhbnZhcykge1xyXG4gICAgICAgICAgICBjb25zdCB3ID0gdGhpcy5jdXJzb3JDYW52YXMud2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGggPSB0aGlzLmN1cnNvckNhbnZhcy5oZWlnaHQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGcgPSB0aGlzLmN1cnNvckNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgIGlmKGcpIHtcclxuICAgICAgICAgICAgICAgIGcuY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5fcG9pbnRlclBvc2l0aW9uKXtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZnJhbWVQb3M9dGhpcy5fcG9pbnRlclBvc2l0aW9uLmZyYW1lUG9zaXRpb25cclxuICAgICAgICAgICAgICAgICAgICBpZihmcmFtZVBvcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgeFZpZXdQb3J0UGl4ZWxwb3MgPSB0aGlzLmZyYW1lVG9WaWV3UG9ydFhQaXhlbFBvc2l0aW9uKGZyYW1lUG9zKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeFZpZXdQb3J0UGl4ZWxwb3MpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmZpbGxTdHlsZSA9ICd5ZWxsb3cnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5zdHJva2VTdHlsZSA9ICd5ZWxsb3cnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5iZWdpblBhdGgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcubW92ZVRvKHhWaWV3UG9ydFBpeGVscG9zLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcubGluZVRvKHhWaWV3UG9ydFBpeGVscG9zLCBoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuY2xvc2VQYXRoKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5zdHJva2UoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fYXVkaW9EYXRhSG9sZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5mb250ID0gJzE0cHggc2Fucy1zZXJpZic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5maWxsU3R5bGUgPSAneWVsbG93JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmZpbGxUZXh0KGZyYW1lUG9zLnRvU3RyaW5nKCksIHhWaWV3UG9ydFBpeGVscG9zICsgMiwgNTApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufVxyXG5cclxuXHJcblxyXG4iXX0=
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
|
-
import { MatCheckbox } from "@angular/material/checkbox";
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/common";
|
|
5
|
-
import * as i2 from "@angular/material/icon";
|
|
6
|
-
import * as i3 from "@angular/material/tooltip";
|
|
7
|
-
import * as i4 from "@angular/material/checkbox";
|
|
8
|
-
export class AudioDisplayControl {
|
|
9
|
-
constructor() {
|
|
10
|
-
this.audioClip = null;
|
|
11
|
-
this.autoplaySelectedCheckbox = null;
|
|
12
|
-
this.zoomInAction = null;
|
|
13
|
-
this.zoomOutAction = null;
|
|
14
|
-
this.status = null;
|
|
15
|
-
}
|
|
16
|
-
clearSelection() {
|
|
17
|
-
if (this.audioClip != null) {
|
|
18
|
-
this.audioClip.selection = null;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
hasSelection() {
|
|
22
|
-
let hs = false;
|
|
23
|
-
if (this.audioClip) {
|
|
24
|
-
hs = (this.audioClip.selection != null);
|
|
25
|
-
}
|
|
26
|
-
return hs;
|
|
27
|
-
}
|
|
28
|
-
autoPlaySelectionChange(ch) {
|
|
29
|
-
if (this.autoPlayOnSelectToggleAction) {
|
|
30
|
-
this.autoPlayOnSelectToggleAction.perform(ch.checked);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
error() {
|
|
34
|
-
this.status = 'ERROR';
|
|
35
|
-
}
|
|
36
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AudioDisplayControl, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
37
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: AudioDisplayControl, selector: "audio-display-control", inputs: { audioClip: "audioClip", playStartAction: "playStartAction", playSelectionAction: "playSelectionAction", playStopAction: "playStopAction", zoomInAction: "zoomInAction", zoomOutAction: "zoomOutAction", zoomFitToPanelAction: "zoomFitToPanelAction", zoomSelectedAction: "zoomSelectedAction", autoPlayOnSelectToggleAction: "autoPlayOnSelectToggleAction" }, viewQueries: [{ propertyName: "autoplaySelectedCheckbox", first: true, predicate: MatCheckbox, descendants: true, static: true }], ngImport: i0, template: `
|
|
38
|
-
<div #controlPanel style="display:flex;flex-direction: row;">
|
|
39
|
-
<fieldset>
|
|
40
|
-
|
|
41
|
-
<legend>Play</legend>
|
|
42
|
-
|
|
43
|
-
<button (click)="playStartAction?.perform()" [disabled]="playStartAction?.disabled"
|
|
44
|
-
[style.color]="playStartAction?.disabled ? 'grey' : 'green'" matTooltip="Play all">
|
|
45
|
-
<mat-icon>play_arrow</mat-icon>
|
|
46
|
-
</button>
|
|
47
|
-
<button (click)="playSelectionAction?.perform()" [disabled]="playSelectionAction?.disabled"
|
|
48
|
-
[style.color]="playSelectionAction?.disabled ? 'grey' : 'green'" matTooltip="Play selection">
|
|
49
|
-
<mat-icon>play_circle_outline</mat-icon>
|
|
50
|
-
</button>
|
|
51
|
-
<button (click)="playStopAction?.perform()" [disabled]="playStopAction?.disabled"
|
|
52
|
-
[style.color]="playStopAction?.disabled ? 'grey' : 'yellow'">
|
|
53
|
-
<mat-icon>stop</mat-icon>
|
|
54
|
-
</button>
|
|
55
|
-
<mat-checkbox #autoplaySelectionCheckbox (change)="autoPlaySelectionChange($event)">Autoplay on select
|
|
56
|
-
</mat-checkbox>
|
|
57
|
-
</fieldset>
|
|
58
|
-
<fieldset>
|
|
59
|
-
|
|
60
|
-
<legend>Zoom</legend>
|
|
61
|
-
<button (click)="zoomFitToPanelAction?.perform()"
|
|
62
|
-
[disabled]="zoomFitToPanelAction?.disabled">{{zoomFitToPanelAction?.name}}</button>
|
|
63
|
-
<button (click)="zoomOutAction?.perform()"
|
|
64
|
-
[disabled]="zoomOutAction?.disabled">{{zoomOutAction?.name}}</button>
|
|
65
|
-
<button (click)="zoomInAction?.perform()"
|
|
66
|
-
[disabled]="zoomInAction?.disabled">{{zoomInAction?.name}}</button>
|
|
67
|
-
<button (click)="zoomSelectedAction?.perform()"
|
|
68
|
-
[disabled]="zoomSelectedAction?.disabled">{{zoomSelectedAction?.name}}</button>
|
|
69
|
-
</fieldset>
|
|
70
|
-
<fieldset>
|
|
71
|
-
<legend>Selection</legend>
|
|
72
|
-
{{audioClip?.selection?.leftFrame}} <span
|
|
73
|
-
*ngIf="audioClip?.selection">to</span> {{audioClip?.selection?.rightFrame}}
|
|
74
|
-
<button (click)="clearSelection()" [disabled]="audioClip?.selection==null"
|
|
75
|
-
[style.color]="hasSelection() ? 'red' : 'grey'" matTooltip="Clear selection">
|
|
76
|
-
<mat-icon>clear</mat-icon>
|
|
77
|
-
</button>
|
|
78
|
-
|
|
79
|
-
</fieldset>
|
|
80
|
-
</div>`, isInline: true, styles: [":host{flex:0}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }] }); }
|
|
81
|
-
}
|
|
82
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AudioDisplayControl, decorators: [{
|
|
83
|
-
type: Component,
|
|
84
|
-
args: [{ selector: 'audio-display-control', template: `
|
|
85
|
-
<div #controlPanel style="display:flex;flex-direction: row;">
|
|
86
|
-
<fieldset>
|
|
87
|
-
|
|
88
|
-
<legend>Play</legend>
|
|
89
|
-
|
|
90
|
-
<button (click)="playStartAction?.perform()" [disabled]="playStartAction?.disabled"
|
|
91
|
-
[style.color]="playStartAction?.disabled ? 'grey' : 'green'" matTooltip="Play all">
|
|
92
|
-
<mat-icon>play_arrow</mat-icon>
|
|
93
|
-
</button>
|
|
94
|
-
<button (click)="playSelectionAction?.perform()" [disabled]="playSelectionAction?.disabled"
|
|
95
|
-
[style.color]="playSelectionAction?.disabled ? 'grey' : 'green'" matTooltip="Play selection">
|
|
96
|
-
<mat-icon>play_circle_outline</mat-icon>
|
|
97
|
-
</button>
|
|
98
|
-
<button (click)="playStopAction?.perform()" [disabled]="playStopAction?.disabled"
|
|
99
|
-
[style.color]="playStopAction?.disabled ? 'grey' : 'yellow'">
|
|
100
|
-
<mat-icon>stop</mat-icon>
|
|
101
|
-
</button>
|
|
102
|
-
<mat-checkbox #autoplaySelectionCheckbox (change)="autoPlaySelectionChange($event)">Autoplay on select
|
|
103
|
-
</mat-checkbox>
|
|
104
|
-
</fieldset>
|
|
105
|
-
<fieldset>
|
|
106
|
-
|
|
107
|
-
<legend>Zoom</legend>
|
|
108
|
-
<button (click)="zoomFitToPanelAction?.perform()"
|
|
109
|
-
[disabled]="zoomFitToPanelAction?.disabled">{{zoomFitToPanelAction?.name}}</button>
|
|
110
|
-
<button (click)="zoomOutAction?.perform()"
|
|
111
|
-
[disabled]="zoomOutAction?.disabled">{{zoomOutAction?.name}}</button>
|
|
112
|
-
<button (click)="zoomInAction?.perform()"
|
|
113
|
-
[disabled]="zoomInAction?.disabled">{{zoomInAction?.name}}</button>
|
|
114
|
-
<button (click)="zoomSelectedAction?.perform()"
|
|
115
|
-
[disabled]="zoomSelectedAction?.disabled">{{zoomSelectedAction?.name}}</button>
|
|
116
|
-
</fieldset>
|
|
117
|
-
<fieldset>
|
|
118
|
-
<legend>Selection</legend>
|
|
119
|
-
{{audioClip?.selection?.leftFrame}} <span
|
|
120
|
-
*ngIf="audioClip?.selection">to</span> {{audioClip?.selection?.rightFrame}}
|
|
121
|
-
<button (click)="clearSelection()" [disabled]="audioClip?.selection==null"
|
|
122
|
-
[style.color]="hasSelection() ? 'red' : 'grey'" matTooltip="Clear selection">
|
|
123
|
-
<mat-icon>clear</mat-icon>
|
|
124
|
-
</button>
|
|
125
|
-
|
|
126
|
-
</fieldset>
|
|
127
|
-
</div>`, styles: [":host{flex:0}\n"] }]
|
|
128
|
-
}], ctorParameters: () => [], propDecorators: { audioClip: [{
|
|
129
|
-
type: Input
|
|
130
|
-
}], autoplaySelectedCheckbox: [{
|
|
131
|
-
type: ViewChild,
|
|
132
|
-
args: [MatCheckbox, { static: true }]
|
|
133
|
-
}], playStartAction: [{
|
|
134
|
-
type: Input
|
|
135
|
-
}], playSelectionAction: [{
|
|
136
|
-
type: Input
|
|
137
|
-
}], playStopAction: [{
|
|
138
|
-
type: Input
|
|
139
|
-
}], zoomInAction: [{
|
|
140
|
-
type: Input
|
|
141
|
-
}], zoomOutAction: [{
|
|
142
|
-
type: Input
|
|
143
|
-
}], zoomFitToPanelAction: [{
|
|
144
|
-
type: Input
|
|
145
|
-
}], zoomSelectedAction: [{
|
|
146
|
-
type: Input
|
|
147
|
-
}], autoPlayOnSelectToggleAction: [{
|
|
148
|
-
type: Input
|
|
149
|
-
}] } });
|
|
150
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9fZGlzcGxheV9jb250cm9sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL3VpL2F1ZGlvX2Rpc3BsYXlfY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUE7QUFFekQsT0FBTyxFQUFDLFdBQVcsRUFBb0IsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7O0FBMkR6RSxNQUFNLE9BQU8sbUJBQW1CO0lBa0IvQjtRQWhCVyxjQUFTLEdBQWlCLElBQUksQ0FBQztRQUdoQyw2QkFBd0IsR0FBbUIsSUFBSSxDQUFDO1FBSS9DLGlCQUFZLEdBQW9CLElBQUksQ0FBQztRQUNyQyxrQkFBYSxHQUFvQixJQUFJLENBQUM7UUFJL0MsV0FBTSxHQUFhLElBQUksQ0FBQztJQUlYLENBQUM7SUFFZCxjQUFjO1FBQ1YsSUFBRyxJQUFJLENBQUMsU0FBUyxJQUFFLElBQUksRUFBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFDLElBQUksQ0FBQTtRQUNqQyxDQUFDO0lBQ0wsQ0FBQztJQUVDLFlBQVk7UUFDUixJQUFJLEVBQUUsR0FBQyxLQUFLLENBQUM7UUFDYixJQUFHLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQztZQUNmLEVBQUUsR0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxJQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFSCx1QkFBdUIsQ0FBQyxFQUFxQjtRQUN6QyxJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDTCxDQUFDO0lBRUgsS0FBSztRQUNKLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO0lBQ3ZCLENBQUM7K0dBMUNXLG1CQUFtQjttR0FBbkIsbUJBQW1CLGllQUlsQixXQUFXLDhEQXZEWjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztlQTJDQzs7NEZBUUQsbUJBQW1CO2tCQXZEOUIsU0FBUzsrQkFFRSx1QkFBdUIsWUFFdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7ZUEyQ0M7d0RBVUYsU0FBUztzQkFBakIsS0FBSztnQkFHRSx3QkFBd0I7c0JBRC9CLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFL0IsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyw0QkFBNEI7c0JBQXBDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtBY3Rpb259IGZyb20gXCIuLi8uLi9hY3Rpb24vYWN0aW9uXCI7XHJcbmltcG9ydCB7TWF0Q2hlY2tib3gsIE1hdENoZWNrYm94Q2hhbmdlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3hcIjtcclxuaW1wb3J0IHtBdWRpb0NsaXB9IGZyb20gXCIuLi9wZXJzaXN0b3JcIjtcclxuXHJcblxyXG4gIEBDb21wb25lbnQoe1xyXG5cclxuICAgIHNlbGVjdG9yOiAnYXVkaW8tZGlzcGxheS1jb250cm9sJyxcclxuXHJcbiAgICB0ZW1wbGF0ZTogYFxyXG4gICAgICAgIDxkaXYgI2NvbnRyb2xQYW5lbCBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjogcm93O1wiPlxyXG4gICAgICAgICAgICA8ZmllbGRzZXQ+XHJcblxyXG4gICAgICAgICAgICAgICAgPGxlZ2VuZD5QbGF5PC9sZWdlbmQ+XHJcblxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicGxheVN0YXJ0QWN0aW9uPy5wZXJmb3JtKClcIiBbZGlzYWJsZWRdPVwicGxheVN0YXJ0QWN0aW9uPy5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJwbGF5U3RhcnRBY3Rpb24/LmRpc2FibGVkID8gJ2dyZXknIDogJ2dyZWVuJ1wiIG1hdFRvb2x0aXA9XCJQbGF5IGFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5wbGF5X2Fycm93PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicGxheVNlbGVjdGlvbkFjdGlvbj8ucGVyZm9ybSgpXCIgW2Rpc2FibGVkXT1cInBsYXlTZWxlY3Rpb25BY3Rpb24/LmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInBsYXlTZWxlY3Rpb25BY3Rpb24/LmRpc2FibGVkID8gJ2dyZXknIDogJ2dyZWVuJ1wiIG1hdFRvb2x0aXA9XCJQbGF5IHNlbGVjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5wbGF5X2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicGxheVN0b3BBY3Rpb24/LnBlcmZvcm0oKVwiIFtkaXNhYmxlZF09XCJwbGF5U3RvcEFjdGlvbj8uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwicGxheVN0b3BBY3Rpb24/LmRpc2FibGVkID8gJ2dyZXknIDogJ3llbGxvdydcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+c3RvcDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj4mbmJzcDtcclxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggI2F1dG9wbGF5U2VsZWN0aW9uQ2hlY2tib3ggKGNoYW5nZSk9XCJhdXRvUGxheVNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCI+QXV0b3BsYXkgb24gc2VsZWN0XHJcbiAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgICAgPC9maWVsZHNldD5cclxuICAgICAgICAgICAgPGZpZWxkc2V0PlxyXG5cclxuICAgICAgICAgICAgICAgIDxsZWdlbmQ+Wm9vbTwvbGVnZW5kPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiem9vbUZpdFRvUGFuZWxBY3Rpb24/LnBlcmZvcm0oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ6b29tRml0VG9QYW5lbEFjdGlvbj8uZGlzYWJsZWRcIj57e3pvb21GaXRUb1BhbmVsQWN0aW9uPy5uYW1lfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInpvb21PdXRBY3Rpb24/LnBlcmZvcm0oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ6b29tT3V0QWN0aW9uPy5kaXNhYmxlZFwiPnt7em9vbU91dEFjdGlvbj8ubmFtZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ6b29tSW5BY3Rpb24/LnBlcmZvcm0oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ6b29tSW5BY3Rpb24/LmRpc2FibGVkXCI+e3t6b29tSW5BY3Rpb24/Lm5hbWV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiem9vbVNlbGVjdGVkQWN0aW9uPy5wZXJmb3JtKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiem9vbVNlbGVjdGVkQWN0aW9uPy5kaXNhYmxlZFwiPnt7em9vbVNlbGVjdGVkQWN0aW9uPy5uYW1lfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9maWVsZHNldD5cclxuICAgICAgICAgICAgPGZpZWxkc2V0PlxyXG4gICAgICAgICAgICAgICAgPGxlZ2VuZD5TZWxlY3Rpb248L2xlZ2VuZD5cclxuICAgICAgICAgICAgICAgIHt7YXVkaW9DbGlwPy5zZWxlY3Rpb24/LmxlZnRGcmFtZX19IDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhdWRpb0NsaXA/LnNlbGVjdGlvblwiPnRvPC9zcGFuPiB7e2F1ZGlvQ2xpcD8uc2VsZWN0aW9uPy5yaWdodEZyYW1lfX1cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImNsZWFyU2VsZWN0aW9uKClcIiBbZGlzYWJsZWRdPVwiYXVkaW9DbGlwPy5zZWxlY3Rpb249PW51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiaGFzU2VsZWN0aW9uKCkgPyAncmVkJyA6ICdncmV5J1wiIG1hdFRvb2x0aXA9XCJDbGVhciBzZWxlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICA8L2ZpZWxkc2V0PlxyXG4gICAgICAgIDwvZGl2PmAsXHJcbiAgICBzdHlsZXM6IFtcclxuICAgICAgICBgOmhvc3Qge1xyXG4gICAgICAgICAgICAgICAgIGZsZXg6IDA7XHJcbiAgICAgICAgIFxyXG4gICAgICAgICAgICAgICB9YF1cclxuXHJcbiAgfSlcclxuXHRleHBvcnQgY2xhc3MgQXVkaW9EaXNwbGF5Q29udHJvbCB7XHJcblxyXG4gICAgQElucHV0KCkgYXVkaW9DbGlwOiBBdWRpb0NsaXB8bnVsbD1udWxsO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoTWF0Q2hlY2tib3gsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgICBwcml2YXRlIGF1dG9wbGF5U2VsZWN0ZWRDaGVja2JveDogTWF0Q2hlY2tib3h8bnVsbD1udWxsO1xyXG4gICAgQElucHV0KCkgcGxheVN0YXJ0QWN0aW9uOiBBY3Rpb248dm9pZD58dW5kZWZpbmVkO1xyXG4gICAgQElucHV0KCkgcGxheVNlbGVjdGlvbkFjdGlvbjogQWN0aW9uPHZvaWQ+fHVuZGVmaW5lZDtcclxuICAgIEBJbnB1dCgpIHBsYXlTdG9wQWN0aW9uOiBBY3Rpb248dm9pZD58dW5kZWZpbmVkO1xyXG4gICAgQElucHV0KCkgem9vbUluQWN0aW9uOiBBY3Rpb248dm9pZD58bnVsbD1udWxsO1xyXG4gICAgQElucHV0KCkgem9vbU91dEFjdGlvbjogQWN0aW9uPHZvaWQ+fG51bGw9bnVsbDtcclxuICAgIEBJbnB1dCgpIHpvb21GaXRUb1BhbmVsQWN0aW9uOiBBY3Rpb248dm9pZD58dW5kZWZpbmVkO1xyXG4gICAgQElucHV0KCkgem9vbVNlbGVjdGVkQWN0aW9uOiBBY3Rpb248dm9pZD58dW5kZWZpbmVkO1xyXG4gICAgQElucHV0KCkgYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvbjogQWN0aW9uPGJvb2xlYW4+fHVuZGVmaW5lZDtcclxuXHQgICBzdGF0dXM6c3RyaW5nfG51bGw9bnVsbDtcclxuXHJcblx0XHRhdWRpbzphbnk7XHJcblxyXG5cdFx0Y29uc3RydWN0b3IoKSB7fVxyXG5cclxuICAgIGNsZWFyU2VsZWN0aW9uKCl7XHJcbiAgICAgICAgaWYodGhpcy5hdWRpb0NsaXAhPW51bGwpe1xyXG4gICAgICAgICAgICB0aGlzLmF1ZGlvQ2xpcC5zZWxlY3Rpb249bnVsbFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAgIGhhc1NlbGVjdGlvbigpOmJvb2xlYW57XHJcbiAgICAgICAgICBsZXQgaHM9ZmFsc2U7XHJcbiAgICAgICAgICBpZih0aGlzLmF1ZGlvQ2xpcCl7XHJcbiAgICAgICAgICAgICAgaHM9KHRoaXMuYXVkaW9DbGlwLnNlbGVjdGlvbiE9bnVsbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gaHM7XHJcbiAgICAgIH1cclxuXHJcbiAgICBhdXRvUGxheVNlbGVjdGlvbkNoYW5nZShjaDogTWF0Q2hlY2tib3hDaGFuZ2UpIHtcclxuICAgICAgICBpZiAodGhpcy5hdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvbi5wZXJmb3JtKGNoLmNoZWNrZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblx0XHRlcnJvcigpe1xyXG5cdFx0XHR0aGlzLnN0YXR1cyA9ICdFUlJPUic7XHJcblx0XHR9XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiJdfQ==
|