speechrecorderng 3.4.4 → 3.4.5

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.
Files changed (49) hide show
  1. package/esm2020/lib/action/action.mjs +3 -3
  2. package/esm2020/lib/audio/audio_display.mjs +7 -9
  3. package/esm2020/lib/audio/capture/capture.mjs +2 -2
  4. package/esm2020/lib/audio/io/stream.mjs +1 -1
  5. package/esm2020/lib/audio/net_audio_buffer.mjs +1 -1
  6. package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +2 -2
  7. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +2 -2
  8. package/esm2020/lib/audio/playback/inddb_audio_buffer_source_node.mjs +1 -1
  9. package/esm2020/lib/audio/ui/container.mjs +3 -3
  10. package/esm2020/lib/db/inddb.mjs +1 -1
  11. package/esm2020/lib/net/uploader.mjs +31 -28
  12. package/esm2020/lib/speechrecorder/project/project.service.mjs +4 -4
  13. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +53 -51
  14. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +121 -113
  15. package/esm2020/lib/speechrecorder/script/script.service.mjs +1 -1
  16. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +22 -23
  17. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +1 -1
  18. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +13 -11
  19. package/esm2020/lib/speechrecorder/session/progress.mjs +1 -1
  20. package/esm2020/lib/speechrecorder/session/prompting.mjs +1 -1
  21. package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +1 -1
  22. package/esm2020/lib/speechrecorder/session/recording_list.mjs +1 -1
  23. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +1 -1
  24. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +3 -3
  25. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +17 -16
  26. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +40 -38
  27. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +144 -134
  28. package/esm2020/lib/speechrecorder/session/session.service.mjs +12 -9
  29. package/esm2020/lib/speechrecorder/startstopsignal/startstopsignal.mjs +1 -2
  30. package/esm2020/lib/speechrecorderng.component.mjs +3 -3
  31. package/esm2020/lib/speechrecorderng.module.mjs +1 -1
  32. package/esm2020/lib/spr.module.version.mjs +2 -2
  33. package/esm2020/lib/ui/recordingitem_display.mjs +2 -2
  34. package/fesm2015/speechrecorderng.mjs +485 -456
  35. package/fesm2015/speechrecorderng.mjs.map +1 -1
  36. package/fesm2020/speechrecorderng.mjs +485 -456
  37. package/fesm2020/speechrecorderng.mjs.map +1 -1
  38. package/lib/action/action.d.ts +1 -1
  39. package/lib/audio/audio_display.d.ts +1 -3
  40. package/lib/audio/io/stream.d.ts +1 -1
  41. package/lib/net/uploader.d.ts +6 -6
  42. package/lib/speechrecorder/project/project.service.d.ts +4 -4
  43. package/lib/speechrecorder/script/script.service.d.ts +2 -2
  44. package/lib/speechrecorder/session/audiorecorder.d.ts +1 -2
  45. package/lib/speechrecorder/session/basicrecorder.d.ts +1 -1
  46. package/lib/speechrecorder/session/controlpanel.d.ts +1 -1
  47. package/lib/speechrecorder/session/session.service.d.ts +2 -2
  48. package/lib/spr.module.version.d.ts +1 -1
  49. package/package.json +1 -1
@@ -6,17 +6,15 @@ import { HttpErrorResponse, HttpHeaders, HttpClientModule } from '@angular/commo
6
6
  import { timeout } from 'rxjs/operators';
7
7
  import * as i1$1 from '@angular/common';
8
8
  import { CommonModule } from '@angular/common';
9
- import * as i1$2 from '@angular/router';
10
- import { RouterModule } from '@angular/router';
11
9
  import * as i4$1 from '@angular/material/checkbox';
12
10
  import { MatCheckbox, MatCheckboxModule } from '@angular/material/checkbox';
13
11
  import * as i2 from '@angular/material/icon';
14
12
  import { MatIconModule } from '@angular/material/icon';
15
13
  import * as i4 from '@angular/material/tooltip';
16
14
  import { MatTooltipModule } from '@angular/material/tooltip';
17
- import * as i1$3 from '@angular/cdk/layout';
15
+ import * as i1$2 from '@angular/cdk/layout';
18
16
  import { Breakpoints } from '@angular/cdk/layout';
19
- import * as i1$4 from '@angular/material/dialog';
17
+ import * as i1$3 from '@angular/material/dialog';
20
18
  import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
21
19
  import * as i3 from '@angular/material/button';
22
20
  import { MatButtonModule } from '@angular/material/button';
@@ -25,13 +23,15 @@ import * as i3$1 from '@angular/material/progress-spinner';
25
23
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
26
24
  import * as i7 from '@angular/material/progress-bar';
27
25
  import { MatProgressBarModule } from '@angular/material/progress-bar';
26
+ import * as i4$2 from '@angular/router';
27
+ import { RouterModule } from '@angular/router';
28
28
  import * as i3$2 from '@angular/material/card';
29
29
  import { MatCardModule } from '@angular/material/card';
30
30
  import { MatDividerModule } from '@angular/material/divider';
31
31
  import { MatGridListModule } from '@angular/material/grid-list';
32
32
  import * as i6 from '@angular/material/snack-bar';
33
33
  import { MatSnackBarModule } from '@angular/material/snack-bar';
34
- import * as i4$2 from '@angular/material/table';
34
+ import * as i4$3 from '@angular/material/table';
35
35
  import { MatTableDataSource, MatTableModule } from '@angular/material/table';
36
36
  import { MatSelectModule } from '@angular/material/select';
37
37
  import { MatInputModule } from '@angular/material/input';
@@ -95,7 +95,7 @@ class Action {
95
95
  ctrl.disabled = this.disabled;
96
96
  this.controls.push(ctrl);
97
97
  if (actionEventName) {
98
- ctrl.addEventListener(actionEventName, (e) => {
98
+ ctrl.addEventListener(actionEventName, () => {
99
99
  this.perform();
100
100
  });
101
101
  }
@@ -103,7 +103,7 @@ class Action {
103
103
  }
104
104
  }
105
105
  removeControl(ctrl) {
106
- var i = this.controls.indexOf(ctrl);
106
+ const i = this.controls.indexOf(ctrl);
107
107
  if (i >= 0) {
108
108
  this.controls = this.controls.splice(i, 1);
109
109
  }
@@ -944,7 +944,7 @@ class ArrayAudioBufferSourceNode extends AudioSourceNode {
944
944
  }
945
945
  };
946
946
  }
947
- fillBuffer(frameOffset) {
947
+ fillBuffer() {
948
948
  if (this._arrayAudioBuffer && this._audioInputStream && this._aisBufs) {
949
949
  let filled = this.filledFrames;
950
950
  let bufLen = 0;
@@ -1741,7 +1741,7 @@ const aswpStr = "\n" +
1741
1741
  "\n" +
1742
1742
  " let copied=0;\n" +
1743
1743
  " do{\n" +
1744
- " if(this.currentAudioBufferAvail==0){\n" +
1744
+ " if(this.currentAudioBufferAvail===0){\n" +
1745
1745
  " let nxtBuff=this.audioBuffers.shift();\n" +
1746
1746
  " if(nxtBuff){\n" +
1747
1747
  " this.currentAudioBuffer=nxtBuff;\n" +
@@ -3167,7 +3167,7 @@ class AudioCapture {
3167
3167
  this.inddbAudioBuffer = null;
3168
3168
  this.context = context;
3169
3169
  this.n = navigator;
3170
- this.context.addEventListener('statechange', (ev) => {
3170
+ this.context.addEventListener('statechange', () => {
3171
3171
  if (this.context.state !== 'running') {
3172
3172
  this.close();
3173
3173
  }
@@ -4519,7 +4519,7 @@ class Uploader {
4519
4519
  si += v.size;
4520
4520
  }
4521
4521
  else if (typeof v === 'string') {
4522
- // encode to UT-f8 to get upload size
4522
+ // encode to UTF-8 to get upload size
4523
4523
  si += this.te.encode().length;
4524
4524
  }
4525
4525
  });
@@ -4557,34 +4557,37 @@ class Uploader {
4557
4557
  // pipe(timeout()) is not the same as xhr.timeout
4558
4558
  let uploadedUpload = null;
4559
4559
  //console.debug("Post upload: "+ul)
4560
- this.http.post(ul.url, ul.data, { withCredentials: this.withCredentials }).pipe(timeout(timeoVal)).subscribe(data => {
4561
- uploadedUpload = ul;
4562
- //console.debug('Next method called for upload: '+uploadedUpload)
4563
- }, (err) => {
4564
- if (err.error instanceof Error) {
4565
- // A client-side or network error occurred. Handle it accordingly.
4566
- console.error('Upload error occurred:', err.error.message);
4567
- }
4568
- else {
4569
- // The backend returned an unsuccessful response code.
4570
- // The response body may contain clues as to what went wrong,
4571
- console.error(`Upload error: Server returned code ${err.status}`);
4572
- }
4573
- this.processError(ul);
4574
- }, () => {
4575
- //console.debug('Upload complete method called')
4576
- if (uploadedUpload) {
4577
- if (this.DEBUG_DELAY > 0) {
4578
- window.setTimeout(() => {
4579
- this.uploadDone(ul);
4580
- }, this.DEBUG_DELAY);
4560
+ this.http.post(ul.url, ul.data, { withCredentials: this.withCredentials }).pipe(timeout(timeoVal)).subscribe({
4561
+ next: (data) => {
4562
+ uploadedUpload = ul;
4563
+ //console.debug('Next method called for upload: '+uploadedUpload)
4564
+ },
4565
+ error: (err) => {
4566
+ if (err.error instanceof Error) {
4567
+ // A client-side or network error occurred. Handle it accordingly.
4568
+ console.error('Upload error occurred:', err.error.message);
4581
4569
  }
4582
4570
  else {
4583
- this.uploadDone(uploadedUpload);
4571
+ // The backend returned an unsuccessful response code.
4572
+ // The response body may contain clues as to what went wrong,
4573
+ console.error(`Upload error: Server returned code ${err.status}`);
4574
+ }
4575
+ this.processError(ul);
4576
+ }, complete: () => {
4577
+ //console.debug('Upload complete method called')
4578
+ if (uploadedUpload) {
4579
+ if (this.DEBUG_DELAY > 0) {
4580
+ window.setTimeout(() => {
4581
+ this.uploadDone(ul);
4582
+ }, this.DEBUG_DELAY);
4583
+ }
4584
+ else {
4585
+ this.uploadDone(uploadedUpload);
4586
+ }
4587
+ }
4588
+ else {
4589
+ console.error('Upload post complete, but upload not set in next method!');
4584
4590
  }
4585
- }
4586
- else {
4587
- console.error('Upload post complete, but upload not set in next method!');
4588
4591
  }
4589
4592
  });
4590
4593
  }
@@ -4599,7 +4602,7 @@ class Uploader {
4599
4602
  // set retry timer
4600
4603
  this.retryTimerId = window.setTimeout(() => {
4601
4604
  this.retryTimerRunning = false;
4602
- //console.debug("Upload retry timer exprired. Continue processing...")
4605
+ //console.debug("Upload retry timer expired. Continue processing...")
4603
4606
  this.process();
4604
4607
  }, this.RETRY_DELAY);
4605
4608
  this.retryTimerRunning = true;
@@ -4693,12 +4696,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
4693
4696
  * Created by klausj on 17.06.2017.
4694
4697
  */
4695
4698
  class ProjectService {
4696
- constructor(http, platformLoaction, config) {
4699
+ constructor(http, platformLocation, config) {
4697
4700
  this.http = http;
4698
- this.platformLoaction = platformLoaction;
4701
+ this.platformLocation = platformLocation;
4699
4702
  this.config = config;
4700
4703
  this.withCredentials = false;
4701
- console.log("Base Href: " + platformLoaction.getBaseHrefFromDOM());
4704
+ console.log("Base Href: " + platformLocation.getBaseHrefFromDOM());
4702
4705
  let apiEndPoint = '';
4703
4706
  if (config && config.apiEndPoint) {
4704
4707
  apiEndPoint = config.apiEndPoint;
@@ -4781,14 +4784,17 @@ class SessionService {
4781
4784
  let wrapObs = new Observable(subscriber => {
4782
4785
  this._uploadCount++;
4783
4786
  let obs = this.http.patch(sesssUrl, body, { withCredentials: this.withCredentials });
4784
- obs.subscribe((value) => {
4785
- subscriber.next(value);
4786
- }, error => {
4787
- this._uploadCount--;
4788
- subscriber.error(error);
4789
- }, () => {
4790
- this._uploadCount--;
4791
- subscriber.complete();
4787
+ obs.subscribe({
4788
+ next: (value) => {
4789
+ subscriber.next(value);
4790
+ },
4791
+ error: error => {
4792
+ this._uploadCount--;
4793
+ subscriber.error(error);
4794
+ }, complete: () => {
4795
+ this._uploadCount--;
4796
+ subscriber.complete();
4797
+ }
4792
4798
  });
4793
4799
  });
4794
4800
  return wrapObs;
@@ -7402,7 +7408,7 @@ AudioClipUIContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", v
7402
7408
  <audio-signal [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-signal>
7403
7409
  <audio-sonagram [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-sonagram>
7404
7410
  </div>
7405
- `, isInline: true, styles: ["div{margin:0;padding:0;top:0;left:0;width:100%;height:100%;position:relative;box-sizing:border-box;transform:none;overflow:hidden}\n", "canvas{top:0;left:0;width:0;height:0;cursor:ns-resize;position:absolute;zIndex:1;transform:none}\n", "audio-signal{top:0;left:0;position:absolute;zIndex:1;transform:none}\n", "audio-sonagram{top:0;left:0;position:absolute;zIndex:1;transform:none}\n"], dependencies: [{ kind: "component", type: AudioSignal, selector: "audio-signal" }, { kind: "component", type: Sonagram, selector: "audio-sonagram" }] });
7411
+ `, isInline: true, styles: ["div{margin:0;padding:0;top:0;left:0;width:100%;height:100%;position:relative;box-sizing:border-box;transform:none;overflow:hidden}\n", "canvas{top:0;left:0;width:0;height:0;cursor:ns-resize;position:absolute;z-index:1;transform:none}\n", "audio-signal{top:0;left:0;position:absolute;z-index:1;transform:none}\n", "audio-sonagram{top:0;left:0;position:absolute;z-index:1;transform:none}\n"], dependencies: [{ kind: "component", type: AudioSignal, selector: "audio-signal" }, { kind: "component", type: Sonagram, selector: "audio-sonagram" }] });
7406
7412
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioClipUIContainer, decorators: [{
7407
7413
  type: Component,
7408
7414
  args: [{ selector: 'app-audio', template: `
@@ -7412,7 +7418,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
7412
7418
  <audio-signal [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-signal>
7413
7419
  <audio-sonagram [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-sonagram>
7414
7420
  </div>
7415
- `, styles: ["div{margin:0;padding:0;top:0;left:0;width:100%;height:100%;position:relative;box-sizing:border-box;transform:none;overflow:hidden}\n", "canvas{top:0;left:0;width:0;height:0;cursor:ns-resize;position:absolute;zIndex:1;transform:none}\n", "audio-signal{top:0;left:0;position:absolute;zIndex:1;transform:none}\n", "audio-sonagram{top:0;left:0;position:absolute;zIndex:1;transform:none}\n"] }]
7421
+ `, styles: ["div{margin:0;padding:0;top:0;left:0;width:100%;height:100%;position:relative;box-sizing:border-box;transform:none;overflow:hidden}\n", "canvas{top:0;left:0;width:0;height:0;cursor:ns-resize;position:absolute;z-index:1;transform:none}\n", "audio-signal{top:0;left:0;position:absolute;z-index:1;transform:none}\n", "audio-sonagram{top:0;left:0;position:absolute;z-index:1;transform:none}\n"] }]
7416
7422
  }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { canvasRef: [{
7417
7423
  type: ViewChild,
7418
7424
  args: ['divider', { static: true }]
@@ -7726,8 +7732,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
7726
7732
  }] } });
7727
7733
 
7728
7734
  class AudioDisplay {
7729
- constructor(route, ref, eRef) {
7730
- this.route = route;
7735
+ constructor(ref, eRef) {
7731
7736
  this.ref = ref;
7732
7737
  this.eRef = eRef;
7733
7738
  this._audioClip = null;
@@ -7790,7 +7795,7 @@ class AudioDisplay {
7790
7795
  this.status = 'ERROR';
7791
7796
  }
7792
7797
  }
7793
- AudioDisplay.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioDisplay, deps: [{ token: i1$2.ActivatedRoute }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
7798
+ AudioDisplay.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioDisplay, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
7794
7799
  AudioDisplay.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: AudioDisplay, selector: "app-audiodisplay", inputs: { playStartAction: "playStartAction", playStopAction: "playStopAction", playSelectionAction: "playSelectionAction", autoPlayOnSelectToggleAction: "autoPlayOnSelectToggleAction", audioData: "audioData", audioClip: "audioClip" }, viewQueries: [{ propertyName: "audioDisplayScrollPane", first: true, predicate: AudioDisplayScrollPane, descendants: true, static: true }], ngImport: i0, template: `
7795
7800
 
7796
7801
  <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>
@@ -7821,7 +7826,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
7821
7826
  [zoomSelectedAction]="zoomSelectedAction"
7822
7827
  [zoomFitToPanelAction]="zoomFitToPanelAction"></audio-display-control>
7823
7828
  `, styles: [":host{display:flex;flex-direction:column;position:absolute;bottom:0;height:100%;width:100%;overflow:hidden;padding:20px;z-index:5;box-sizing:border-box;background-color:#e6e6e6}\n", "legend{margin-left:1em;padding:.2em .8em;font-size:.8em}\n", "fieldset{border:1px darkgray solid}\n"] }]
7824
- }], ctorParameters: function () { return [{ type: i1$2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { playStartAction: [{
7829
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { playStartAction: [{
7825
7830
  type: Input
7826
7831
  }], playStopAction: [{
7827
7832
  type: Input
@@ -7852,11 +7857,11 @@ class ResponsiveComponent {
7852
7857
  });
7853
7858
  }
7854
7859
  }
7855
- ResponsiveComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ResponsiveComponent, deps: [{ token: i1$3.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Directive });
7860
+ ResponsiveComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ResponsiveComponent, deps: [{ token: i1$2.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Directive });
7856
7861
  ResponsiveComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: ResponsiveComponent, ngImport: i0 });
7857
7862
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ResponsiveComponent, decorators: [{
7858
7863
  type: Directive
7859
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }]; } });
7864
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }]; } });
7860
7865
 
7861
7866
  class ScrollIntoViewDirective {
7862
7867
  constructor(elRef) {
@@ -8536,7 +8541,7 @@ class Prompting extends ResponsiveComponent {
8536
8541
  this.onPrevItem.emit();
8537
8542
  }
8538
8543
  }
8539
- Prompting.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: Prompting, deps: [{ token: i1$3.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component });
8544
+ Prompting.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: Prompting, deps: [{ token: i1$2.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component });
8540
8545
  Prompting.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: Prompting, selector: "app-sprprompting", inputs: { projectName: "projectName", startStopSignalState: "startStopSignalState", promptItem: "promptItem", showPrompt: "showPrompt", items: "items", selectedItemIdx: "selectedItemIdx", transportActions: "transportActions", enableDownload: "enableDownload", audioSignalCollapsed: "audioSignalCollapsed", displayAudioClip: "displayAudioClip", playStartAction: "playStartAction", playSelectionAction: "playSelectionAction", autoPlayOnSelectToggleAction: "autoPlayOnSelectToggleAction", playStopAction: "playStopAction" }, outputs: { onItemSelect: "onItemSelect", onNextItem: "onNextItem", onPrevItem: "onPrevItem" }, viewQueries: [{ propertyName: "simpleTrafficLight", first: true, predicate: SimpleTrafficLight, descendants: true, static: true }, { propertyName: "audioDisplay", first: true, predicate: AudioDisplay, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
8541
8546
 
8542
8547
  <app-simpletrafficlight [status]="startStopSignalState"></app-simpletrafficlight>
@@ -8585,7 +8590,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
8585
8590
 
8586
8591
 
8587
8592
  `, styles: [":host{position:relative;margin:0;padding:0;background:lightgrey;width:100%;flex:1;min-height:0px;display:flex;flex-direction:row;flex-wrap:nowrap}\n", "app-simpletrafficlight{margin:10px;min-height:0px;z-index:3}\n", "app-sprprogress{z-index:3}\n", "div{display:none;position:absolute;z-index:5}\n", "div.active{display:flex;position:absolute;bottom:0;height:90%;width:100%;overflow:hidden;padding:0;z-index:5;box-sizing:border-box;background-color:#0000}\n"] }]
8588
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }]; }, propDecorators: { simpleTrafficLight: [{
8593
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }]; }, propDecorators: { simpleTrafficLight: [{
8589
8594
  type: ViewChild,
8590
8595
  args: [SimpleTrafficLight, { static: true }]
8591
8596
  }], audioDisplay: [{
@@ -8636,7 +8641,7 @@ class SessionFinishedDialog {
8636
8641
  this.dialogRef.close();
8637
8642
  }
8638
8643
  }
8639
- SessionFinishedDialog.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SessionFinishedDialog, deps: [{ token: i1$4.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
8644
+ SessionFinishedDialog.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SessionFinishedDialog, deps: [{ token: i1$3.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
8640
8645
  SessionFinishedDialog.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: SessionFinishedDialog, selector: "spr-session-finished-dialog", ngImport: i0, template: `<h1 mat-dialog-title><mat-icon [style.color]="'green'">done_all</mat-icon> Session finished</h1>
8641
8646
  <div mat-dialog-content>
8642
8647
 
@@ -8646,7 +8651,7 @@ SessionFinishedDialog.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
8646
8651
  <div mat-dialog-actions>
8647
8652
  <button mat-button (click)="closeDialog()">OK</button>
8648
8653
  </div>
8649
- `, isInline: true, dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i1$4.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1$4.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1$4.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }] });
8654
+ `, isInline: true, dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i1$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }] });
8650
8655
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SessionFinishedDialog, decorators: [{
8651
8656
  type: Component,
8652
8657
  args: [{
@@ -8662,7 +8667,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
8662
8667
  </div>
8663
8668
  `
8664
8669
  }]
8665
- }], ctorParameters: function () { return [{ type: i1$4.MatDialogRef }, { type: undefined, decorators: [{
8670
+ }], ctorParameters: function () { return [{ type: i1$3.MatDialogRef }, { type: undefined, decorators: [{
8666
8671
  type: Inject,
8667
8672
  args: [MAT_DIALOG_DATA]
8668
8673
  }] }]; } });
@@ -8676,7 +8681,7 @@ class MessageDialog {
8676
8681
  this.dialogRef.close();
8677
8682
  }
8678
8683
  }
8679
- MessageDialog.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: MessageDialog, deps: [{ token: i1$4.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
8684
+ MessageDialog.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: MessageDialog, deps: [{ token: i1$3.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
8680
8685
  MessageDialog.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: MessageDialog, selector: "msg-dialog", ngImport: i0, template: `<h1 mat-dialog-title><mat-icon *ngIf="data.type==='error'" [style.color]="'red'">error</mat-icon>
8681
8686
  <mat-icon *ngIf="data.type==='warning'" [style.color]="'yellow'">warning</mat-icon>{{data.title}}</h1>
8682
8687
  <div mat-dialog-content>
@@ -8688,7 +8693,7 @@ MessageDialog.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version:
8688
8693
  <div mat-dialog-actions>
8689
8694
  <button mat-button (click)="closeDialog()">OK</button>
8690
8695
  </div>
8691
- `, isInline: true, dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i1$4.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1$4.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1$4.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }] });
8696
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i1$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }] });
8692
8697
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: MessageDialog, decorators: [{
8693
8698
  type: Component,
8694
8699
  args: [{
@@ -8706,7 +8711,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
8706
8711
  </div>
8707
8712
  `
8708
8713
  }]
8709
- }], ctorParameters: function () { return [{ type: i1$4.MatDialogRef }, { type: undefined, decorators: [{
8714
+ }], ctorParameters: function () { return [{ type: i1$3.MatDialogRef }, { type: undefined, decorators: [{
8710
8715
  type: Inject,
8711
8716
  args: [MAT_DIALOG_DATA]
8712
8717
  }] }]; } });
@@ -9007,62 +9012,64 @@ let BasicRecordingService = class BasicRecordingService {
9007
9012
  ausps.set('requestUUID', UUID.generate());
9008
9013
  }
9009
9014
  let obs = new Observable(observer => {
9010
- this.audioRequestByURL(baseAudioUrl, ausps).subscribe(resp => {
9011
- // Do not use Promise version, which does not work with Safari 13 (13.0.5)
9012
- if (resp.body) {
9013
- //console.debug("chunkAudioRequest: observer.closed: "+observer.closed);
9014
- //console.debug("Audio file bytes: "+resp.body.byteLength);
9015
- // Check original audio format
9016
- let wr = new WavReader(resp.body);
9017
- const pcmFmt = wr.readFormat();
9018
- const orgFl = wr.frameLength();
9019
- // if(pcmFmt){
9020
- // console.debug("Original WAVE format of download chunk: "+pcmFmt);
9021
- // }else{
9022
- // console.error("Could not read WAVE format of original download chunk!");
9023
- // }
9024
- // if(orgFl){
9025
- // console.debug("Original frame length of download chunk: "+orgFl);
9026
- // }else{
9027
- // console.error("Could not read WAVE format of original download chunk!");
9028
- // }
9029
- if (pcmFmt && orgFl) {
9030
- aCtx.decodeAudioData(resp.body, ab => {
9031
- //console.debug("Decoded audio chunk frames: "+ab.length);
9032
- let chDl = new ChunkDownload(pcmFmt, orgFl, ab);
9033
- observer.next(chDl);
9034
- observer.complete();
9035
- }, error => {
9036
- //if(error instanceof HttpErrorResponse) {
9037
- // if (error.status == 404) {
9038
- // // Interpret not as an error, the file ist not recorded yet
9039
- // observer.next(null);
9040
- // observer.complete()
9041
- // } else {
9042
- // // all other states are errors
9043
- console.error("Recordings service chunkAudioRequest error decoding audio data: " + error.name + ": " + error.message);
9044
- observer.error(error);
9045
- // }
9046
- // }
9047
- });
9015
+ this.audioRequestByURL(baseAudioUrl, ausps).subscribe({
9016
+ next: resp => {
9017
+ // Do not use Promise version, which does not work with Safari 13 (13.0.5)
9018
+ if (resp.body) {
9019
+ //console.debug("chunkAudioRequest: observer.closed: "+observer.closed);
9020
+ //console.debug("Audio file bytes: "+resp.body.byteLength);
9021
+ // Check original audio format
9022
+ let wr = new WavReader(resp.body);
9023
+ const pcmFmt = wr.readFormat();
9024
+ const orgFl = wr.frameLength();
9025
+ // if(pcmFmt){
9026
+ // console.debug("Original WAVE format of download chunk: "+pcmFmt);
9027
+ // }else{
9028
+ // console.error("Could not read WAVE format of original download chunk!");
9029
+ // }
9030
+ // if(orgFl){
9031
+ // console.debug("Original frame length of download chunk: "+orgFl);
9032
+ // }else{
9033
+ // console.error("Could not read WAVE format of original download chunk!");
9034
+ // }
9035
+ if (pcmFmt && orgFl) {
9036
+ aCtx.decodeAudioData(resp.body, ab => {
9037
+ //console.debug("Decoded audio chunk frames: "+ab.length);
9038
+ let chDl = new ChunkDownload(pcmFmt, orgFl, ab);
9039
+ observer.next(chDl);
9040
+ observer.complete();
9041
+ }, error => {
9042
+ //if(error instanceof HttpErrorResponse) {
9043
+ // if (error.status == 404) {
9044
+ // // Interpret not as an error, the file ist not recorded yet
9045
+ // observer.next(null);
9046
+ // observer.complete()
9047
+ // } else {
9048
+ // // all other states are errors
9049
+ console.error("Recordings service chunkAudioRequest error decoding audio data: " + error.name + ": " + error.message);
9050
+ observer.error(error);
9051
+ // }
9052
+ // }
9053
+ });
9054
+ }
9055
+ else {
9056
+ const errMsg = 'Could not parse audio header for format and/or frame length of download.';
9057
+ console.error(errMsg);
9058
+ observer.error(errMsg);
9059
+ }
9048
9060
  }
9049
9061
  else {
9050
- const errMsg = 'Could not parse audio header for format and/or frame length of download.';
9062
+ const errMsg = 'Fetching audio file: response has no body';
9051
9063
  console.error(errMsg);
9052
9064
  observer.error(errMsg);
9053
9065
  }
9066
+ }, error: (error) => {
9067
+ // all other states are errors
9068
+ //const errMsg='Fetching audio file HTTP error: '+error;
9069
+ //console.error(errMsg);
9070
+ observer.error(error);
9071
+ //observer.complete();
9054
9072
  }
9055
- else {
9056
- const errMsg = 'Fetching audio file: response has no body';
9057
- console.error(errMsg);
9058
- observer.error(errMsg);
9059
- }
9060
- }, (error) => {
9061
- // all other states are errors
9062
- //const errMsg='Fetching audio file HTTP error: '+error;
9063
- //console.error(errMsg);
9064
- observer.error(error);
9065
- //observer.complete();
9066
9073
  });
9067
9074
  });
9068
9075
  return obs;
@@ -9632,36 +9639,38 @@ class RecordingService extends BasicRecordingService {
9632
9639
  }
9633
9640
  if (recordingFile.session && recFileId) {
9634
9641
  let obs = this.fetchAudiofile(projectName, recordingFile.session, recFileId);
9635
- obs.subscribe(resp => {
9636
- // Do not use Promise version, which does not work with Safari 13 (13.0.5)
9637
- if (resp.body) {
9638
- aCtx.decodeAudioData(resp.body, ab => {
9639
- observer.next(ab);
9640
- observer.complete();
9641
- }, error => {
9642
- observer.error(error);
9643
- observer.complete();
9644
- });
9645
- }
9646
- else {
9647
- observer.error('Fetching audio file: response has no body');
9648
- }
9649
- }, (err) => {
9650
- if (err instanceof HttpErrorResponse) {
9651
- if (err.status == 404) {
9652
- // Interpret not as an error, the file ist not recorded yet
9653
- observer.next(null);
9654
- observer.complete();
9642
+ obs.subscribe({
9643
+ next: resp => {
9644
+ // Do not use Promise version, which does not work with Safari 13 (13.0.5)
9645
+ if (resp.body) {
9646
+ aCtx.decodeAudioData(resp.body, ab => {
9647
+ observer.next(ab);
9648
+ observer.complete();
9649
+ }, error => {
9650
+ observer.error(error);
9651
+ observer.complete();
9652
+ });
9653
+ }
9654
+ else {
9655
+ observer.error('Fetching audio file: response has no body');
9656
+ }
9657
+ }, error: (err) => {
9658
+ if (err instanceof HttpErrorResponse) {
9659
+ if (err.status == 404) {
9660
+ // Interpret not as an error, the file ist not recorded yet
9661
+ observer.next(null);
9662
+ observer.complete();
9663
+ }
9664
+ else {
9665
+ // all other states are errors
9666
+ observer.error(err);
9667
+ observer.complete();
9668
+ }
9655
9669
  }
9656
9670
  else {
9657
- // all other states are errors
9658
9671
  observer.error(err);
9659
- observer.complete();
9660
9672
  }
9661
9673
  }
9662
- else {
9663
- observer.error(err);
9664
- }
9665
9674
  });
9666
9675
  }
9667
9676
  else {
@@ -9678,49 +9687,50 @@ class RecordingService extends BasicRecordingService {
9678
9687
  }
9679
9688
  if (recordingFile.session && recFileId) {
9680
9689
  let obs = this.fetchAudiofile(projectName, recordingFile.session, recFileId);
9681
- obs.subscribe(resp => {
9682
- //console.log("Fetched audio file. HTTP response status: "+resp.status+", type: "+resp.type+", byte length: "+ resp.body.byteLength);
9683
- // Do not use Promise version, which does not work with Safari 13 (13.0.5)
9684
- if (resp.body) {
9685
- aCtx.decodeAudioData(resp.body, ab => {
9686
- let abs = new AudioBufferSource(ab);
9687
- let adh = new AudioDataHolder(abs);
9688
- RecordingFileUtils.setAudioData(recordingFile, adh);
9689
- if (this.debugDelay > 0) {
9690
- window.setTimeout(() => {
9690
+ obs.subscribe({ next: resp => {
9691
+ //console.log("Fetched audio file. HTTP response status: "+resp.status+", type: "+resp.type+", byte length: "+ resp.body.byteLength);
9692
+ // Do not use Promise version, which does not work with Safari 13 (13.0.5)
9693
+ if (resp.body) {
9694
+ aCtx.decodeAudioData(resp.body, ab => {
9695
+ let abs = new AudioBufferSource(ab);
9696
+ let adh = new AudioDataHolder(abs);
9697
+ RecordingFileUtils.setAudioData(recordingFile, adh);
9698
+ if (this.debugDelay > 0) {
9699
+ window.setTimeout(() => {
9700
+ observer.next(recordingFile);
9701
+ observer.complete();
9702
+ }, this.debugDelay);
9703
+ }
9704
+ else {
9691
9705
  observer.next(recordingFile);
9692
9706
  observer.complete();
9693
- }, this.debugDelay);
9707
+ }
9708
+ }, error => {
9709
+ observer.error(error);
9710
+ observer.complete();
9711
+ });
9712
+ }
9713
+ else {
9714
+ observer.error('Fetching audio file: response has no body');
9715
+ }
9716
+ },
9717
+ error: (err) => {
9718
+ if (err instanceof HttpErrorResponse) {
9719
+ if (err.status == 404) {
9720
+ // Interpret not as an error, the file ist not recorded yet
9721
+ observer.next(null);
9722
+ observer.complete();
9694
9723
  }
9695
9724
  else {
9696
- observer.next(recordingFile);
9725
+ // all other states are errors
9726
+ observer.error(err);
9697
9727
  observer.complete();
9698
9728
  }
9699
- }, error => {
9700
- observer.error(error);
9701
- observer.complete();
9702
- });
9703
- }
9704
- else {
9705
- observer.error('Fetching audio file: response has no body');
9706
- }
9707
- }, (err) => {
9708
- if (err instanceof HttpErrorResponse) {
9709
- if (err.status == 404) {
9710
- // Interpret not as an error, the file ist not recorded yet
9711
- observer.next(null);
9712
- observer.complete();
9713
9729
  }
9714
9730
  else {
9715
- // all other states are errors
9716
9731
  observer.error(err);
9717
- observer.complete();
9718
9732
  }
9719
- }
9720
- else {
9721
- observer.error(err);
9722
- }
9723
- });
9733
+ } });
9724
9734
  }
9725
9735
  else {
9726
9736
  observer.error();
@@ -10042,83 +10052,88 @@ class RecordingService extends BasicRecordingService {
10042
10052
  let wobs = new Observable(observer => {
10043
10053
  if (recordingFile.session) {
10044
10054
  let obs = this.fetchSprAudiofile(projectName, recordingFile.session, recordingFile.itemCode, recordingFile.version);
10045
- obs.subscribe(resp => {
10046
- //console.log("Fetched audio file. HTTP response status: "+resp.status+", type: "+resp.type+", byte length: "+ resp.body.byteLength);
10047
- // Do not use Promise version, which does not work with Safari 13 (13.0.5)
10055
+ obs.subscribe({
10056
+ next: resp => {
10057
+ //console.log("Fetched audio file. HTTP response status: "+resp.status+", type: "+resp.type+", byte length: "+ resp.body.byteLength);
10058
+ // Do not use Promise version, which does not work with Safari 13 (13.0.5)
10059
+ if (resp.body) {
10060
+ aCtx.decodeAudioData(resp.body, ab => {
10061
+ let abs = new AudioBufferSource(ab);
10062
+ RecordingFileUtils.setAudioData(recordingFile, new AudioDataHolder(abs));
10063
+ if (this.debugDelay > 0) {
10064
+ window.setTimeout(() => {
10065
+ observer.next(recordingFile);
10066
+ observer.complete();
10067
+ }, this.debugDelay);
10068
+ }
10069
+ else {
10070
+ observer.next(recordingFile);
10071
+ observer.complete();
10072
+ }
10073
+ }, error => {
10074
+ observer.error(error);
10075
+ observer.complete();
10076
+ });
10077
+ }
10078
+ else {
10079
+ observer.error('Fetching audio file: response has no body');
10080
+ }
10081
+ },
10082
+ error: (err) => {
10083
+ if (err instanceof HttpErrorResponse && err.status == 404) {
10084
+ // Interpret not as an error, the file ist not recorded yet
10085
+ observer.next(null);
10086
+ observer.complete();
10087
+ }
10088
+ else {
10089
+ // all other states are errors
10090
+ observer.error(err);
10091
+ }
10092
+ }
10093
+ });
10094
+ }
10095
+ else {
10096
+ observer.error();
10097
+ }
10098
+ });
10099
+ return wobs;
10100
+ }
10101
+ fetchRecordingFile(aCtx, projectName, sessId, itemcode, version) {
10102
+ let wobs = new Observable(observer => {
10103
+ let obs = this.fetchSprAudiofile(projectName, sessId, itemcode, version);
10104
+ obs.subscribe({ next: resp => {
10105
+ // Do not use Promise version, which does not work with Safari 13
10048
10106
  if (resp.body) {
10049
10107
  aCtx.decodeAudioData(resp.body, ab => {
10050
10108
  let abs = new AudioBufferSource(ab);
10051
- RecordingFileUtils.setAudioData(recordingFile, new AudioDataHolder(abs));
10109
+ let adh = new AudioDataHolder(abs);
10110
+ let rf = new SprRecordingFile(sessId, itemcode, version, adh);
10052
10111
  if (this.debugDelay > 0) {
10053
10112
  window.setTimeout(() => {
10054
- observer.next(recordingFile);
10113
+ observer.next(rf);
10055
10114
  observer.complete();
10056
10115
  }, this.debugDelay);
10057
10116
  }
10058
10117
  else {
10059
- observer.next(recordingFile);
10118
+ observer.next(rf);
10060
10119
  observer.complete();
10061
10120
  }
10062
- }, error => {
10063
- observer.error(error);
10064
- observer.complete();
10065
10121
  });
10066
10122
  }
10067
10123
  else {
10068
- observer.error('Fetching audio file: response has no body');
10124
+ observer.error();
10069
10125
  }
10070
- }, (err) => {
10126
+ },
10127
+ error: (err) => {
10071
10128
  if (err instanceof HttpErrorResponse && err.status == 404) {
10072
10129
  // Interpret not as an error, the file ist not recorded yet
10073
10130
  observer.next(null);
10074
10131
  observer.complete();
10075
10132
  }
10076
10133
  else {
10077
- // all other states are errors
10134
+ // all other errors are real errors
10078
10135
  observer.error(err);
10079
10136
  }
10080
- });
10081
- }
10082
- else {
10083
- observer.error();
10084
- }
10085
- });
10086
- return wobs;
10087
- }
10088
- fetchRecordingFile(aCtx, projectName, sessId, itemcode, version) {
10089
- let wobs = new Observable(observer => {
10090
- let obs = this.fetchSprAudiofile(projectName, sessId, itemcode, version);
10091
- obs.subscribe(resp => {
10092
- // Do not use Promise version, which does not work with Safari 13
10093
- if (resp.body) {
10094
- aCtx.decodeAudioData(resp.body, ab => {
10095
- let abs = new AudioBufferSource(ab);
10096
- let adh = new AudioDataHolder(abs);
10097
- let rf = new SprRecordingFile(sessId, itemcode, version, adh);
10098
- if (this.debugDelay > 0) {
10099
- window.setTimeout(() => {
10100
- observer.next(rf);
10101
- observer.complete();
10102
- }, this.debugDelay);
10103
- }
10104
- else {
10105
- observer.next(rf);
10106
- observer.complete();
10107
- }
10108
- });
10109
- }
10110
- else {
10111
- observer.error();
10112
- }
10113
- }, (err) => {
10114
- if (err instanceof HttpErrorResponse && err.status == 404) {
10115
- // Interpret not as an error, the file ist not recorded yet
10116
- observer.next(null);
10117
- observer.complete();
10118
- }
10119
- else {
10120
- // all other errors are real errors
10121
- observer.error(err);
10122
10137
  }
10123
10138
  });
10124
10139
  });
@@ -10577,7 +10592,7 @@ class UploadStatus {
10577
10592
  constructor() {
10578
10593
  this._awaitNewUpload = false;
10579
10594
  this.spinnerMode = 'determinate';
10580
- this._colorStatus = 'primary';
10595
+ this.colorStatus = 'primary';
10581
10596
  this._value = 100;
10582
10597
  this.displayValue = null;
10583
10598
  this.toolTipText = '';
@@ -10616,13 +10631,13 @@ class UploadStatus {
10616
10631
  set status(status) {
10617
10632
  this._status = status;
10618
10633
  if ('accent' === status) {
10619
- this._colorStatus = 'accent';
10634
+ this.colorStatus = 'accent';
10620
10635
  }
10621
10636
  else if ('warn' === status) {
10622
- this._colorStatus = 'warn';
10637
+ this.colorStatus = 'warn';
10623
10638
  }
10624
10639
  else {
10625
- this._colorStatus = 'primary';
10640
+ this.colorStatus = 'primary';
10626
10641
  }
10627
10642
  this._updateSpinner();
10628
10643
  }
@@ -10632,12 +10647,14 @@ class UploadStatus {
10632
10647
  }
10633
10648
  UploadStatus.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UploadStatus, deps: [], target: i0.ɵɵFactoryTarget.Component });
10634
10649
  UploadStatus.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: UploadStatus, selector: "app-uploadstatus", inputs: { value: "value", awaitNewUpload: "awaitNewUpload", status: "status" }, ngImport: i0, template: `
10635
- <mat-progress-spinner [mode]="spinnerMode" [color]="status" [diameter]="30" [strokeWidth]="5" [value]="_value" [matTooltip]="toolTipText"></mat-progress-spinner>
10650
+ <mat-progress-spinner [mode]="spinnerMode" [color]="colorStatus" [diameter]="30" [strokeWidth]="5" [value]="_value"
10651
+ [matTooltip]="toolTipText"></mat-progress-spinner>
10636
10652
  `, isInline: true, styles: [":host{text-align:left}\n", "mat-progress-spinner{display:inline-block}\n"], dependencies: [{ kind: "component", type: i3$1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
10637
10653
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UploadStatus, decorators: [{
10638
10654
  type: Component,
10639
10655
  args: [{ selector: 'app-uploadstatus', template: `
10640
- <mat-progress-spinner [mode]="spinnerMode" [color]="status" [diameter]="30" [strokeWidth]="5" [value]="_value" [matTooltip]="toolTipText"></mat-progress-spinner>
10656
+ <mat-progress-spinner [mode]="spinnerMode" [color]="colorStatus" [diameter]="30" [strokeWidth]="5" [value]="_value"
10657
+ [matTooltip]="toolTipText"></mat-progress-spinner>
10641
10658
  `, styles: [":host{text-align:left}\n", "mat-progress-spinner{display:inline-block}\n"] }]
10642
10659
  }], propDecorators: { value: [{
10643
10660
  type: Input
@@ -10746,7 +10763,7 @@ class TransportPanel extends ResponsiveComponent {
10746
10763
  }
10747
10764
  }
10748
10765
  }
10749
- TransportPanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TransportPanel, deps: [{ token: i1$3.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component });
10766
+ TransportPanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TransportPanel, deps: [{ token: i1$2.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component });
10750
10767
  TransportPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: TransportPanel, selector: "app-sprtransport", inputs: { readonly: "readonly", actions: "actions", navigationEnabled: "navigationEnabled", pausingEnabled: "pausingEnabled" }, usesInheritance: true, ngImport: i0, template: `
10751
10768
  <button id="bwdBtn" *ngIf="navigationEnabled" (click)="actions.bwdAction.perform()" [disabled]="bwdDisabled()"
10752
10769
  mat-raised-button>
@@ -10791,7 +10808,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
10791
10808
  </button>
10792
10809
 
10793
10810
  `, styles: [":host{flex:20;align-self:center;width:100%;text-align:center;align-content:center;margin:0}\n", "div{display:inline;flex:0}\n", "button{touch-action:manipulation}\n"] }]
10794
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }]; }, propDecorators: { readonly: [{
10811
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }]; }, propDecorators: { readonly: [{
10795
10812
  type: Input
10796
10813
  }], actions: [{
10797
10814
  type: Input
@@ -10863,7 +10880,7 @@ class ControlPanel extends ResponsiveComponent {
10863
10880
  return this._ready;
10864
10881
  }
10865
10882
  }
10866
- ControlPanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ControlPanel, deps: [{ token: i1$3.BreakpointObserver }, { token: i1$4.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
10883
+ ControlPanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ControlPanel, deps: [{ token: i1$2.BreakpointObserver }, { token: i1$3.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
10867
10884
  ControlPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ControlPanel, selector: "app-sprcontrolpanel", inputs: { readonly: "readonly", transportActions: "transportActions", processing: "processing", statusMsg: "statusMsg", statusAlertType: "statusAlertType", statusWaiting: "statusWaiting", uploadStatus: "uploadStatus", uploadProgress: "uploadProgress", currentRecording: "currentRecording", enableUploadRecordings: "enableUploadRecordings", navigationEnabled: "navigationEnabled", ready: "ready" }, viewQueries: [{ propertyName: "statusDisplay", first: true, predicate: StatusDisplay, descendants: true, static: true }, { propertyName: "transportPanel", first: true, predicate: TransportPanel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
10868
10885
  <div *ngIf="!screenXs" style="flex-direction: row" >
10869
10886
  <app-sprstatusdisplay style="flex:0 0 0" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"
@@ -10873,9 +10890,9 @@ ControlPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version:
10873
10890
  [status]="uploadStatus" [awaitNewUpload]="processing"></app-uploadstatus>
10874
10891
  <app-readystateindicator [ready]="_ready"></app-readystateindicator>
10875
10892
  </div>
10876
- <div *ngIf="screenXs"style="flex-direction: column" >
10893
+ <div *ngIf="screenXs" style="flex-direction: column" >
10877
10894
  <div style="flex-direction: row" class="flexFill" >
10878
- <app-sprstatusdisplay style="flex:10 0 0;flex-align:left" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"
10895
+ <app-sprstatusdisplay style="flex:10 0 0" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"
10879
10896
  class="hidden-xs"></app-sprstatusdisplay>
10880
10897
  <app-uploadstatus style="flex:0 0 0" *ngIf="enableUploadRecordings" [value]="uploadProgress"
10881
10898
  [status]="uploadStatus" [awaitNewUpload]="processing"></app-uploadstatus>
@@ -10896,9 +10913,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
10896
10913
  [status]="uploadStatus" [awaitNewUpload]="processing"></app-uploadstatus>
10897
10914
  <app-readystateindicator [ready]="_ready"></app-readystateindicator>
10898
10915
  </div>
10899
- <div *ngIf="screenXs"style="flex-direction: column" >
10916
+ <div *ngIf="screenXs" style="flex-direction: column" >
10900
10917
  <div style="flex-direction: row" class="flexFill" >
10901
- <app-sprstatusdisplay style="flex:10 0 0;flex-align:left" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"
10918
+ <app-sprstatusdisplay style="flex:10 0 0" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"
10902
10919
  class="hidden-xs"></app-sprstatusdisplay>
10903
10920
  <app-uploadstatus style="flex:0 0 0" *ngIf="enableUploadRecordings" [value]="uploadProgress"
10904
10921
  [status]="uploadStatus" [awaitNewUpload]="processing"></app-uploadstatus>
@@ -10908,7 +10925,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
10908
10925
 
10909
10926
  </div>
10910
10927
  `, styles: ["div{align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n"] }]
10911
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }, { type: i1$4.MatDialog }]; }, propDecorators: { statusDisplay: [{
10928
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }, { type: i1$3.MatDialog }]; }, propDecorators: { statusDisplay: [{
10912
10929
  type: ViewChild,
10913
10930
  args: [StatusDisplay, { static: true }]
10914
10931
  }], transportPanel: [{
@@ -11559,7 +11576,7 @@ class RecordingItemControls extends ResponsiveComponent {
11559
11576
  // this.status = 'ERROR';
11560
11577
  }
11561
11578
  }
11562
- RecordingItemControls.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecordingItemControls, deps: [{ token: i1$3.BreakpointObserver }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
11579
+ RecordingItemControls.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecordingItemControls, deps: [{ token: i1$2.BreakpointObserver }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
11563
11580
  RecordingItemControls.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: RecordingItemControls, selector: "spr-recordingitemcontrols", inputs: { audioSignalCollapsed: "audioSignalCollapsed", enableDownload: "enableDownload", peakDbLvl: "peakDbLvl", agc: "agc", disableAudioDetails: "disableAudioDetails", audioLoaded: "audioLoaded", playStartAction: "playStartAction", playStopAction: "playStopAction", displayLevelInfos: "displayLevelInfos" }, outputs: { onShowRecordingDetails: "onShowRecordingDetails", onDownloadRecording: "onDownloadRecording" }, usesInheritance: true, ngImport: i0, template: `
11564
11581
  <button matTooltip="Start playback" (click)="playStartAction?.perform()"
11565
11582
  [disabled]="playStartAction?.disabled"
@@ -11608,7 +11625,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
11608
11625
  [style.color]="(peakDbLvl > warnDbLevel)?'red':'black'">{{peakDbLvl | number:'1.1-1'}} dB </span></td></tr>
11609
11626
  <tr *ngIf="_agc"><td>AGC:</td><td><span matTooltip="Auto gain control">{{agcString}}</span></td></tr></table></div>
11610
11627
  `, styles: [":host{flex:0;width:100%;background:darkgray;padding:4px;box-sizing:border-box;height:100%;display:flex;flex-direction:row;flex-wrap:nowrap}\n", "span{flex:0;font-weight:700;display:inline-block;white-space:nowrap;box-sizing:border-box}\n", "button{touch-action:manipulation}\n"] }]
11611
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { audioSignalCollapsed: [{
11628
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { audioSignalCollapsed: [{
11612
11629
  type: Input
11613
11630
  }], enableDownload: [{
11614
11631
  type: Input
@@ -11689,7 +11706,7 @@ class RecordingItemDisplay extends ResponsiveComponent {
11689
11706
  let peakDBVal = levelInfo.powerLevelDB();
11690
11707
  if (this.peakDbLvl < peakDBVal) {
11691
11708
  this.peakDbLvl = peakDBVal;
11692
- // the event comes from outside of an Angular zone
11709
+ // the event comes from outside an Angular zone
11693
11710
  this.changeDetectorRef.detectChanges();
11694
11711
  }
11695
11712
  this.liveLevel.update(levelInfo);
@@ -11705,7 +11722,7 @@ class RecordingItemDisplay extends ResponsiveComponent {
11705
11722
  this.changeDetectorRef.detectChanges();
11706
11723
  }
11707
11724
  }
11708
- RecordingItemDisplay.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecordingItemDisplay, deps: [{ token: i1$3.BreakpointObserver }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
11725
+ RecordingItemDisplay.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecordingItemDisplay, deps: [{ token: i1$2.BreakpointObserver }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
11709
11726
  RecordingItemDisplay.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: RecordingItemDisplay, selector: "spr-recordingitemdisplay", inputs: { streamingMode: "streamingMode", audioSignalCollapsed: "audioSignalCollapsed", enableDownload: "enableDownload", agc: "agc", playStartAction: "playStartAction", playStopAction: "playStopAction", displayAudioBuffer: "displayAudioBuffer", displayLevelInfos: "displayLevelInfos" }, outputs: { onShowRecordingDetails: "onShowRecordingDetails", onDownloadRecording: "onDownloadRecording" }, viewQueries: [{ propertyName: "liveLevel", first: true, predicate: LevelBar, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
11710
11727
  <div [class]="{audioStatusDisplay:!screenXs,audioStatusDisplayXs:screenXs}">
11711
11728
  <audio-levelbar style="flex:1 0 1%" [streamingMode]="streamingMode" [displayLevelInfos]="_displayLevelInfos"></audio-levelbar>
@@ -11720,7 +11737,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
11720
11737
  <spr-recordingitemcontrols style="flex:0 0 0px" [audioLoaded]="displayAudioBuffer!==null" [playStartAction]="playStartAction" [playStopAction]="playStopAction" [peakDbLvl]="peakDbLvl" [agc]="_agc" (onShowRecordingDetails)="onShowRecordingDetails.emit()"></spr-recordingitemcontrols>
11721
11738
  </div>
11722
11739
  `, styles: ["div{width:100%;background:darkgray;padding:4px;box-sizing:border-box;flex-wrap:nowrap}\n", "audio-levelbar{box-sizing:border-box}\n", ".audioStatusDisplay{display:flex;flex-direction:row;height:100px;min-height:100px}\n", ".audioStatusDisplayXs{display:flex;flex-direction:column;height:125px;min-height:125px}\n"] }]
11723
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { liveLevel: [{
11740
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { liveLevel: [{
11724
11741
  type: ViewChild,
11725
11742
  args: [LevelBar, { static: true }]
11726
11743
  }], streamingMode: [{
@@ -13971,7 +13988,7 @@ class SessionManager extends BasicRecorder {
13971
13988
  }
13972
13989
  }
13973
13990
  }
13974
- SessionManager.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SessionManager, deps: [{ token: i1$3.BreakpointObserver }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i1$4.MatDialog }, { token: SessionService }, { token: RecordingService }, { token: SpeechRecorderUploader }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
13991
+ SessionManager.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SessionManager, deps: [{ token: i1$2.BreakpointObserver }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i1$3.MatDialog }, { token: SessionService }, { token: RecordingService }, { token: SpeechRecorderUploader }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
13975
13992
  SessionManager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: SessionManager, selector: "app-sprrecordingsession", inputs: { projectName: "projectName", dataSaved: "dataSaved" }, host: { listeners: { "window:keypress": "onKeyPress($event)", "window:keydown": "onKeyDown($event)" } }, providers: [SessionService], viewQueries: [{ propertyName: "prompting", first: true, predicate: Prompting, descendants: true, static: true }, { propertyName: "liveLevelDisplay", first: true, predicate: LevelBar, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
13976
13993
  <app-warningbar [show]="isTestSession()" warningText="Test recording only!"></app-warningbar>
13977
13994
  <app-warningbar [show]="isDefaultAudioTestSession()" warningText="This test uses default audio device! Regular sessions may require a particular audio device (microphone)!"></app-warningbar>
@@ -14074,7 +14091,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
14074
14091
  </div>
14075
14092
  </div>
14076
14093
  `, styles: [":host{flex:2;background:lightgrey;display:flex;flex-direction:column;margin:0;padding:0;min-height:0px;overflow:hidden}\n", ".ricontrols{display:flex;padding:4px;box-sizing:border-box;height:100%;flex-direction:row;justify-content:flex-end;align-items:center;align-content:center}\n", ".dark{background:darkgray}\n", ".controlpanel{display:flex;flex-direction:row;align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n", ".audioStatusDisplay{display:flex;flex-direction:row;height:100px;min-height:100px}\n", ".audioStatusDisplayXs{display:flex;flex-direction:column;height:125px;min-height:125px}\n"] }]
14077
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i1$4.MatDialog }, { type: SessionService }, { type: RecordingService }, { type: SpeechRecorderUploader }, { type: SpeechRecorderConfig, decorators: [{
14094
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i1$3.MatDialog }, { type: SessionService }, { type: RecordingService }, { type: SpeechRecorderUploader }, { type: SpeechRecorderConfig, decorators: [{
14078
14095
  type: Inject,
14079
14096
  args: [SPEECHRECORDER_CONFIG]
14080
14097
  }] }]; }, propDecorators: { projectName: [{
@@ -14520,7 +14537,7 @@ class SpeechrecorderngComponent extends RecorderComponent {
14520
14537
  }
14521
14538
  else {
14522
14539
  // all this attempts to customize the message do not work anymore (for security reasons)!!
14523
- var message = "Please do not leave the page, until all recordings are uploaded!";
14540
+ const message = "Please do not leave the page, until all recordings are uploaded!";
14524
14541
  alert(message);
14525
14542
  e = e || window.event;
14526
14543
  if (e) {
@@ -14644,7 +14661,7 @@ class SpeechrecorderngComponent extends RecorderComponent {
14644
14661
  projUrl = window.location.protocol + '//' + window.location.hostname + ':' + window.location.port + '/wikispeech/rest/projects/?sessionId=' + this.sessionId;
14645
14662
  }
14646
14663
  if (projUrl) {
14647
- var pLoader = new XMLHttpRequest();
14664
+ const pLoader = new XMLHttpRequest();
14648
14665
  pLoader.open("GET", projUrl, true);
14649
14666
  pLoader.setRequestHeader('Accept', 'application/json');
14650
14667
  pLoader.responseType = "json";
@@ -14679,7 +14696,7 @@ class SpeechrecorderngComponent extends RecorderComponent {
14679
14696
  this.sm.statusMsg = 'ERROR: Recording.';
14680
14697
  }
14681
14698
  }
14682
- SpeechrecorderngComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SpeechrecorderngComponent, deps: [{ token: i1$2.ActivatedRoute }, { token: i1$2.Router }, { token: i0.ChangeDetectorRef }, { token: SessionService }, { token: ProjectService }, { token: ScriptService }, { token: RecordingService }, { token: SpeechRecorderUploader }], target: i0.ɵɵFactoryTarget.Component });
14699
+ SpeechrecorderngComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SpeechrecorderngComponent, deps: [{ token: i4$2.ActivatedRoute }, { token: i4$2.Router }, { token: i0.ChangeDetectorRef }, { token: SessionService }, { token: ProjectService }, { token: ScriptService }, { token: RecordingService }, { token: SpeechRecorderUploader }], target: i0.ɵɵFactoryTarget.Component });
14683
14700
  SpeechrecorderngComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: SpeechrecorderngComponent, selector: "app-speechrecorder", providers: [SessionService], viewQueries: [{ propertyName: "sm", first: true, predicate: SessionManager, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
14684
14701
  <app-sprrecordingsession [projectName]="project?.name" [dataSaved]="dataSaved"></app-sprrecordingsession>
14685
14702
  `, isInline: true, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0}\n"], dependencies: [{ kind: "component", type: SessionManager, selector: "app-sprrecordingsession", inputs: ["projectName", "dataSaved"] }] });
@@ -14688,7 +14705,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
14688
14705
  args: [{ selector: 'app-speechrecorder', providers: [SessionService], template: `
14689
14706
  <app-sprrecordingsession [projectName]="project?.name" [dataSaved]="dataSaved"></app-sprrecordingsession>
14690
14707
  `, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0}\n"] }]
14691
- }], ctorParameters: function () { return [{ type: i1$2.ActivatedRoute }, { type: i1$2.Router }, { type: i0.ChangeDetectorRef }, { type: SessionService }, { type: ProjectService }, { type: ScriptService }, { type: RecordingService }, { type: SpeechRecorderUploader }]; }, propDecorators: { sm: [{
14708
+ }], ctorParameters: function () { return [{ type: i4$2.ActivatedRoute }, { type: i4$2.Router }, { type: i0.ChangeDetectorRef }, { type: SessionService }, { type: ProjectService }, { type: ScriptService }, { type: RecordingService }, { type: SpeechRecorderUploader }]; }, propDecorators: { sm: [{
14692
14709
  type: ViewChild,
14693
14710
  args: [SessionManager, { static: true }]
14694
14711
  }] } });
@@ -14894,7 +14911,7 @@ class AudioDisplayPlayer {
14894
14911
  this.status = 'ERROR';
14895
14912
  }
14896
14913
  }
14897
- AudioDisplayPlayer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioDisplayPlayer, deps: [{ token: i1$2.ActivatedRoute }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
14914
+ AudioDisplayPlayer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioDisplayPlayer, deps: [{ token: i4$2.ActivatedRoute }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
14898
14915
  AudioDisplayPlayer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: AudioDisplayPlayer, selector: "app-audiodisplayplayer", inputs: { playStartAction: "playStartAction", playStopAction: "playStopAction", playSelectionAction: "playSelectionAction", autoPlayOnSelectToggleAction: "autoPlayOnSelectToggleAction", audioData: "audioData", audioClip: "audioClip" }, viewQueries: [{ propertyName: "audioDisplayScrollPane", first: true, predicate: AudioDisplayScrollPane, descendants: true, static: true }], ngImport: i0, template: `
14899
14916
 
14900
14917
  <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>
@@ -14925,7 +14942,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
14925
14942
  [zoomSelectedAction]="zoomSelectedAction"
14926
14943
  [zoomFitToPanelAction]="zoomFitToPanelAction"></audio-display-control><p>{{status}}
14927
14944
  `, styles: [":host{display:flex;flex-direction:column;position:absolute;bottom:0;height:100%;width:100%;overflow:hidden;padding:20px;z-index:5;box-sizing:border-box;background-color:#000000bf}\n"] }]
14928
- }], ctorParameters: function () { return [{ type: i1$2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { playStartAction: [{
14945
+ }], ctorParameters: function () { return [{ type: i4$2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { playStartAction: [{
14929
14946
  type: Input
14930
14947
  }], playStopAction: [{
14931
14948
  type: Input
@@ -15075,37 +15092,39 @@ class RecordingFileService extends BasicRecordingService {
15075
15092
  let wobs = new Observable(observer => {
15076
15093
  if (recordingFile.recordingFileId) {
15077
15094
  let obs = this.fetchAudiofile(recordingFile.recordingFileId);
15078
- obs.subscribe(resp => {
15079
- // Do not use Promise version, which does not work with Safari 13
15080
- if (resp.body) {
15081
- aCtx.decodeAudioData(resp.body, ab => {
15082
- let as = new AudioBufferSource(ab);
15083
- RecordingFileUtils.setAudioData(recordingFile, new AudioDataHolder(as));
15084
- if (this.debugDelay > 0) {
15085
- window.setTimeout(() => {
15095
+ obs.subscribe({ next: resp => {
15096
+ // Do not use Promise version, which does not work with Safari 13
15097
+ if (resp.body) {
15098
+ aCtx.decodeAudioData(resp.body, ab => {
15099
+ let as = new AudioBufferSource(ab);
15100
+ RecordingFileUtils.setAudioData(recordingFile, new AudioDataHolder(as));
15101
+ if (this.debugDelay > 0) {
15102
+ window.setTimeout(() => {
15103
+ observer.next(recordingFile);
15104
+ observer.complete();
15105
+ }, this.debugDelay);
15106
+ }
15107
+ else {
15086
15108
  observer.next(recordingFile);
15087
15109
  observer.complete();
15088
- }, this.debugDelay);
15089
- }
15090
- else {
15091
- observer.next(recordingFile);
15092
- observer.complete();
15093
- }
15094
- });
15095
- }
15096
- else {
15097
- observer.error('Received no audio data!');
15098
- }
15099
- }, (error) => {
15100
- if (error.status == 404) {
15101
- // Interpret not as an error, the file ist not recorded yet
15102
- observer.next(null);
15103
- observer.complete();
15104
- }
15105
- else {
15106
- // all other states are errors
15107
- observer.error(error);
15108
- observer.complete();
15110
+ }
15111
+ });
15112
+ }
15113
+ else {
15114
+ observer.error('Received no audio data!');
15115
+ }
15116
+ },
15117
+ error: (error) => {
15118
+ if (error.status == 404) {
15119
+ // Interpret not as an error, the file ist not recorded yet
15120
+ observer.next(null);
15121
+ observer.complete();
15122
+ }
15123
+ else {
15124
+ // all other states are errors
15125
+ observer.error(error);
15126
+ observer.complete();
15127
+ }
15109
15128
  }
15110
15129
  });
15111
15130
  }
@@ -15119,81 +15138,39 @@ class RecordingFileService extends BasicRecordingService {
15119
15138
  let wobs = new Observable(observer => {
15120
15139
  let rf = null;
15121
15140
  let rfDescrObs = this.recordingFileDescrObserver(recordingFileId);
15122
- rfDescrObs.subscribe(value => {
15123
- rf = value;
15124
- }, (error) => {
15125
- observer.error(error);
15126
- }, () => {
15127
- let rfAudioObs = this.fetchAudiofile(recordingFileId);
15128
- rfAudioObs.subscribe(resp => {
15129
- // Do not use Promise version, which does not work with Safari 13
15130
- if (resp.body) {
15131
- aCtx.decodeAudioData(resp.body, ab => {
15132
- if (rf) {
15133
- let as = new AudioBufferSource(ab);
15134
- RecordingFileUtils.setAudioData(rf, new AudioDataHolder(as));
15135
- }
15136
- else {
15137
- observer.error('Recording file object null');
15138
- }
15139
- if (this.debugDelay > 0) {
15140
- window.setTimeout(() => {
15141
- observer.next(rf);
15142
- observer.complete();
15143
- }, this.debugDelay);
15141
+ rfDescrObs.subscribe({ next: value => {
15142
+ rf = value;
15143
+ }, error: (error) => {
15144
+ observer.error(error);
15145
+ }, complete: () => {
15146
+ let rfAudioObs = this.fetchAudiofile(recordingFileId);
15147
+ rfAudioObs.subscribe({
15148
+ next: resp => {
15149
+ // Do not use Promise version, which does not work with Safari 13
15150
+ if (resp.body) {
15151
+ aCtx.decodeAudioData(resp.body, ab => {
15152
+ if (rf) {
15153
+ let as = new AudioBufferSource(ab);
15154
+ RecordingFileUtils.setAudioData(rf, new AudioDataHolder(as));
15155
+ }
15156
+ else {
15157
+ observer.error('Recording file object null');
15158
+ }
15159
+ if (this.debugDelay > 0) {
15160
+ window.setTimeout(() => {
15161
+ observer.next(rf);
15162
+ observer.complete();
15163
+ }, this.debugDelay);
15164
+ }
15165
+ else {
15166
+ observer.next(rf);
15167
+ observer.complete();
15168
+ }
15169
+ });
15144
15170
  }
15145
15171
  else {
15146
- observer.next(rf);
15147
- observer.complete();
15172
+ observer.error('Received no audio data');
15148
15173
  }
15149
- });
15150
- }
15151
- else {
15152
- observer.error('Received no audio data');
15153
- }
15154
- }, (error) => {
15155
- if (error.status == 404) {
15156
- // Interpret not as an error, the file ist not recorded yet
15157
- observer.next(null);
15158
- observer.complete();
15159
- }
15160
- else {
15161
- // all other states are errors
15162
- observer.error(error);
15163
- observer.complete();
15164
- }
15165
- });
15166
- });
15167
- });
15168
- return wobs;
15169
- }
15170
- fetchSprRecordingFile(aCtx, recordingFileId) {
15171
- let wobs = new Observable(observer => {
15172
- let rf = null;
15173
- let rfDescrObs = this.sprRecordingFileDescrObserver(recordingFileId);
15174
- rfDescrObs.subscribe(value => {
15175
- rf = value;
15176
- }, (error) => {
15177
- observer.error(error);
15178
- }, () => {
15179
- let sampleCnt = null;
15180
- if (rf && rf.channels && rf.frames) {
15181
- sampleCnt = rf.channels * rf.frames;
15182
- }
15183
- // TODO use download storage type depending on sample count of file
15184
- if (rf && rf.samplerate && sampleCnt != null && sampleCnt > this._maxAutoNetMemStoreSamples) {
15185
- const baseUrl = this.recoFileUrl(recordingFileId);
15186
- const obNetAb = this.chunkAudioRequestToNetAudioBuffer(aCtx, baseUrl, 0, rf?.samplerate, BasicRecordingService.DEFAULT_CHUNKED_DOWNLOAD_SECONDS, rf.frames);
15187
- obNetAb.subscribe({
15188
- next: (nab) => {
15189
- let adh = new AudioDataHolder(nab);
15190
- if (rf) {
15191
- RecordingFileUtils.setAudioData(rf, adh);
15192
- observer.next(rf);
15193
- }
15194
- },
15195
- complete: () => {
15196
- observer.complete();
15197
15174
  },
15198
15175
  error: (error) => {
15199
15176
  if (error.status == 404) {
@@ -15209,47 +15186,97 @@ class RecordingFileService extends BasicRecordingService {
15209
15186
  }
15210
15187
  });
15211
15188
  }
15212
- else {
15213
- let rfAudioObs = this.fetchAudiofile(recordingFileId);
15214
- rfAudioObs.subscribe(resp => {
15215
- // Do not use Promise version, which does not work with Safari 13
15216
- if (resp.body) {
15217
- aCtx.decodeAudioData(resp.body, ab => {
15189
+ });
15190
+ });
15191
+ return wobs;
15192
+ }
15193
+ fetchSprRecordingFile(aCtx, recordingFileId) {
15194
+ let wobs = new Observable(observer => {
15195
+ let rf = null;
15196
+ let rfDescrObs = this.sprRecordingFileDescrObserver(recordingFileId);
15197
+ rfDescrObs.subscribe({ next: value => {
15198
+ rf = value;
15199
+ },
15200
+ error: (error) => {
15201
+ observer.error(error);
15202
+ }, complete: () => {
15203
+ let sampleCnt = null;
15204
+ if (rf && rf.channels && rf.frames) {
15205
+ sampleCnt = rf.channels * rf.frames;
15206
+ }
15207
+ // TODO use download storage type depending on sample count of file
15208
+ if (rf && rf.samplerate && sampleCnt != null && sampleCnt > this._maxAutoNetMemStoreSamples) {
15209
+ const baseUrl = this.recoFileUrl(recordingFileId);
15210
+ const obNetAb = this.chunkAudioRequestToNetAudioBuffer(aCtx, baseUrl, 0, rf?.samplerate, BasicRecordingService.DEFAULT_CHUNKED_DOWNLOAD_SECONDS, rf.frames);
15211
+ obNetAb.subscribe({
15212
+ next: (nab) => {
15213
+ let adh = new AudioDataHolder(nab);
15218
15214
  if (rf) {
15219
- let as = new AudioBufferSource(ab);
15220
- let adh = new AudioDataHolder(as);
15221
15215
  RecordingFileUtils.setAudioData(rf, adh);
15216
+ observer.next(rf);
15217
+ }
15218
+ },
15219
+ complete: () => {
15220
+ observer.complete();
15221
+ },
15222
+ error: (error) => {
15223
+ if (error.status == 404) {
15224
+ // Interpret not as an error, the file ist not recorded yet
15225
+ observer.next(null);
15226
+ observer.complete();
15222
15227
  }
15223
15228
  else {
15224
- observer.error('Recording file object null');
15229
+ // all other states are errors
15230
+ observer.error(error);
15231
+ observer.complete();
15225
15232
  }
15226
- if (this.debugDelay > 0) {
15227
- window.setTimeout(() => {
15228
- observer.next(rf);
15229
- observer.complete();
15230
- }, this.debugDelay);
15233
+ }
15234
+ });
15235
+ }
15236
+ else {
15237
+ let rfAudioObs = this.fetchAudiofile(recordingFileId);
15238
+ rfAudioObs.subscribe({ next: resp => {
15239
+ // Do not use Promise version, which does not work with Safari 13
15240
+ if (resp.body) {
15241
+ aCtx.decodeAudioData(resp.body, ab => {
15242
+ if (rf) {
15243
+ let as = new AudioBufferSource(ab);
15244
+ let adh = new AudioDataHolder(as);
15245
+ RecordingFileUtils.setAudioData(rf, adh);
15246
+ }
15247
+ else {
15248
+ observer.error('Recording file object null');
15249
+ }
15250
+ if (this.debugDelay > 0) {
15251
+ window.setTimeout(() => {
15252
+ observer.next(rf);
15253
+ observer.complete();
15254
+ }, this.debugDelay);
15255
+ }
15256
+ else {
15257
+ observer.next(rf);
15258
+ observer.complete();
15259
+ }
15260
+ });
15231
15261
  }
15232
15262
  else {
15233
- observer.next(rf);
15263
+ observer.error('Received no audio data');
15264
+ }
15265
+ },
15266
+ error: (error) => {
15267
+ if (error.status == 404) {
15268
+ // Interpret not as an error, the file ist not recorded yet
15269
+ observer.next(null);
15234
15270
  observer.complete();
15235
15271
  }
15236
- });
15237
- }
15238
- else {
15239
- observer.error('Received no audio data');
15240
- }
15241
- }, (error) => {
15242
- if (error.status == 404) {
15243
- // Interpret not as an error, the file ist not recorded yet
15244
- observer.next(null);
15245
- observer.complete();
15246
- }
15247
- else {
15248
- // all other states are errors
15249
- observer.error(error);
15250
- observer.complete();
15251
- }
15252
- });
15272
+ else {
15273
+ // all other states are errors
15274
+ observer.error(error);
15275
+ observer.complete();
15276
+ }
15277
+ }
15278
+ });
15279
+ }
15253
15280
  }
15254
15281
  });
15255
15282
  });
@@ -15301,7 +15328,7 @@ RecordingFileNaviComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0
15301
15328
  <legend>Versions</legend>
15302
15329
  <mat-progress-spinner *ngIf="naviInfoLoading" mode="indeterminate" [diameter]="15"></mat-progress-spinner>
15303
15330
  <select *ngIf="!naviInfoLoading" [disabled]="versions==null || versions.length==1" (change)="selectVersionChange($event)">
15304
- <option *ngFor="let v of versions; let i = index" [selected]="v===version" value="{{v}}">{{v}}<span *ngIf="i==0"> (latest)</span></option>
15331
+ <option *ngFor="let v of versions; let i = index" [selected]="v===version" value="{{v}}">{{v}}<ng-container *ngIf="i==0"> (latest)</ng-container></option>
15305
15332
  </select>
15306
15333
  </fieldset>
15307
15334
  <fieldset>
@@ -15336,7 +15363,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
15336
15363
  <legend>Versions</legend>
15337
15364
  <mat-progress-spinner *ngIf="naviInfoLoading" mode="indeterminate" [diameter]="15"></mat-progress-spinner>
15338
15365
  <select *ngIf="!naviInfoLoading" [disabled]="versions==null || versions.length==1" (change)="selectVersionChange($event)">
15339
- <option *ngFor="let v of versions; let i = index" [selected]="v===version" value="{{v}}">{{v}}<span *ngIf="i==0"> (latest)</span></option>
15366
+ <option *ngFor="let v of versions; let i = index" [selected]="v===version" value="{{v}}">{{v}}<ng-container *ngIf="i==0"> (latest)</ng-container></option>
15340
15367
  </select>
15341
15368
  </fieldset>
15342
15369
  <fieldset>
@@ -15699,47 +15726,49 @@ class RecordingFileViewComponent extends AudioDisplayPlayer {
15699
15726
  let audioContext = AudioContextProvider.audioContextInstance();
15700
15727
  if (audioContext) {
15701
15728
  this.audioFetching = true;
15702
- this.recordingFileService.fetchSprRecordingFile(audioContext, rfId).subscribe(value => {
15703
- this.audioFetching = false;
15704
- this.status = 'Audio file loaded.';
15705
- let clip = null;
15706
- this.recordingFile = value;
15707
- if (this.recordingFile) {
15708
- let ab = this.recordingFile.audioDataHolder;
15709
- if (ab) {
15710
- clip = new AudioClip(ab);
15711
- let esffsr = null;
15712
- let eeffsr = null;
15713
- let esr = null;
15714
- if (clip.audioDataHolder != null) {
15715
- esr = ab.sampleRate;
15716
- if (esr != null) {
15717
- esffsr = RecordingFileUtil.editStartFrameForSampleRate(this.recordingFile, esr);
15718
- eeffsr = RecordingFileUtil.editEndFrameForSampleRate(this.recordingFile, esr);
15719
- }
15720
- let sel = null;
15721
- if (esffsr != null) {
15722
- if (eeffsr != null) {
15723
- sel = new Selection(ab.sampleRate, esffsr, eeffsr);
15729
+ this.recordingFileService.fetchSprRecordingFile(audioContext, rfId).subscribe({
15730
+ next: value => {
15731
+ this.audioFetching = false;
15732
+ this.status = 'Audio file loaded.';
15733
+ let clip = null;
15734
+ this.recordingFile = value;
15735
+ if (this.recordingFile) {
15736
+ let ab = this.recordingFile.audioDataHolder;
15737
+ if (ab) {
15738
+ clip = new AudioClip(ab);
15739
+ let esffsr = null;
15740
+ let eeffsr = null;
15741
+ let esr = null;
15742
+ if (clip.audioDataHolder != null) {
15743
+ esr = ab.sampleRate;
15744
+ if (esr != null) {
15745
+ esffsr = RecordingFileUtil.editStartFrameForSampleRate(this.recordingFile, esr);
15746
+ eeffsr = RecordingFileUtil.editEndFrameForSampleRate(this.recordingFile, esr);
15724
15747
  }
15725
- else {
15726
- //let ch0 = ab.getChannelData(0);
15727
- let frameLength = ab.frameLen;
15728
- sel = new Selection(esr, esffsr, frameLength);
15748
+ let sel = null;
15749
+ if (esffsr != null) {
15750
+ if (eeffsr != null) {
15751
+ sel = new Selection(ab.sampleRate, esffsr, eeffsr);
15752
+ }
15753
+ else {
15754
+ //let ch0 = ab.getChannelData(0);
15755
+ let frameLength = ab.frameLen;
15756
+ sel = new Selection(esr, esffsr, frameLength);
15757
+ }
15729
15758
  }
15759
+ else if (eeffsr != null) {
15760
+ sel = new Selection(esr, 0, eeffsr);
15761
+ }
15762
+ clip.selection = sel;
15730
15763
  }
15731
- else if (eeffsr != null) {
15732
- sel = new Selection(esr, 0, eeffsr);
15733
- }
15734
- clip.selection = sel;
15735
15764
  }
15736
15765
  }
15766
+ this.audioClip = clip;
15767
+ this.loadedRecfile();
15768
+ }, error: error1 => {
15769
+ this.audioFetching = false;
15770
+ this.status = 'Error loading audio file!';
15737
15771
  }
15738
- this.audioClip = clip;
15739
- this.loadedRecfile();
15740
- }, error1 => {
15741
- this.audioFetching = false;
15742
- this.status = 'Error loading audio file!';
15743
15772
  });
15744
15773
  }
15745
15774
  }
@@ -15767,7 +15796,7 @@ class RecordingFileViewComponent extends AudioDisplayPlayer {
15767
15796
  this.lastAction.disabled = (this.posInList == null || itemCnt == null || this.posInList >= itemCnt - 1);
15768
15797
  }
15769
15798
  loadSession(sessionId) {
15770
- // load session and recording file meta data only when on init and when session changes
15799
+ // load session and recording file metadata only when on init and when session changes
15771
15800
  if (sessionId != this.sessionId) {
15772
15801
  // tell UI that we are working...
15773
15802
  this.naviInfoLoading = true;
@@ -15805,7 +15834,7 @@ class RecordingFileViewComponent extends AudioDisplayPlayer {
15805
15834
  else {
15806
15835
  // rec file with itemcode already exists, add (push) this version ...
15807
15836
  exRfsForIc.push(rfd);
15808
- // .. and sort latest version (highest version number) to lowest index
15837
+ // ... and sort latest version (highest version number) to lowest index
15809
15838
  exRfsForIc.sort((rfd1, rfd2) => {
15810
15839
  return rfd2.version - rfd1.version;
15811
15840
  });
@@ -15859,7 +15888,7 @@ class RecordingFileViewComponent extends AudioDisplayPlayer {
15859
15888
  }
15860
15889
  }
15861
15890
  }
15862
- RecordingFileViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecordingFileViewComponent, deps: [{ token: RecordingFileService }, { token: RecordingService }, { token: SessionService }, { token: i1$2.Router }, { token: i1$2.ActivatedRoute }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1$4.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
15891
+ RecordingFileViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecordingFileViewComponent, deps: [{ token: RecordingFileService }, { token: RecordingService }, { token: SessionService }, { token: i4$2.Router }, { token: i4$2.ActivatedRoute }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1$3.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
15863
15892
  RecordingFileViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: RecordingFileViewComponent, selector: "app-audiodisplayplayer", viewQueries: [{ propertyName: "ac", first: true, predicate: AudioDisplayScrollPane, descendants: true }], usesInheritance: true, ngImport: i0, template: `
15864
15893
 
15865
15894
  <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>
@@ -15898,7 +15927,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
15898
15927
  <app-recording-file-navi [items]="availRecFiles?.length" [itemPos]="posInList" [version]="recordingFileVersion" [versions]="versions" [firstAction]="firstAction" [prevAction]="prevAction" [nextAction]="nextAction" [lastAction]="lastAction" [selectVersion]="toVersionAction" [naviInfoLoading]="naviInfoLoading"></app-recording-file-navi>
15899
15928
  </div>
15900
15929
  `, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0;overflow:hidden;padding:20px;z-index:5;box-sizing:border-box;background-color:#fff}\n", ".ctrlview{display:flex;flex-direction:row}\n", "audio-display-control{flex:3}\n"] }]
15901
- }], ctorParameters: function () { return [{ type: RecordingFileService }, { type: RecordingService }, { type: SessionService }, { type: i1$2.Router }, { type: i1$2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1$4.MatDialog }]; }, propDecorators: { ac: [{
15930
+ }], ctorParameters: function () { return [{ type: RecordingFileService }, { type: RecordingService }, { type: SessionService }, { type: i4$2.Router }, { type: i4$2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1$3.MatDialog }]; }, propDecorators: { ac: [{
15902
15931
  type: ViewChild,
15903
15932
  args: [AudioDisplayScrollPane]
15904
15933
  }] } });
@@ -15963,27 +15992,28 @@ class RecordingFileUI extends RecordingFileViewComponent {
15963
15992
  sf = s.startFrame;
15964
15993
  ef = s.endFrame;
15965
15994
  }
15966
- this.recordingFileService.saveEditSelection(this.recordingFile.recordingFileId, sr, sf, ef).subscribe((value) => {
15967
- }, () => {
15968
- this.dialog.open(MessageDialog, {
15969
- data: {
15970
- type: 'error',
15971
- title: 'Save selection edit error',
15972
- msg: "Could not save edit selection to WikiSpeech server!",
15973
- advice: "Please check network connection and server state."
15974
- }
15975
- });
15976
- }, () => {
15977
- // Or use returned selection value from server?
15978
- this.savedEditSelection = s;
15979
- this.editSaved = true;
15980
- this.snackBar.open('Selection edit saved successfully.', 'OK', { duration: 1500 });
15995
+ this.recordingFileService.saveEditSelection(this.recordingFile.recordingFileId, sr, sf, ef).subscribe({ next: (value) => { },
15996
+ error: () => {
15997
+ this.dialog.open(MessageDialog, {
15998
+ data: {
15999
+ type: 'error',
16000
+ title: 'Save selection edit error',
16001
+ msg: "Could not save edit selection to WikiSpeech server!",
16002
+ advice: "Please check network connection and server state."
16003
+ }
16004
+ });
16005
+ }, complete: () => {
16006
+ // Or use returned selection value from server?
16007
+ this.savedEditSelection = s;
16008
+ this.editSaved = true;
16009
+ this.snackBar.open('Selection edit saved successfully.', 'OK', { duration: 1500 });
16010
+ }
15981
16011
  });
15982
16012
  }
15983
16013
  }
15984
16014
  }
15985
16015
  }
15986
- RecordingFileUI.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecordingFileUI, deps: [{ token: RecordingFileService }, { token: RecordingService }, { token: SessionService }, { token: i1$2.Router }, { token: i1$2.ActivatedRoute }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1$4.MatDialog }, { token: i6.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component });
16016
+ RecordingFileUI.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecordingFileUI, deps: [{ token: RecordingFileService }, { token: RecordingService }, { token: SessionService }, { token: i4$2.Router }, { token: i4$2.ActivatedRoute }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1$3.MatDialog }, { token: i6.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component });
15987
16017
  RecordingFileUI.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: RecordingFileUI, selector: "app-audiodisplayplayer", usesInheritance: true, ngImport: i0, template: `
15988
16018
  <h1>Recording file editing</h1>
15989
16019
  <p>On export or delivery the editing selection of the recording file is cut out. If no editing selection is applied the original file is exported.</p>
@@ -16028,7 +16058,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
16028
16058
 
16029
16059
  <button mat-raised-button color="accent" (click)="applySelection()" [disabled]="editSaved">{{this.applyButtonText()}}</button>
16030
16060
  `, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0;overflow:hidden;padding:20px;z-index:5;box-sizing:border-box;background-color:#fff}\n", ".ctrlview{display:flex;flex-direction:row}\n", "audio-display-control{flex:3}\n"] }]
16031
- }], ctorParameters: function () { return [{ type: RecordingFileService }, { type: RecordingService }, { type: SessionService }, { type: i1$2.Router }, { type: i1$2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1$4.MatDialog }, { type: i6.MatSnackBar }]; } });
16061
+ }], ctorParameters: function () { return [{ type: RecordingFileService }, { type: RecordingService }, { type: SessionService }, { type: i4$2.Router }, { type: i4$2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1$3.MatDialog }, { type: i6.MatSnackBar }]; } });
16032
16062
 
16033
16063
  class MediaUtils {
16034
16064
  static toMediaTime(timeInSeconds) {
@@ -16165,7 +16195,7 @@ RecordingList.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version:
16165
16195
  </mat-card-content>
16166
16196
  </mat-card>
16167
16197
 
16168
- `, isInline: true, styles: [".monospaced{font-family:monospace}.mat-cell,.mat-header-cell{padding-left:5px;padding-right:5px}.mat-card,.mat-card-header,.mat-card-content{width:auto}.flexForm{display:flex;flex-direction:column;width:auto}.flexFill{margin:0;width:100%;height:100%;min-width:100%;min-height:100%}\n", ":host{position:relative;margin:0;padding:0;background:lightgrey;width:100%;flex:1;overflow-y:auto;min-height:0px}\n", ".selected{font-weight:700}\n"], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3$2.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "component", type: i3$2.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i3$2.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { kind: "component", type: i4$2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4$2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4$2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4$2.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i4$2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4$2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4$2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4$2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4$2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4$2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: ScrollIntoViewDirective, selector: "[scrollIntoViewToBottom]", inputs: ["scrollIntoViewToBottom"] }, { kind: "pipe", type: i1$1.DatePipe, name: "date" }] });
16198
+ `, isInline: true, styles: [".monospaced{font-family:monospace}.mat-cell,.mat-header-cell{padding-left:5px;padding-right:5px}.mat-card,.mat-card-header,.mat-card-content{width:auto}.flexForm{display:flex;flex-direction:column;width:auto}.flexFill{margin:0;width:100%;height:100%;min-width:100%;min-height:100%}\n", ":host{position:relative;margin:0;padding:0;background:lightgrey;width:100%;flex:1;overflow-y:auto;min-height:0px}\n", ".selected{font-weight:700}\n"], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3$2.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "component", type: i3$2.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i3$2.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { kind: "component", type: i4$3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4$3.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4$3.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4$3.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i4$3.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4$3.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4$3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4$3.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4$3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4$3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: ScrollIntoViewDirective, selector: "[scrollIntoViewToBottom]", inputs: ["scrollIntoViewToBottom"] }, { kind: "pipe", type: i1$1.DatePipe, name: "date" }] });
16169
16199
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecordingList, decorators: [{
16170
16200
  type: Component,
16171
16201
  args: [{ selector: 'app-recordinglist', template: `
@@ -16246,7 +16276,7 @@ class RecorderCombiPane extends ResponsiveComponent {
16246
16276
  this.recordingListComp.selectTop();
16247
16277
  }
16248
16278
  }
16249
- RecorderCombiPane.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecorderCombiPane, deps: [{ token: i1$3.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component });
16279
+ RecorderCombiPane.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecorderCombiPane, deps: [{ token: i1$2.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component });
16250
16280
  RecorderCombiPane.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: RecorderCombiPane, selector: "app-recordercombipane", inputs: { selectDisabled: "selectDisabled", selectedRecordingFile: "selectedRecordingFile", audioSignalCollapsed: "audioSignalCollapsed", displayAudioClip: "displayAudioClip", playStartAction: "playStartAction", playSelectionAction: "playSelectionAction", autoPlayOnSelectToggleAction: "autoPlayOnSelectToggleAction", playStopAction: "playStopAction" }, outputs: { selectedRecordingFileChanged: "selectedRecordingFileChanged" }, viewQueries: [{ propertyName: "recordingListComp", first: true, predicate: RecordingList, descendants: true }, { propertyName: "audioDisplay", first: true, predicate: AudioDisplay, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
16251
16281
  <div class="scrollList">
16252
16282
  <app-recordinglist [selectedRecordingFile]="selectedRecordingFile" [selectDisabled]="selectDisabled" (selectedRecordingFileChanged)="selectRecordingFile($event)"></app-recordinglist>
@@ -16275,7 +16305,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
16275
16305
  [playStopAction]="playStopAction"></app-audiodisplay>
16276
16306
  </div>
16277
16307
  `, styles: [".monospaced{font-family:monospace}.mat-cell,.mat-header-cell{padding-left:5px;padding-right:5px}.mat-card,.mat-card-header,.mat-card-content{width:auto}.flexForm{display:flex;flex-direction:column;width:auto}.flexFill{margin:0;width:100%;height:100%;min-width:100%;min-height:100%}\n", ":host{background-color:#ff0;position:relative;margin:0;padding:0;background:lightgrey;width:100%;flex:1;min-height:0px}\n", ".scrollList{margin:0;padding:0;background:lightgrey;width:100%;height:100%;overflow-y:auto}\n", ".collapsable{display:none;position:absolute;z-index:5}\n", ".collapsable.active{display:flex;position:absolute;bottom:0;height:90%;width:100%;overflow:hidden;padding:0;z-index:200;box-sizing:border-box;background-color:#0000}\n"] }]
16278
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }]; }, propDecorators: { recordingListComp: [{
16308
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }]; }, propDecorators: { recordingListComp: [{
16279
16309
  type: ViewChild,
16280
16310
  args: [RecordingList]
16281
16311
  }], selectDisabled: [{
@@ -16302,11 +16332,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
16302
16332
  }] } });
16303
16333
 
16304
16334
  class AudioRecorder extends BasicRecorder {
16305
- constructor(bpo, changeDetectorRef, renderer, route, dialog, sessionService, recFileService, uploader, config) {
16335
+ constructor(bpo, changeDetectorRef, renderer, dialog, sessionService, recFileService, uploader, config) {
16306
16336
  super(bpo, changeDetectorRef, dialog, sessionService, uploader, config);
16307
16337
  this.bpo = bpo;
16308
16338
  this.renderer = renderer;
16309
- this.route = route;
16310
16339
  this.recFileService = recFileService;
16311
16340
  this.uploader = uploader;
16312
16341
  this._project = null;
@@ -17214,7 +17243,7 @@ class AudioRecorder extends BasicRecorder {
17214
17243
  }
17215
17244
  }
17216
17245
  }
17217
- AudioRecorder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioRecorder, deps: [{ token: i1$3.BreakpointObserver }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i1$2.ActivatedRoute }, { token: i1$4.MatDialog }, { token: SessionService }, { token: RecordingService }, { token: SpeechRecorderUploader }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
17246
+ AudioRecorder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioRecorder, deps: [{ token: i1$2.BreakpointObserver }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i1$3.MatDialog }, { token: SessionService }, { token: RecordingService }, { token: SpeechRecorderUploader }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
17218
17247
  AudioRecorder.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: AudioRecorder, selector: "app-audiorecorder", inputs: { projectName: "projectName", dataSaved: "dataSaved" }, host: { listeners: { "window:keypress": "onKeyPress($event)", "window:keydown": "onKeyDown($event)" } }, providers: [SessionService], viewQueries: [{ propertyName: "recorderCombiPane", first: true, predicate: RecorderCombiPane, descendants: true, static: true }, { propertyName: "liveLevelDisplay", first: true, predicate: LevelBar, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
17219
17248
  <app-warningbar [show]="isTestSession()" warningText="Test recording only!"></app-warningbar>
17220
17249
  <app-warningbar [show]="isDefaultAudioTestSession()"
@@ -17335,7 +17364,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
17335
17364
  </div>
17336
17365
  </div>
17337
17366
  `, styles: [":host{flex:2;background:lightgrey;display:flex;flex-direction:column;margin:0;padding:0;height:100%;min-height:0px;overflow:hidden}\n", ".ricontrols{padding:4px;box-sizing:border-box;height:100%}\n", ".dark{background:darkgray}\n", ".controlpanel{display:flex;flex-direction:row;align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n", ".startstop{width:100%;flex:1 0 30%;align-items:center;text-align:center;align-content:center}\n", ".startstopscreenxs{width:100%;flex:1 0 100%;align-items:center;text-align:center;align-content:center}\n", ".bigbutton{min-width:70px;min-height:50px;font-size:50px;border-radius:20px}\n", ".audioStatusDisplay{display:flex;flex-direction:row;height:100px;min-height:100px}\n", ".audioStatusDisplayXs{display:flex;flex-direction:column;height:125px;min-height:125px}\n"] }]
17338
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i1$2.ActivatedRoute }, { type: i1$4.MatDialog }, { type: SessionService }, { type: RecordingService }, { type: SpeechRecorderUploader }, { type: SpeechRecorderConfig, decorators: [{
17367
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i1$3.MatDialog }, { type: SessionService }, { type: RecordingService }, { type: SpeechRecorderUploader }, { type: SpeechRecorderConfig, decorators: [{
17339
17368
  type: Inject,
17340
17369
  args: [SPEECHRECORDER_CONFIG]
17341
17370
  }] }]; }, propDecorators: { projectName: [{
@@ -17380,7 +17409,7 @@ class AudioRecorderComponent extends RecorderComponent {
17380
17409
  }
17381
17410
  else {
17382
17411
  // all this attempts to customize the message do not work anymore (for security reasons)!!
17383
- var message = "Please do not leave the page, until all recordings are uploaded!";
17412
+ const message = "Please do not leave the page, until all recordings are uploaded!";
17384
17413
  alert(message);
17385
17414
  e = e || window.event;
17386
17415
  if (e) {
@@ -17480,7 +17509,7 @@ class AudioRecorderComponent extends RecorderComponent {
17480
17509
  return this.dataSaved && !this.ar.isActive();
17481
17510
  }
17482
17511
  }
17483
- AudioRecorderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioRecorderComponent, deps: [{ token: i1$2.ActivatedRoute }, { token: i1$2.Router }, { token: i0.ChangeDetectorRef }, { token: SessionService }, { token: ProjectService }, { token: SpeechRecorderUploader }], target: i0.ɵɵFactoryTarget.Component });
17512
+ AudioRecorderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioRecorderComponent, deps: [{ token: i4$2.ActivatedRoute }, { token: i4$2.Router }, { token: i0.ChangeDetectorRef }, { token: SessionService }, { token: ProjectService }, { token: SpeechRecorderUploader }], target: i0.ɵɵFactoryTarget.Component });
17484
17513
  AudioRecorderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: AudioRecorderComponent, selector: "app-audiorecorder-comp", providers: [SessionService], viewQueries: [{ propertyName: "ar", first: true, predicate: AudioRecorder, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
17485
17514
  <app-audiorecorder [projectName]="_project?.name" [dataSaved]="dataSaved"></app-audiorecorder>
17486
17515
  `, isInline: true, styles: [":host{flex:2;display:flex;height:100%;flex-direction:column;min-height:0}\n"], dependencies: [{ kind: "component", type: AudioRecorder, selector: "app-audiorecorder", inputs: ["projectName", "dataSaved"] }] });
@@ -17489,7 +17518,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
17489
17518
  args: [{ selector: 'app-audiorecorder-comp', providers: [SessionService], template: `
17490
17519
  <app-audiorecorder [projectName]="_project?.name" [dataSaved]="dataSaved"></app-audiorecorder>
17491
17520
  `, styles: [":host{flex:2;display:flex;height:100%;flex-direction:column;min-height:0}\n"] }]
17492
- }], ctorParameters: function () { return [{ type: i1$2.ActivatedRoute }, { type: i1$2.Router }, { type: i0.ChangeDetectorRef }, { type: SessionService }, { type: ProjectService }, { type: SpeechRecorderUploader }]; }, propDecorators: { ar: [{
17521
+ }], ctorParameters: function () { return [{ type: i4$2.ActivatedRoute }, { type: i4$2.Router }, { type: i0.ChangeDetectorRef }, { type: SessionService }, { type: ProjectService }, { type: SpeechRecorderUploader }]; }, propDecorators: { ar: [{
17493
17522
  type: ViewChild,
17494
17523
  args: [AudioRecorder, { static: true }]
17495
17524
  }] } });
@@ -17525,7 +17554,7 @@ class SpeechrecorderngModule {
17525
17554
  }
17526
17555
  SpeechrecorderngModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SpeechrecorderngModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
17527
17556
  SpeechrecorderngModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.12", ngImport: i0, type: SpeechrecorderngModule, declarations: [AudioSignal, Sonagram, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar, Progress, SimpleTrafficLight, Recinstructions, Prompter, PromptContainer, PromptingContainer, Prompting, StatusDisplay,
17528
- ProgressDisplay, RecordingItemDisplay, RecordingItemControls, UploadStatus, TransportPanel, WakeLockIndicator, ReadyStateIndicator, ControlPanel, WarningBar, AudioRecorder, SessionManager, MessageDialog, SessionFinishedDialog, SpeechrecorderngComponent, AudioRecorderComponent, RecordingFileViewComponent, RecordingFileUI, ScrollIntoViewDirective, RecordingFileNaviComponent, RecordingFileMetaComponent, RecordingList, RecorderCombiPane, AudioRecorder], imports: [i1$2.RouterModule, CommonModule, MatIconModule, MatButtonModule, MatDialogModule, MatProgressBarModule, MatProgressSpinnerModule, MatTooltipModule, HttpClientModule, MatCheckboxModule, MatCardModule, MatDividerModule, MatGridListModule, MatTableModule, MatInputModule, MatSelectModule, MatSnackBarModule, MatMenuModule], exports: [MessageDialog, SpeechrecorderngComponent, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar, AudioRecorder] });
17557
+ ProgressDisplay, RecordingItemDisplay, RecordingItemControls, UploadStatus, TransportPanel, WakeLockIndicator, ReadyStateIndicator, ControlPanel, WarningBar, AudioRecorder, SessionManager, MessageDialog, SessionFinishedDialog, SpeechrecorderngComponent, AudioRecorderComponent, RecordingFileViewComponent, RecordingFileUI, ScrollIntoViewDirective, RecordingFileNaviComponent, RecordingFileMetaComponent, RecordingList, RecorderCombiPane, AudioRecorder], imports: [i4$2.RouterModule, CommonModule, MatIconModule, MatButtonModule, MatDialogModule, MatProgressBarModule, MatProgressSpinnerModule, MatTooltipModule, HttpClientModule, MatCheckboxModule, MatCardModule, MatDividerModule, MatGridListModule, MatTableModule, MatInputModule, MatSelectModule, MatSnackBarModule, MatMenuModule], exports: [MessageDialog, SpeechrecorderngComponent, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar, AudioRecorder] });
17529
17558
  SpeechrecorderngModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SpeechrecorderngModule, providers: [SessionService, ProjectService, ScriptService, RecordingService, RecordingFileService, SpeechRecorderUploader], imports: [RouterModule.forChild(SPR_ROUTES), CommonModule, MatIconModule, MatButtonModule, MatDialogModule, MatProgressBarModule, MatProgressSpinnerModule, MatTooltipModule, HttpClientModule, MatCheckboxModule, MatCardModule, MatDividerModule, MatGridListModule, MatTableModule, MatInputModule, MatSelectModule, MatSnackBarModule, MatMenuModule] });
17530
17559
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SpeechrecorderngModule, decorators: [{
17531
17560
  type: NgModule,
@@ -17538,7 +17567,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
17538
17567
  }]
17539
17568
  }] });
17540
17569
 
17541
- const VERSION = '3.4.4';
17570
+ const VERSION = '3.4.5';
17542
17571
 
17543
17572
  /*
17544
17573
  * Public API Surface of speechrecorderng