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
  }
@@ -947,7 +947,7 @@ class ArrayAudioBufferSourceNode extends AudioSourceNode {
947
947
  }
948
948
  };
949
949
  }
950
- fillBuffer(frameOffset) {
950
+ fillBuffer() {
951
951
  if (this._arrayAudioBuffer && this._audioInputStream && this._aisBufs) {
952
952
  let filled = this.filledFrames;
953
953
  let bufLen = 0;
@@ -1746,7 +1746,7 @@ const aswpStr = "\n" +
1746
1746
  "\n" +
1747
1747
  " let copied=0;\n" +
1748
1748
  " do{\n" +
1749
- " if(this.currentAudioBufferAvail==0){\n" +
1749
+ " if(this.currentAudioBufferAvail===0){\n" +
1750
1750
  " let nxtBuff=this.audioBuffers.shift();\n" +
1751
1751
  " if(nxtBuff){\n" +
1752
1752
  " this.currentAudioBuffer=nxtBuff;\n" +
@@ -3181,7 +3181,7 @@ class AudioCapture {
3181
3181
  this.inddbAudioBuffer = null;
3182
3182
  this.context = context;
3183
3183
  this.n = navigator;
3184
- this.context.addEventListener('statechange', (ev) => {
3184
+ this.context.addEventListener('statechange', () => {
3185
3185
  if (this.context.state !== 'running') {
3186
3186
  this.close();
3187
3187
  }
@@ -4533,7 +4533,7 @@ class Uploader {
4533
4533
  si += v.size;
4534
4534
  }
4535
4535
  else if (typeof v === 'string') {
4536
- // encode to UT-f8 to get upload size
4536
+ // encode to UTF-8 to get upload size
4537
4537
  si += this.te.encode().length;
4538
4538
  }
4539
4539
  });
@@ -4571,34 +4571,37 @@ class Uploader {
4571
4571
  // pipe(timeout()) is not the same as xhr.timeout
4572
4572
  let uploadedUpload = null;
4573
4573
  //console.debug("Post upload: "+ul)
4574
- this.http.post(ul.url, ul.data, { withCredentials: this.withCredentials }).pipe(timeout(timeoVal)).subscribe(data => {
4575
- uploadedUpload = ul;
4576
- //console.debug('Next method called for upload: '+uploadedUpload)
4577
- }, (err) => {
4578
- if (err.error instanceof Error) {
4579
- // A client-side or network error occurred. Handle it accordingly.
4580
- console.error('Upload error occurred:', err.error.message);
4581
- }
4582
- else {
4583
- // The backend returned an unsuccessful response code.
4584
- // The response body may contain clues as to what went wrong,
4585
- console.error(`Upload error: Server returned code ${err.status}`);
4586
- }
4587
- this.processError(ul);
4588
- }, () => {
4589
- //console.debug('Upload complete method called')
4590
- if (uploadedUpload) {
4591
- if (this.DEBUG_DELAY > 0) {
4592
- window.setTimeout(() => {
4593
- this.uploadDone(ul);
4594
- }, this.DEBUG_DELAY);
4574
+ this.http.post(ul.url, ul.data, { withCredentials: this.withCredentials }).pipe(timeout(timeoVal)).subscribe({
4575
+ next: (data) => {
4576
+ uploadedUpload = ul;
4577
+ //console.debug('Next method called for upload: '+uploadedUpload)
4578
+ },
4579
+ error: (err) => {
4580
+ if (err.error instanceof Error) {
4581
+ // A client-side or network error occurred. Handle it accordingly.
4582
+ console.error('Upload error occurred:', err.error.message);
4595
4583
  }
4596
4584
  else {
4597
- this.uploadDone(uploadedUpload);
4585
+ // The backend returned an unsuccessful response code.
4586
+ // The response body may contain clues as to what went wrong,
4587
+ console.error(`Upload error: Server returned code ${err.status}`);
4588
+ }
4589
+ this.processError(ul);
4590
+ }, complete: () => {
4591
+ //console.debug('Upload complete method called')
4592
+ if (uploadedUpload) {
4593
+ if (this.DEBUG_DELAY > 0) {
4594
+ window.setTimeout(() => {
4595
+ this.uploadDone(ul);
4596
+ }, this.DEBUG_DELAY);
4597
+ }
4598
+ else {
4599
+ this.uploadDone(uploadedUpload);
4600
+ }
4601
+ }
4602
+ else {
4603
+ console.error('Upload post complete, but upload not set in next method!');
4598
4604
  }
4599
- }
4600
- else {
4601
- console.error('Upload post complete, but upload not set in next method!');
4602
4605
  }
4603
4606
  });
4604
4607
  }
@@ -4613,7 +4616,7 @@ class Uploader {
4613
4616
  // set retry timer
4614
4617
  this.retryTimerId = window.setTimeout(() => {
4615
4618
  this.retryTimerRunning = false;
4616
- //console.debug("Upload retry timer exprired. Continue processing...")
4619
+ //console.debug("Upload retry timer expired. Continue processing...")
4617
4620
  this.process();
4618
4621
  }, this.RETRY_DELAY);
4619
4622
  this.retryTimerRunning = true;
@@ -4707,12 +4710,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
4707
4710
  * Created by klausj on 17.06.2017.
4708
4711
  */
4709
4712
  class ProjectService {
4710
- constructor(http, platformLoaction, config) {
4713
+ constructor(http, platformLocation, config) {
4711
4714
  this.http = http;
4712
- this.platformLoaction = platformLoaction;
4715
+ this.platformLocation = platformLocation;
4713
4716
  this.config = config;
4714
4717
  this.withCredentials = false;
4715
- console.log("Base Href: " + platformLoaction.getBaseHrefFromDOM());
4718
+ console.log("Base Href: " + platformLocation.getBaseHrefFromDOM());
4716
4719
  let apiEndPoint = '';
4717
4720
  if (config && config.apiEndPoint) {
4718
4721
  apiEndPoint = config.apiEndPoint;
@@ -4797,14 +4800,17 @@ class SessionService {
4797
4800
  let wrapObs = new Observable(subscriber => {
4798
4801
  this._uploadCount++;
4799
4802
  let obs = this.http.patch(sesssUrl, body, { withCredentials: this.withCredentials });
4800
- obs.subscribe((value) => {
4801
- subscriber.next(value);
4802
- }, error => {
4803
- this._uploadCount--;
4804
- subscriber.error(error);
4805
- }, () => {
4806
- this._uploadCount--;
4807
- subscriber.complete();
4803
+ obs.subscribe({
4804
+ next: (value) => {
4805
+ subscriber.next(value);
4806
+ },
4807
+ error: error => {
4808
+ this._uploadCount--;
4809
+ subscriber.error(error);
4810
+ }, complete: () => {
4811
+ this._uploadCount--;
4812
+ subscriber.complete();
4813
+ }
4808
4814
  });
4809
4815
  });
4810
4816
  return wrapObs;
@@ -7423,7 +7429,7 @@ AudioClipUIContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", v
7423
7429
  <audio-signal [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-signal>
7424
7430
  <audio-sonagram [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-sonagram>
7425
7431
  </div>
7426
- `, 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" }] });
7432
+ `, 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" }] });
7427
7433
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioClipUIContainer, decorators: [{
7428
7434
  type: Component,
7429
7435
  args: [{ selector: 'app-audio', template: `
@@ -7433,7 +7439,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
7433
7439
  <audio-signal [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-signal>
7434
7440
  <audio-sonagram [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-sonagram>
7435
7441
  </div>
7436
- `, 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"] }]
7442
+ `, 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"] }]
7437
7443
  }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { canvasRef: [{
7438
7444
  type: ViewChild,
7439
7445
  args: ['divider', { static: true }]
@@ -7747,8 +7753,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
7747
7753
  }] } });
7748
7754
 
7749
7755
  class AudioDisplay {
7750
- constructor(route, ref, eRef) {
7751
- this.route = route;
7756
+ constructor(ref, eRef) {
7752
7757
  this.ref = ref;
7753
7758
  this.eRef = eRef;
7754
7759
  this._audioClip = null;
@@ -7811,7 +7816,7 @@ class AudioDisplay {
7811
7816
  this.status = 'ERROR';
7812
7817
  }
7813
7818
  }
7814
- 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 });
7819
+ 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 });
7815
7820
  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: `
7816
7821
 
7817
7822
  <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>
@@ -7842,7 +7847,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
7842
7847
  [zoomSelectedAction]="zoomSelectedAction"
7843
7848
  [zoomFitToPanelAction]="zoomFitToPanelAction"></audio-display-control>
7844
7849
  `, 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"] }]
7845
- }], ctorParameters: function () { return [{ type: i1$2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { playStartAction: [{
7850
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { playStartAction: [{
7846
7851
  type: Input
7847
7852
  }], playStopAction: [{
7848
7853
  type: Input
@@ -7873,11 +7878,11 @@ class ResponsiveComponent {
7873
7878
  });
7874
7879
  }
7875
7880
  }
7876
- 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 });
7881
+ 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 });
7877
7882
  ResponsiveComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: ResponsiveComponent, ngImport: i0 });
7878
7883
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ResponsiveComponent, decorators: [{
7879
7884
  type: Directive
7880
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }]; } });
7885
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }]; } });
7881
7886
 
7882
7887
  class ScrollIntoViewDirective {
7883
7888
  constructor(elRef) {
@@ -8557,7 +8562,7 @@ class Prompting extends ResponsiveComponent {
8557
8562
  this.onPrevItem.emit();
8558
8563
  }
8559
8564
  }
8560
- 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 });
8565
+ 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 });
8561
8566
  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: `
8562
8567
 
8563
8568
  <app-simpletrafficlight [status]="startStopSignalState"></app-simpletrafficlight>
@@ -8606,7 +8611,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
8606
8611
 
8607
8612
 
8608
8613
  `, 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"] }]
8609
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }]; }, propDecorators: { simpleTrafficLight: [{
8614
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }]; }, propDecorators: { simpleTrafficLight: [{
8610
8615
  type: ViewChild,
8611
8616
  args: [SimpleTrafficLight, { static: true }]
8612
8617
  }], audioDisplay: [{
@@ -8657,7 +8662,7 @@ class SessionFinishedDialog {
8657
8662
  this.dialogRef.close();
8658
8663
  }
8659
8664
  }
8660
- 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 });
8665
+ 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 });
8661
8666
  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>
8662
8667
  <div mat-dialog-content>
8663
8668
 
@@ -8667,7 +8672,7 @@ SessionFinishedDialog.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
8667
8672
  <div mat-dialog-actions>
8668
8673
  <button mat-button (click)="closeDialog()">OK</button>
8669
8674
  </div>
8670
- `, 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"] }] });
8675
+ `, 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"] }] });
8671
8676
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SessionFinishedDialog, decorators: [{
8672
8677
  type: Component,
8673
8678
  args: [{
@@ -8684,7 +8689,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
8684
8689
  `
8685
8690
  }]
8686
8691
  }], ctorParameters: function () {
8687
- return [{ type: i1$4.MatDialogRef }, { type: undefined, decorators: [{
8692
+ return [{ type: i1$3.MatDialogRef }, { type: undefined, decorators: [{
8688
8693
  type: Inject,
8689
8694
  args: [MAT_DIALOG_DATA]
8690
8695
  }] }];
@@ -8699,7 +8704,7 @@ class MessageDialog {
8699
8704
  this.dialogRef.close();
8700
8705
  }
8701
8706
  }
8702
- 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 });
8707
+ 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 });
8703
8708
  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>
8704
8709
  <mat-icon *ngIf="data.type==='warning'" [style.color]="'yellow'">warning</mat-icon>{{data.title}}</h1>
8705
8710
  <div mat-dialog-content>
@@ -8711,7 +8716,7 @@ MessageDialog.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version:
8711
8716
  <div mat-dialog-actions>
8712
8717
  <button mat-button (click)="closeDialog()">OK</button>
8713
8718
  </div>
8714
- `, 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"] }] });
8719
+ `, 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"] }] });
8715
8720
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: MessageDialog, decorators: [{
8716
8721
  type: Component,
8717
8722
  args: [{
@@ -8730,7 +8735,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
8730
8735
  `
8731
8736
  }]
8732
8737
  }], ctorParameters: function () {
8733
- return [{ type: i1$4.MatDialogRef }, { type: undefined, decorators: [{
8738
+ return [{ type: i1$3.MatDialogRef }, { type: undefined, decorators: [{
8734
8739
  type: Inject,
8735
8740
  args: [MAT_DIALOG_DATA]
8736
8741
  }] }];
@@ -9033,62 +9038,64 @@ let BasicRecordingService = class BasicRecordingService {
9033
9038
  ausps.set('requestUUID', UUID.generate());
9034
9039
  }
9035
9040
  let obs = new Observable(observer => {
9036
- this.audioRequestByURL(baseAudioUrl, ausps).subscribe(resp => {
9037
- // Do not use Promise version, which does not work with Safari 13 (13.0.5)
9038
- if (resp.body) {
9039
- //console.debug("chunkAudioRequest: observer.closed: "+observer.closed);
9040
- //console.debug("Audio file bytes: "+resp.body.byteLength);
9041
- // Check original audio format
9042
- let wr = new WavReader(resp.body);
9043
- const pcmFmt = wr.readFormat();
9044
- const orgFl = wr.frameLength();
9045
- // if(pcmFmt){
9046
- // console.debug("Original WAVE format of download chunk: "+pcmFmt);
9047
- // }else{
9048
- // console.error("Could not read WAVE format of original download chunk!");
9049
- // }
9050
- // if(orgFl){
9051
- // console.debug("Original frame length of download chunk: "+orgFl);
9052
- // }else{
9053
- // console.error("Could not read WAVE format of original download chunk!");
9054
- // }
9055
- if (pcmFmt && orgFl) {
9056
- aCtx.decodeAudioData(resp.body, ab => {
9057
- //console.debug("Decoded audio chunk frames: "+ab.length);
9058
- let chDl = new ChunkDownload(pcmFmt, orgFl, ab);
9059
- observer.next(chDl);
9060
- observer.complete();
9061
- }, error => {
9062
- //if(error instanceof HttpErrorResponse) {
9063
- // if (error.status == 404) {
9064
- // // Interpret not as an error, the file ist not recorded yet
9065
- // observer.next(null);
9066
- // observer.complete()
9067
- // } else {
9068
- // // all other states are errors
9069
- console.error("Recordings service chunkAudioRequest error decoding audio data: " + error.name + ": " + error.message);
9070
- observer.error(error);
9071
- // }
9072
- // }
9073
- });
9041
+ this.audioRequestByURL(baseAudioUrl, ausps).subscribe({
9042
+ next: resp => {
9043
+ // Do not use Promise version, which does not work with Safari 13 (13.0.5)
9044
+ if (resp.body) {
9045
+ //console.debug("chunkAudioRequest: observer.closed: "+observer.closed);
9046
+ //console.debug("Audio file bytes: "+resp.body.byteLength);
9047
+ // Check original audio format
9048
+ let wr = new WavReader(resp.body);
9049
+ const pcmFmt = wr.readFormat();
9050
+ const orgFl = wr.frameLength();
9051
+ // if(pcmFmt){
9052
+ // console.debug("Original WAVE format of download chunk: "+pcmFmt);
9053
+ // }else{
9054
+ // console.error("Could not read WAVE format of original download chunk!");
9055
+ // }
9056
+ // if(orgFl){
9057
+ // console.debug("Original frame length of download chunk: "+orgFl);
9058
+ // }else{
9059
+ // console.error("Could not read WAVE format of original download chunk!");
9060
+ // }
9061
+ if (pcmFmt && orgFl) {
9062
+ aCtx.decodeAudioData(resp.body, ab => {
9063
+ //console.debug("Decoded audio chunk frames: "+ab.length);
9064
+ let chDl = new ChunkDownload(pcmFmt, orgFl, ab);
9065
+ observer.next(chDl);
9066
+ observer.complete();
9067
+ }, error => {
9068
+ //if(error instanceof HttpErrorResponse) {
9069
+ // if (error.status == 404) {
9070
+ // // Interpret not as an error, the file ist not recorded yet
9071
+ // observer.next(null);
9072
+ // observer.complete()
9073
+ // } else {
9074
+ // // all other states are errors
9075
+ console.error("Recordings service chunkAudioRequest error decoding audio data: " + error.name + ": " + error.message);
9076
+ observer.error(error);
9077
+ // }
9078
+ // }
9079
+ });
9080
+ }
9081
+ else {
9082
+ const errMsg = 'Could not parse audio header for format and/or frame length of download.';
9083
+ console.error(errMsg);
9084
+ observer.error(errMsg);
9085
+ }
9074
9086
  }
9075
9087
  else {
9076
- const errMsg = 'Could not parse audio header for format and/or frame length of download.';
9088
+ const errMsg = 'Fetching audio file: response has no body';
9077
9089
  console.error(errMsg);
9078
9090
  observer.error(errMsg);
9079
9091
  }
9092
+ }, error: (error) => {
9093
+ // all other states are errors
9094
+ //const errMsg='Fetching audio file HTTP error: '+error;
9095
+ //console.error(errMsg);
9096
+ observer.error(error);
9097
+ //observer.complete();
9080
9098
  }
9081
- else {
9082
- const errMsg = 'Fetching audio file: response has no body';
9083
- console.error(errMsg);
9084
- observer.error(errMsg);
9085
- }
9086
- }, (error) => {
9087
- // all other states are errors
9088
- //const errMsg='Fetching audio file HTTP error: '+error;
9089
- //console.error(errMsg);
9090
- observer.error(error);
9091
- //observer.complete();
9092
9099
  });
9093
9100
  });
9094
9101
  return obs;
@@ -9658,36 +9665,38 @@ class RecordingService extends BasicRecordingService {
9658
9665
  }
9659
9666
  if (recordingFile.session && recFileId) {
9660
9667
  let obs = this.fetchAudiofile(projectName, recordingFile.session, recFileId);
9661
- obs.subscribe(resp => {
9662
- // Do not use Promise version, which does not work with Safari 13 (13.0.5)
9663
- if (resp.body) {
9664
- aCtx.decodeAudioData(resp.body, ab => {
9665
- observer.next(ab);
9666
- observer.complete();
9667
- }, error => {
9668
- observer.error(error);
9669
- observer.complete();
9670
- });
9671
- }
9672
- else {
9673
- observer.error('Fetching audio file: response has no body');
9674
- }
9675
- }, (err) => {
9676
- if (err instanceof HttpErrorResponse) {
9677
- if (err.status == 404) {
9678
- // Interpret not as an error, the file ist not recorded yet
9679
- observer.next(null);
9680
- observer.complete();
9668
+ obs.subscribe({
9669
+ next: resp => {
9670
+ // Do not use Promise version, which does not work with Safari 13 (13.0.5)
9671
+ if (resp.body) {
9672
+ aCtx.decodeAudioData(resp.body, ab => {
9673
+ observer.next(ab);
9674
+ observer.complete();
9675
+ }, error => {
9676
+ observer.error(error);
9677
+ observer.complete();
9678
+ });
9679
+ }
9680
+ else {
9681
+ observer.error('Fetching audio file: response has no body');
9682
+ }
9683
+ }, error: (err) => {
9684
+ if (err instanceof HttpErrorResponse) {
9685
+ if (err.status == 404) {
9686
+ // Interpret not as an error, the file ist not recorded yet
9687
+ observer.next(null);
9688
+ observer.complete();
9689
+ }
9690
+ else {
9691
+ // all other states are errors
9692
+ observer.error(err);
9693
+ observer.complete();
9694
+ }
9681
9695
  }
9682
9696
  else {
9683
- // all other states are errors
9684
9697
  observer.error(err);
9685
- observer.complete();
9686
9698
  }
9687
9699
  }
9688
- else {
9689
- observer.error(err);
9690
- }
9691
9700
  });
9692
9701
  }
9693
9702
  else {
@@ -9704,49 +9713,50 @@ class RecordingService extends BasicRecordingService {
9704
9713
  }
9705
9714
  if (recordingFile.session && recFileId) {
9706
9715
  let obs = this.fetchAudiofile(projectName, recordingFile.session, recFileId);
9707
- obs.subscribe(resp => {
9708
- //console.log("Fetched audio file. HTTP response status: "+resp.status+", type: "+resp.type+", byte length: "+ resp.body.byteLength);
9709
- // Do not use Promise version, which does not work with Safari 13 (13.0.5)
9710
- if (resp.body) {
9711
- aCtx.decodeAudioData(resp.body, ab => {
9712
- let abs = new AudioBufferSource(ab);
9713
- let adh = new AudioDataHolder(abs);
9714
- RecordingFileUtils.setAudioData(recordingFile, adh);
9715
- if (this.debugDelay > 0) {
9716
- window.setTimeout(() => {
9716
+ obs.subscribe({ next: resp => {
9717
+ //console.log("Fetched audio file. HTTP response status: "+resp.status+", type: "+resp.type+", byte length: "+ resp.body.byteLength);
9718
+ // Do not use Promise version, which does not work with Safari 13 (13.0.5)
9719
+ if (resp.body) {
9720
+ aCtx.decodeAudioData(resp.body, ab => {
9721
+ let abs = new AudioBufferSource(ab);
9722
+ let adh = new AudioDataHolder(abs);
9723
+ RecordingFileUtils.setAudioData(recordingFile, adh);
9724
+ if (this.debugDelay > 0) {
9725
+ window.setTimeout(() => {
9726
+ observer.next(recordingFile);
9727
+ observer.complete();
9728
+ }, this.debugDelay);
9729
+ }
9730
+ else {
9717
9731
  observer.next(recordingFile);
9718
9732
  observer.complete();
9719
- }, this.debugDelay);
9733
+ }
9734
+ }, error => {
9735
+ observer.error(error);
9736
+ observer.complete();
9737
+ });
9738
+ }
9739
+ else {
9740
+ observer.error('Fetching audio file: response has no body');
9741
+ }
9742
+ },
9743
+ error: (err) => {
9744
+ if (err instanceof HttpErrorResponse) {
9745
+ if (err.status == 404) {
9746
+ // Interpret not as an error, the file ist not recorded yet
9747
+ observer.next(null);
9748
+ observer.complete();
9720
9749
  }
9721
9750
  else {
9722
- observer.next(recordingFile);
9751
+ // all other states are errors
9752
+ observer.error(err);
9723
9753
  observer.complete();
9724
9754
  }
9725
- }, error => {
9726
- observer.error(error);
9727
- observer.complete();
9728
- });
9729
- }
9730
- else {
9731
- observer.error('Fetching audio file: response has no body');
9732
- }
9733
- }, (err) => {
9734
- if (err instanceof HttpErrorResponse) {
9735
- if (err.status == 404) {
9736
- // Interpret not as an error, the file ist not recorded yet
9737
- observer.next(null);
9738
- observer.complete();
9739
9755
  }
9740
9756
  else {
9741
- // all other states are errors
9742
9757
  observer.error(err);
9743
- observer.complete();
9744
9758
  }
9745
- }
9746
- else {
9747
- observer.error(err);
9748
- }
9749
- });
9759
+ } });
9750
9760
  }
9751
9761
  else {
9752
9762
  observer.error();
@@ -10068,83 +10078,88 @@ class RecordingService extends BasicRecordingService {
10068
10078
  let wobs = new Observable(observer => {
10069
10079
  if (recordingFile.session) {
10070
10080
  let obs = this.fetchSprAudiofile(projectName, recordingFile.session, recordingFile.itemCode, recordingFile.version);
10071
- obs.subscribe(resp => {
10072
- //console.log("Fetched audio file. HTTP response status: "+resp.status+", type: "+resp.type+", byte length: "+ resp.body.byteLength);
10073
- // Do not use Promise version, which does not work with Safari 13 (13.0.5)
10081
+ obs.subscribe({
10082
+ next: resp => {
10083
+ //console.log("Fetched audio file. HTTP response status: "+resp.status+", type: "+resp.type+", byte length: "+ resp.body.byteLength);
10084
+ // Do not use Promise version, which does not work with Safari 13 (13.0.5)
10085
+ if (resp.body) {
10086
+ aCtx.decodeAudioData(resp.body, ab => {
10087
+ let abs = new AudioBufferSource(ab);
10088
+ RecordingFileUtils.setAudioData(recordingFile, new AudioDataHolder(abs));
10089
+ if (this.debugDelay > 0) {
10090
+ window.setTimeout(() => {
10091
+ observer.next(recordingFile);
10092
+ observer.complete();
10093
+ }, this.debugDelay);
10094
+ }
10095
+ else {
10096
+ observer.next(recordingFile);
10097
+ observer.complete();
10098
+ }
10099
+ }, error => {
10100
+ observer.error(error);
10101
+ observer.complete();
10102
+ });
10103
+ }
10104
+ else {
10105
+ observer.error('Fetching audio file: response has no body');
10106
+ }
10107
+ },
10108
+ error: (err) => {
10109
+ if (err instanceof HttpErrorResponse && err.status == 404) {
10110
+ // Interpret not as an error, the file ist not recorded yet
10111
+ observer.next(null);
10112
+ observer.complete();
10113
+ }
10114
+ else {
10115
+ // all other states are errors
10116
+ observer.error(err);
10117
+ }
10118
+ }
10119
+ });
10120
+ }
10121
+ else {
10122
+ observer.error();
10123
+ }
10124
+ });
10125
+ return wobs;
10126
+ }
10127
+ fetchRecordingFile(aCtx, projectName, sessId, itemcode, version) {
10128
+ let wobs = new Observable(observer => {
10129
+ let obs = this.fetchSprAudiofile(projectName, sessId, itemcode, version);
10130
+ obs.subscribe({ next: resp => {
10131
+ // Do not use Promise version, which does not work with Safari 13
10074
10132
  if (resp.body) {
10075
10133
  aCtx.decodeAudioData(resp.body, ab => {
10076
10134
  let abs = new AudioBufferSource(ab);
10077
- RecordingFileUtils.setAudioData(recordingFile, new AudioDataHolder(abs));
10135
+ let adh = new AudioDataHolder(abs);
10136
+ let rf = new SprRecordingFile(sessId, itemcode, version, adh);
10078
10137
  if (this.debugDelay > 0) {
10079
10138
  window.setTimeout(() => {
10080
- observer.next(recordingFile);
10139
+ observer.next(rf);
10081
10140
  observer.complete();
10082
10141
  }, this.debugDelay);
10083
10142
  }
10084
10143
  else {
10085
- observer.next(recordingFile);
10144
+ observer.next(rf);
10086
10145
  observer.complete();
10087
10146
  }
10088
- }, error => {
10089
- observer.error(error);
10090
- observer.complete();
10091
10147
  });
10092
10148
  }
10093
10149
  else {
10094
- observer.error('Fetching audio file: response has no body');
10150
+ observer.error();
10095
10151
  }
10096
- }, (err) => {
10152
+ },
10153
+ error: (err) => {
10097
10154
  if (err instanceof HttpErrorResponse && err.status == 404) {
10098
10155
  // Interpret not as an error, the file ist not recorded yet
10099
10156
  observer.next(null);
10100
10157
  observer.complete();
10101
10158
  }
10102
10159
  else {
10103
- // all other states are errors
10160
+ // all other errors are real errors
10104
10161
  observer.error(err);
10105
10162
  }
10106
- });
10107
- }
10108
- else {
10109
- observer.error();
10110
- }
10111
- });
10112
- return wobs;
10113
- }
10114
- fetchRecordingFile(aCtx, projectName, sessId, itemcode, version) {
10115
- let wobs = new Observable(observer => {
10116
- let obs = this.fetchSprAudiofile(projectName, sessId, itemcode, version);
10117
- obs.subscribe(resp => {
10118
- // Do not use Promise version, which does not work with Safari 13
10119
- if (resp.body) {
10120
- aCtx.decodeAudioData(resp.body, ab => {
10121
- let abs = new AudioBufferSource(ab);
10122
- let adh = new AudioDataHolder(abs);
10123
- let rf = new SprRecordingFile(sessId, itemcode, version, adh);
10124
- if (this.debugDelay > 0) {
10125
- window.setTimeout(() => {
10126
- observer.next(rf);
10127
- observer.complete();
10128
- }, this.debugDelay);
10129
- }
10130
- else {
10131
- observer.next(rf);
10132
- observer.complete();
10133
- }
10134
- });
10135
- }
10136
- else {
10137
- observer.error();
10138
- }
10139
- }, (err) => {
10140
- if (err instanceof HttpErrorResponse && err.status == 404) {
10141
- // Interpret not as an error, the file ist not recorded yet
10142
- observer.next(null);
10143
- observer.complete();
10144
- }
10145
- else {
10146
- // all other errors are real errors
10147
- observer.error(err);
10148
10163
  }
10149
10164
  });
10150
10165
  });
@@ -10605,7 +10620,7 @@ class UploadStatus {
10605
10620
  constructor() {
10606
10621
  this._awaitNewUpload = false;
10607
10622
  this.spinnerMode = 'determinate';
10608
- this._colorStatus = 'primary';
10623
+ this.colorStatus = 'primary';
10609
10624
  this._value = 100;
10610
10625
  this.displayValue = null;
10611
10626
  this.toolTipText = '';
@@ -10644,13 +10659,13 @@ class UploadStatus {
10644
10659
  set status(status) {
10645
10660
  this._status = status;
10646
10661
  if ('accent' === status) {
10647
- this._colorStatus = 'accent';
10662
+ this.colorStatus = 'accent';
10648
10663
  }
10649
10664
  else if ('warn' === status) {
10650
- this._colorStatus = 'warn';
10665
+ this.colorStatus = 'warn';
10651
10666
  }
10652
10667
  else {
10653
- this._colorStatus = 'primary';
10668
+ this.colorStatus = 'primary';
10654
10669
  }
10655
10670
  this._updateSpinner();
10656
10671
  }
@@ -10660,12 +10675,14 @@ class UploadStatus {
10660
10675
  }
10661
10676
  UploadStatus.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UploadStatus, deps: [], target: i0.ɵɵFactoryTarget.Component });
10662
10677
  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: `
10663
- <mat-progress-spinner [mode]="spinnerMode" [color]="status" [diameter]="30" [strokeWidth]="5" [value]="_value" [matTooltip]="toolTipText"></mat-progress-spinner>
10678
+ <mat-progress-spinner [mode]="spinnerMode" [color]="colorStatus" [diameter]="30" [strokeWidth]="5" [value]="_value"
10679
+ [matTooltip]="toolTipText"></mat-progress-spinner>
10664
10680
  `, 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"] }] });
10665
10681
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UploadStatus, decorators: [{
10666
10682
  type: Component,
10667
10683
  args: [{ selector: 'app-uploadstatus', template: `
10668
- <mat-progress-spinner [mode]="spinnerMode" [color]="status" [diameter]="30" [strokeWidth]="5" [value]="_value" [matTooltip]="toolTipText"></mat-progress-spinner>
10684
+ <mat-progress-spinner [mode]="spinnerMode" [color]="colorStatus" [diameter]="30" [strokeWidth]="5" [value]="_value"
10685
+ [matTooltip]="toolTipText"></mat-progress-spinner>
10669
10686
  `, styles: [":host{text-align:left}\n", "mat-progress-spinner{display:inline-block}\n"] }]
10670
10687
  }], propDecorators: { value: [{
10671
10688
  type: Input
@@ -10774,7 +10791,7 @@ class TransportPanel extends ResponsiveComponent {
10774
10791
  }
10775
10792
  }
10776
10793
  }
10777
- 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 });
10794
+ 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 });
10778
10795
  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: `
10779
10796
  <button id="bwdBtn" *ngIf="navigationEnabled" (click)="actions.bwdAction.perform()" [disabled]="bwdDisabled()"
10780
10797
  mat-raised-button>
@@ -10819,7 +10836,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
10819
10836
  </button>
10820
10837
 
10821
10838
  `, 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"] }]
10822
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }]; }, propDecorators: { readonly: [{
10839
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }]; }, propDecorators: { readonly: [{
10823
10840
  type: Input
10824
10841
  }], actions: [{
10825
10842
  type: Input
@@ -10891,7 +10908,7 @@ class ControlPanel extends ResponsiveComponent {
10891
10908
  return this._ready;
10892
10909
  }
10893
10910
  }
10894
- 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 });
10911
+ 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 });
10895
10912
  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: `
10896
10913
  <div *ngIf="!screenXs" style="flex-direction: row" >
10897
10914
  <app-sprstatusdisplay style="flex:0 0 0" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"
@@ -10901,9 +10918,9 @@ ControlPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version:
10901
10918
  [status]="uploadStatus" [awaitNewUpload]="processing"></app-uploadstatus>
10902
10919
  <app-readystateindicator [ready]="_ready"></app-readystateindicator>
10903
10920
  </div>
10904
- <div *ngIf="screenXs"style="flex-direction: column" >
10921
+ <div *ngIf="screenXs" style="flex-direction: column" >
10905
10922
  <div style="flex-direction: row" class="flexFill" >
10906
- <app-sprstatusdisplay style="flex:10 0 0;flex-align:left" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"
10923
+ <app-sprstatusdisplay style="flex:10 0 0" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"
10907
10924
  class="hidden-xs"></app-sprstatusdisplay>
10908
10925
  <app-uploadstatus style="flex:0 0 0" *ngIf="enableUploadRecordings" [value]="uploadProgress"
10909
10926
  [status]="uploadStatus" [awaitNewUpload]="processing"></app-uploadstatus>
@@ -10924,9 +10941,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
10924
10941
  [status]="uploadStatus" [awaitNewUpload]="processing"></app-uploadstatus>
10925
10942
  <app-readystateindicator [ready]="_ready"></app-readystateindicator>
10926
10943
  </div>
10927
- <div *ngIf="screenXs"style="flex-direction: column" >
10944
+ <div *ngIf="screenXs" style="flex-direction: column" >
10928
10945
  <div style="flex-direction: row" class="flexFill" >
10929
- <app-sprstatusdisplay style="flex:10 0 0;flex-align:left" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"
10946
+ <app-sprstatusdisplay style="flex:10 0 0" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"
10930
10947
  class="hidden-xs"></app-sprstatusdisplay>
10931
10948
  <app-uploadstatus style="flex:0 0 0" *ngIf="enableUploadRecordings" [value]="uploadProgress"
10932
10949
  [status]="uploadStatus" [awaitNewUpload]="processing"></app-uploadstatus>
@@ -10936,7 +10953,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
10936
10953
 
10937
10954
  </div>
10938
10955
  `, styles: ["div{align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n"] }]
10939
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }, { type: i1$4.MatDialog }]; }, propDecorators: { statusDisplay: [{
10956
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }, { type: i1$3.MatDialog }]; }, propDecorators: { statusDisplay: [{
10940
10957
  type: ViewChild,
10941
10958
  args: [StatusDisplay, { static: true }]
10942
10959
  }], transportPanel: [{
@@ -11591,7 +11608,7 @@ class RecordingItemControls extends ResponsiveComponent {
11591
11608
  // this.status = 'ERROR';
11592
11609
  }
11593
11610
  }
11594
- 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 });
11611
+ 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 });
11595
11612
  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: `
11596
11613
  <button matTooltip="Start playback" (click)="playStartAction?.perform()"
11597
11614
  [disabled]="playStartAction?.disabled"
@@ -11640,7 +11657,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
11640
11657
  [style.color]="(peakDbLvl > warnDbLevel)?'red':'black'">{{peakDbLvl | number:'1.1-1'}} dB </span></td></tr>
11641
11658
  <tr *ngIf="_agc"><td>AGC:</td><td><span matTooltip="Auto gain control">{{agcString}}</span></td></tr></table></div>
11642
11659
  `, 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"] }]
11643
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { audioSignalCollapsed: [{
11660
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { audioSignalCollapsed: [{
11644
11661
  type: Input
11645
11662
  }], enableDownload: [{
11646
11663
  type: Input
@@ -11721,7 +11738,7 @@ class RecordingItemDisplay extends ResponsiveComponent {
11721
11738
  let peakDBVal = levelInfo.powerLevelDB();
11722
11739
  if (this.peakDbLvl < peakDBVal) {
11723
11740
  this.peakDbLvl = peakDBVal;
11724
- // the event comes from outside of an Angular zone
11741
+ // the event comes from outside an Angular zone
11725
11742
  this.changeDetectorRef.detectChanges();
11726
11743
  }
11727
11744
  this.liveLevel.update(levelInfo);
@@ -11737,7 +11754,7 @@ class RecordingItemDisplay extends ResponsiveComponent {
11737
11754
  this.changeDetectorRef.detectChanges();
11738
11755
  }
11739
11756
  }
11740
- 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 });
11757
+ 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 });
11741
11758
  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: `
11742
11759
  <div [class]="{audioStatusDisplay:!screenXs,audioStatusDisplayXs:screenXs}">
11743
11760
  <audio-levelbar style="flex:1 0 1%" [streamingMode]="streamingMode" [displayLevelInfos]="_displayLevelInfos"></audio-levelbar>
@@ -11752,7 +11769,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
11752
11769
  <spr-recordingitemcontrols style="flex:0 0 0px" [audioLoaded]="displayAudioBuffer!==null" [playStartAction]="playStartAction" [playStopAction]="playStopAction" [peakDbLvl]="peakDbLvl" [agc]="_agc" (onShowRecordingDetails)="onShowRecordingDetails.emit()"></spr-recordingitemcontrols>
11753
11770
  </div>
11754
11771
  `, 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"] }]
11755
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { liveLevel: [{
11772
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { liveLevel: [{
11756
11773
  type: ViewChild,
11757
11774
  args: [LevelBar, { static: true }]
11758
11775
  }], streamingMode: [{
@@ -14011,7 +14028,7 @@ class SessionManager extends BasicRecorder {
14011
14028
  }
14012
14029
  }
14013
14030
  }
14014
- 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 });
14031
+ 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 });
14015
14032
  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: `
14016
14033
  <app-warningbar [show]="isTestSession()" warningText="Test recording only!"></app-warningbar>
14017
14034
  <app-warningbar [show]="isDefaultAudioTestSession()" warningText="This test uses default audio device! Regular sessions may require a particular audio device (microphone)!"></app-warningbar>
@@ -14115,7 +14132,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
14115
14132
  </div>
14116
14133
  `, 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"] }]
14117
14134
  }], ctorParameters: function () {
14118
- return [{ type: i1$3.BreakpointObserver }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i1$4.MatDialog }, { type: SessionService }, { type: RecordingService }, { type: SpeechRecorderUploader }, { type: SpeechRecorderConfig, decorators: [{
14135
+ return [{ type: i1$2.BreakpointObserver }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i1$3.MatDialog }, { type: SessionService }, { type: RecordingService }, { type: SpeechRecorderUploader }, { type: SpeechRecorderConfig, decorators: [{
14119
14136
  type: Inject,
14120
14137
  args: [SPEECHRECORDER_CONFIG]
14121
14138
  }] }];
@@ -14564,7 +14581,7 @@ class SpeechrecorderngComponent extends RecorderComponent {
14564
14581
  }
14565
14582
  else {
14566
14583
  // all this attempts to customize the message do not work anymore (for security reasons)!!
14567
- var message = "Please do not leave the page, until all recordings are uploaded!";
14584
+ const message = "Please do not leave the page, until all recordings are uploaded!";
14568
14585
  alert(message);
14569
14586
  e = e || window.event;
14570
14587
  if (e) {
@@ -14688,7 +14705,7 @@ class SpeechrecorderngComponent extends RecorderComponent {
14688
14705
  projUrl = window.location.protocol + '//' + window.location.hostname + ':' + window.location.port + '/wikispeech/rest/projects/?sessionId=' + this.sessionId;
14689
14706
  }
14690
14707
  if (projUrl) {
14691
- var pLoader = new XMLHttpRequest();
14708
+ const pLoader = new XMLHttpRequest();
14692
14709
  pLoader.open("GET", projUrl, true);
14693
14710
  pLoader.setRequestHeader('Accept', 'application/json');
14694
14711
  pLoader.responseType = "json";
@@ -14723,7 +14740,7 @@ class SpeechrecorderngComponent extends RecorderComponent {
14723
14740
  this.sm.statusMsg = 'ERROR: Recording.';
14724
14741
  }
14725
14742
  }
14726
- 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 });
14743
+ 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 });
14727
14744
  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: `
14728
14745
  <app-sprrecordingsession [projectName]="project?.name" [dataSaved]="dataSaved"></app-sprrecordingsession>
14729
14746
  `, 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"] }] });
@@ -14732,7 +14749,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
14732
14749
  args: [{ selector: 'app-speechrecorder', providers: [SessionService], template: `
14733
14750
  <app-sprrecordingsession [projectName]="project?.name" [dataSaved]="dataSaved"></app-sprrecordingsession>
14734
14751
  `, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0}\n"] }]
14735
- }], 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: [{
14752
+ }], 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: [{
14736
14753
  type: ViewChild,
14737
14754
  args: [SessionManager, { static: true }]
14738
14755
  }] } });
@@ -14938,7 +14955,7 @@ class AudioDisplayPlayer {
14938
14955
  this.status = 'ERROR';
14939
14956
  }
14940
14957
  }
14941
- 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 });
14958
+ 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 });
14942
14959
  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: `
14943
14960
 
14944
14961
  <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>
@@ -14969,7 +14986,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
14969
14986
  [zoomSelectedAction]="zoomSelectedAction"
14970
14987
  [zoomFitToPanelAction]="zoomFitToPanelAction"></audio-display-control><p>{{status}}
14971
14988
  `, 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"] }]
14972
- }], ctorParameters: function () { return [{ type: i1$2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { playStartAction: [{
14989
+ }], ctorParameters: function () { return [{ type: i4$2.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { playStartAction: [{
14973
14990
  type: Input
14974
14991
  }], playStopAction: [{
14975
14992
  type: Input
@@ -15119,37 +15136,39 @@ class RecordingFileService extends BasicRecordingService {
15119
15136
  let wobs = new Observable(observer => {
15120
15137
  if (recordingFile.recordingFileId) {
15121
15138
  let obs = this.fetchAudiofile(recordingFile.recordingFileId);
15122
- obs.subscribe(resp => {
15123
- // Do not use Promise version, which does not work with Safari 13
15124
- if (resp.body) {
15125
- aCtx.decodeAudioData(resp.body, ab => {
15126
- let as = new AudioBufferSource(ab);
15127
- RecordingFileUtils.setAudioData(recordingFile, new AudioDataHolder(as));
15128
- if (this.debugDelay > 0) {
15129
- window.setTimeout(() => {
15139
+ obs.subscribe({ next: resp => {
15140
+ // Do not use Promise version, which does not work with Safari 13
15141
+ if (resp.body) {
15142
+ aCtx.decodeAudioData(resp.body, ab => {
15143
+ let as = new AudioBufferSource(ab);
15144
+ RecordingFileUtils.setAudioData(recordingFile, new AudioDataHolder(as));
15145
+ if (this.debugDelay > 0) {
15146
+ window.setTimeout(() => {
15147
+ observer.next(recordingFile);
15148
+ observer.complete();
15149
+ }, this.debugDelay);
15150
+ }
15151
+ else {
15130
15152
  observer.next(recordingFile);
15131
15153
  observer.complete();
15132
- }, this.debugDelay);
15133
- }
15134
- else {
15135
- observer.next(recordingFile);
15136
- observer.complete();
15137
- }
15138
- });
15139
- }
15140
- else {
15141
- observer.error('Received no audio data!');
15142
- }
15143
- }, (error) => {
15144
- if (error.status == 404) {
15145
- // Interpret not as an error, the file ist not recorded yet
15146
- observer.next(null);
15147
- observer.complete();
15148
- }
15149
- else {
15150
- // all other states are errors
15151
- observer.error(error);
15152
- observer.complete();
15154
+ }
15155
+ });
15156
+ }
15157
+ else {
15158
+ observer.error('Received no audio data!');
15159
+ }
15160
+ },
15161
+ error: (error) => {
15162
+ if (error.status == 404) {
15163
+ // Interpret not as an error, the file ist not recorded yet
15164
+ observer.next(null);
15165
+ observer.complete();
15166
+ }
15167
+ else {
15168
+ // all other states are errors
15169
+ observer.error(error);
15170
+ observer.complete();
15171
+ }
15153
15172
  }
15154
15173
  });
15155
15174
  }
@@ -15163,81 +15182,39 @@ class RecordingFileService extends BasicRecordingService {
15163
15182
  let wobs = new Observable(observer => {
15164
15183
  let rf = null;
15165
15184
  let rfDescrObs = this.recordingFileDescrObserver(recordingFileId);
15166
- rfDescrObs.subscribe(value => {
15167
- rf = value;
15168
- }, (error) => {
15169
- observer.error(error);
15170
- }, () => {
15171
- let rfAudioObs = this.fetchAudiofile(recordingFileId);
15172
- rfAudioObs.subscribe(resp => {
15173
- // Do not use Promise version, which does not work with Safari 13
15174
- if (resp.body) {
15175
- aCtx.decodeAudioData(resp.body, ab => {
15176
- if (rf) {
15177
- let as = new AudioBufferSource(ab);
15178
- RecordingFileUtils.setAudioData(rf, new AudioDataHolder(as));
15179
- }
15180
- else {
15181
- observer.error('Recording file object null');
15182
- }
15183
- if (this.debugDelay > 0) {
15184
- window.setTimeout(() => {
15185
- observer.next(rf);
15186
- observer.complete();
15187
- }, this.debugDelay);
15185
+ rfDescrObs.subscribe({ next: value => {
15186
+ rf = value;
15187
+ }, error: (error) => {
15188
+ observer.error(error);
15189
+ }, complete: () => {
15190
+ let rfAudioObs = this.fetchAudiofile(recordingFileId);
15191
+ rfAudioObs.subscribe({
15192
+ next: resp => {
15193
+ // Do not use Promise version, which does not work with Safari 13
15194
+ if (resp.body) {
15195
+ aCtx.decodeAudioData(resp.body, ab => {
15196
+ if (rf) {
15197
+ let as = new AudioBufferSource(ab);
15198
+ RecordingFileUtils.setAudioData(rf, new AudioDataHolder(as));
15199
+ }
15200
+ else {
15201
+ observer.error('Recording file object null');
15202
+ }
15203
+ if (this.debugDelay > 0) {
15204
+ window.setTimeout(() => {
15205
+ observer.next(rf);
15206
+ observer.complete();
15207
+ }, this.debugDelay);
15208
+ }
15209
+ else {
15210
+ observer.next(rf);
15211
+ observer.complete();
15212
+ }
15213
+ });
15188
15214
  }
15189
15215
  else {
15190
- observer.next(rf);
15191
- observer.complete();
15216
+ observer.error('Received no audio data');
15192
15217
  }
15193
- });
15194
- }
15195
- else {
15196
- observer.error('Received no audio data');
15197
- }
15198
- }, (error) => {
15199
- if (error.status == 404) {
15200
- // Interpret not as an error, the file ist not recorded yet
15201
- observer.next(null);
15202
- observer.complete();
15203
- }
15204
- else {
15205
- // all other states are errors
15206
- observer.error(error);
15207
- observer.complete();
15208
- }
15209
- });
15210
- });
15211
- });
15212
- return wobs;
15213
- }
15214
- fetchSprRecordingFile(aCtx, recordingFileId) {
15215
- let wobs = new Observable(observer => {
15216
- let rf = null;
15217
- let rfDescrObs = this.sprRecordingFileDescrObserver(recordingFileId);
15218
- rfDescrObs.subscribe(value => {
15219
- rf = value;
15220
- }, (error) => {
15221
- observer.error(error);
15222
- }, () => {
15223
- let sampleCnt = null;
15224
- if (rf && rf.channels && rf.frames) {
15225
- sampleCnt = rf.channels * rf.frames;
15226
- }
15227
- // TODO use download storage type depending on sample count of file
15228
- if (rf && rf.samplerate && sampleCnt != null && sampleCnt > this._maxAutoNetMemStoreSamples) {
15229
- const baseUrl = this.recoFileUrl(recordingFileId);
15230
- const obNetAb = this.chunkAudioRequestToNetAudioBuffer(aCtx, baseUrl, 0, rf === null || rf === void 0 ? void 0 : rf.samplerate, BasicRecordingService.DEFAULT_CHUNKED_DOWNLOAD_SECONDS, rf.frames);
15231
- obNetAb.subscribe({
15232
- next: (nab) => {
15233
- let adh = new AudioDataHolder(nab);
15234
- if (rf) {
15235
- RecordingFileUtils.setAudioData(rf, adh);
15236
- observer.next(rf);
15237
- }
15238
- },
15239
- complete: () => {
15240
- observer.complete();
15241
15218
  },
15242
15219
  error: (error) => {
15243
15220
  if (error.status == 404) {
@@ -15253,47 +15230,97 @@ class RecordingFileService extends BasicRecordingService {
15253
15230
  }
15254
15231
  });
15255
15232
  }
15256
- else {
15257
- let rfAudioObs = this.fetchAudiofile(recordingFileId);
15258
- rfAudioObs.subscribe(resp => {
15259
- // Do not use Promise version, which does not work with Safari 13
15260
- if (resp.body) {
15261
- aCtx.decodeAudioData(resp.body, ab => {
15233
+ });
15234
+ });
15235
+ return wobs;
15236
+ }
15237
+ fetchSprRecordingFile(aCtx, recordingFileId) {
15238
+ let wobs = new Observable(observer => {
15239
+ let rf = null;
15240
+ let rfDescrObs = this.sprRecordingFileDescrObserver(recordingFileId);
15241
+ rfDescrObs.subscribe({ next: value => {
15242
+ rf = value;
15243
+ },
15244
+ error: (error) => {
15245
+ observer.error(error);
15246
+ }, complete: () => {
15247
+ let sampleCnt = null;
15248
+ if (rf && rf.channels && rf.frames) {
15249
+ sampleCnt = rf.channels * rf.frames;
15250
+ }
15251
+ // TODO use download storage type depending on sample count of file
15252
+ if (rf && rf.samplerate && sampleCnt != null && sampleCnt > this._maxAutoNetMemStoreSamples) {
15253
+ const baseUrl = this.recoFileUrl(recordingFileId);
15254
+ const obNetAb = this.chunkAudioRequestToNetAudioBuffer(aCtx, baseUrl, 0, rf === null || rf === void 0 ? void 0 : rf.samplerate, BasicRecordingService.DEFAULT_CHUNKED_DOWNLOAD_SECONDS, rf.frames);
15255
+ obNetAb.subscribe({
15256
+ next: (nab) => {
15257
+ let adh = new AudioDataHolder(nab);
15262
15258
  if (rf) {
15263
- let as = new AudioBufferSource(ab);
15264
- let adh = new AudioDataHolder(as);
15265
15259
  RecordingFileUtils.setAudioData(rf, adh);
15260
+ observer.next(rf);
15261
+ }
15262
+ },
15263
+ complete: () => {
15264
+ observer.complete();
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);
15270
+ observer.complete();
15266
15271
  }
15267
15272
  else {
15268
- observer.error('Recording file object null');
15273
+ // all other states are errors
15274
+ observer.error(error);
15275
+ observer.complete();
15269
15276
  }
15270
- if (this.debugDelay > 0) {
15271
- window.setTimeout(() => {
15272
- observer.next(rf);
15273
- observer.complete();
15274
- }, this.debugDelay);
15277
+ }
15278
+ });
15279
+ }
15280
+ else {
15281
+ let rfAudioObs = this.fetchAudiofile(recordingFileId);
15282
+ rfAudioObs.subscribe({ next: resp => {
15283
+ // Do not use Promise version, which does not work with Safari 13
15284
+ if (resp.body) {
15285
+ aCtx.decodeAudioData(resp.body, ab => {
15286
+ if (rf) {
15287
+ let as = new AudioBufferSource(ab);
15288
+ let adh = new AudioDataHolder(as);
15289
+ RecordingFileUtils.setAudioData(rf, adh);
15290
+ }
15291
+ else {
15292
+ observer.error('Recording file object null');
15293
+ }
15294
+ if (this.debugDelay > 0) {
15295
+ window.setTimeout(() => {
15296
+ observer.next(rf);
15297
+ observer.complete();
15298
+ }, this.debugDelay);
15299
+ }
15300
+ else {
15301
+ observer.next(rf);
15302
+ observer.complete();
15303
+ }
15304
+ });
15275
15305
  }
15276
15306
  else {
15277
- observer.next(rf);
15307
+ observer.error('Received no audio data');
15308
+ }
15309
+ },
15310
+ error: (error) => {
15311
+ if (error.status == 404) {
15312
+ // Interpret not as an error, the file ist not recorded yet
15313
+ observer.next(null);
15278
15314
  observer.complete();
15279
15315
  }
15280
- });
15281
- }
15282
- else {
15283
- observer.error('Received no audio data');
15284
- }
15285
- }, (error) => {
15286
- if (error.status == 404) {
15287
- // Interpret not as an error, the file ist not recorded yet
15288
- observer.next(null);
15289
- observer.complete();
15290
- }
15291
- else {
15292
- // all other states are errors
15293
- observer.error(error);
15294
- observer.complete();
15295
- }
15296
- });
15316
+ else {
15317
+ // all other states are errors
15318
+ observer.error(error);
15319
+ observer.complete();
15320
+ }
15321
+ }
15322
+ });
15323
+ }
15297
15324
  }
15298
15325
  });
15299
15326
  });
@@ -15347,7 +15374,7 @@ RecordingFileNaviComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0
15347
15374
  <legend>Versions</legend>
15348
15375
  <mat-progress-spinner *ngIf="naviInfoLoading" mode="indeterminate" [diameter]="15"></mat-progress-spinner>
15349
15376
  <select *ngIf="!naviInfoLoading" [disabled]="versions==null || versions.length==1" (change)="selectVersionChange($event)">
15350
- <option *ngFor="let v of versions; let i = index" [selected]="v===version" value="{{v}}">{{v}}<span *ngIf="i==0"> (latest)</span></option>
15377
+ <option *ngFor="let v of versions; let i = index" [selected]="v===version" value="{{v}}">{{v}}<ng-container *ngIf="i==0"> (latest)</ng-container></option>
15351
15378
  </select>
15352
15379
  </fieldset>
15353
15380
  <fieldset>
@@ -15382,7 +15409,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
15382
15409
  <legend>Versions</legend>
15383
15410
  <mat-progress-spinner *ngIf="naviInfoLoading" mode="indeterminate" [diameter]="15"></mat-progress-spinner>
15384
15411
  <select *ngIf="!naviInfoLoading" [disabled]="versions==null || versions.length==1" (change)="selectVersionChange($event)">
15385
- <option *ngFor="let v of versions; let i = index" [selected]="v===version" value="{{v}}">{{v}}<span *ngIf="i==0"> (latest)</span></option>
15412
+ <option *ngFor="let v of versions; let i = index" [selected]="v===version" value="{{v}}">{{v}}<ng-container *ngIf="i==0"> (latest)</ng-container></option>
15386
15413
  </select>
15387
15414
  </fieldset>
15388
15415
  <fieldset>
@@ -15748,47 +15775,49 @@ class RecordingFileViewComponent extends AudioDisplayPlayer {
15748
15775
  let audioContext = AudioContextProvider.audioContextInstance();
15749
15776
  if (audioContext) {
15750
15777
  this.audioFetching = true;
15751
- this.recordingFileService.fetchSprRecordingFile(audioContext, rfId).subscribe(value => {
15752
- this.audioFetching = false;
15753
- this.status = 'Audio file loaded.';
15754
- let clip = null;
15755
- this.recordingFile = value;
15756
- if (this.recordingFile) {
15757
- let ab = this.recordingFile.audioDataHolder;
15758
- if (ab) {
15759
- clip = new AudioClip(ab);
15760
- let esffsr = null;
15761
- let eeffsr = null;
15762
- let esr = null;
15763
- if (clip.audioDataHolder != null) {
15764
- esr = ab.sampleRate;
15765
- if (esr != null) {
15766
- esffsr = RecordingFileUtil.editStartFrameForSampleRate(this.recordingFile, esr);
15767
- eeffsr = RecordingFileUtil.editEndFrameForSampleRate(this.recordingFile, esr);
15768
- }
15769
- let sel = null;
15770
- if (esffsr != null) {
15771
- if (eeffsr != null) {
15772
- sel = new Selection(ab.sampleRate, esffsr, eeffsr);
15778
+ this.recordingFileService.fetchSprRecordingFile(audioContext, rfId).subscribe({
15779
+ next: value => {
15780
+ this.audioFetching = false;
15781
+ this.status = 'Audio file loaded.';
15782
+ let clip = null;
15783
+ this.recordingFile = value;
15784
+ if (this.recordingFile) {
15785
+ let ab = this.recordingFile.audioDataHolder;
15786
+ if (ab) {
15787
+ clip = new AudioClip(ab);
15788
+ let esffsr = null;
15789
+ let eeffsr = null;
15790
+ let esr = null;
15791
+ if (clip.audioDataHolder != null) {
15792
+ esr = ab.sampleRate;
15793
+ if (esr != null) {
15794
+ esffsr = RecordingFileUtil.editStartFrameForSampleRate(this.recordingFile, esr);
15795
+ eeffsr = RecordingFileUtil.editEndFrameForSampleRate(this.recordingFile, esr);
15773
15796
  }
15774
- else {
15775
- //let ch0 = ab.getChannelData(0);
15776
- let frameLength = ab.frameLen;
15777
- sel = new Selection(esr, esffsr, frameLength);
15797
+ let sel = null;
15798
+ if (esffsr != null) {
15799
+ if (eeffsr != null) {
15800
+ sel = new Selection(ab.sampleRate, esffsr, eeffsr);
15801
+ }
15802
+ else {
15803
+ //let ch0 = ab.getChannelData(0);
15804
+ let frameLength = ab.frameLen;
15805
+ sel = new Selection(esr, esffsr, frameLength);
15806
+ }
15778
15807
  }
15808
+ else if (eeffsr != null) {
15809
+ sel = new Selection(esr, 0, eeffsr);
15810
+ }
15811
+ clip.selection = sel;
15779
15812
  }
15780
- else if (eeffsr != null) {
15781
- sel = new Selection(esr, 0, eeffsr);
15782
- }
15783
- clip.selection = sel;
15784
15813
  }
15785
15814
  }
15815
+ this.audioClip = clip;
15816
+ this.loadedRecfile();
15817
+ }, error: error1 => {
15818
+ this.audioFetching = false;
15819
+ this.status = 'Error loading audio file!';
15786
15820
  }
15787
- this.audioClip = clip;
15788
- this.loadedRecfile();
15789
- }, error1 => {
15790
- this.audioFetching = false;
15791
- this.status = 'Error loading audio file!';
15792
15821
  });
15793
15822
  }
15794
15823
  }
@@ -15816,7 +15845,7 @@ class RecordingFileViewComponent extends AudioDisplayPlayer {
15816
15845
  this.lastAction.disabled = (this.posInList == null || itemCnt == null || this.posInList >= itemCnt - 1);
15817
15846
  }
15818
15847
  loadSession(sessionId) {
15819
- // load session and recording file meta data only when on init and when session changes
15848
+ // load session and recording file metadata only when on init and when session changes
15820
15849
  if (sessionId != this.sessionId) {
15821
15850
  // tell UI that we are working...
15822
15851
  this.naviInfoLoading = true;
@@ -15854,7 +15883,7 @@ class RecordingFileViewComponent extends AudioDisplayPlayer {
15854
15883
  else {
15855
15884
  // rec file with itemcode already exists, add (push) this version ...
15856
15885
  exRfsForIc.push(rfd);
15857
- // .. and sort latest version (highest version number) to lowest index
15886
+ // ... and sort latest version (highest version number) to lowest index
15858
15887
  exRfsForIc.sort((rfd1, rfd2) => {
15859
15888
  return rfd2.version - rfd1.version;
15860
15889
  });
@@ -15908,7 +15937,7 @@ class RecordingFileViewComponent extends AudioDisplayPlayer {
15908
15937
  }
15909
15938
  }
15910
15939
  }
15911
- 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 });
15940
+ 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 });
15912
15941
  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: `
15913
15942
 
15914
15943
  <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>
@@ -15947,7 +15976,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
15947
15976
  <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>
15948
15977
  </div>
15949
15978
  `, 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"] }]
15950
- }], 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: [{
15979
+ }], 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: [{
15951
15980
  type: ViewChild,
15952
15981
  args: [AudioDisplayScrollPane]
15953
15982
  }] } });
@@ -16013,27 +16042,28 @@ class RecordingFileUI extends RecordingFileViewComponent {
16013
16042
  sf = s.startFrame;
16014
16043
  ef = s.endFrame;
16015
16044
  }
16016
- this.recordingFileService.saveEditSelection(this.recordingFile.recordingFileId, sr, sf, ef).subscribe((value) => {
16017
- }, () => {
16018
- this.dialog.open(MessageDialog, {
16019
- data: {
16020
- type: 'error',
16021
- title: 'Save selection edit error',
16022
- msg: "Could not save edit selection to WikiSpeech server!",
16023
- advice: "Please check network connection and server state."
16024
- }
16025
- });
16026
- }, () => {
16027
- // Or use returned selection value from server?
16028
- this.savedEditSelection = s;
16029
- this.editSaved = true;
16030
- this.snackBar.open('Selection edit saved successfully.', 'OK', { duration: 1500 });
16045
+ this.recordingFileService.saveEditSelection(this.recordingFile.recordingFileId, sr, sf, ef).subscribe({ next: (value) => { },
16046
+ error: () => {
16047
+ this.dialog.open(MessageDialog, {
16048
+ data: {
16049
+ type: 'error',
16050
+ title: 'Save selection edit error',
16051
+ msg: "Could not save edit selection to WikiSpeech server!",
16052
+ advice: "Please check network connection and server state."
16053
+ }
16054
+ });
16055
+ }, complete: () => {
16056
+ // Or use returned selection value from server?
16057
+ this.savedEditSelection = s;
16058
+ this.editSaved = true;
16059
+ this.snackBar.open('Selection edit saved successfully.', 'OK', { duration: 1500 });
16060
+ }
16031
16061
  });
16032
16062
  }
16033
16063
  }
16034
16064
  }
16035
16065
  }
16036
- 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 });
16066
+ 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 });
16037
16067
  RecordingFileUI.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: RecordingFileUI, selector: "app-audiodisplayplayer", usesInheritance: true, ngImport: i0, template: `
16038
16068
  <h1>Recording file editing</h1>
16039
16069
  <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>
@@ -16078,7 +16108,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
16078
16108
 
16079
16109
  <button mat-raised-button color="accent" (click)="applySelection()" [disabled]="editSaved">{{this.applyButtonText()}}</button>
16080
16110
  `, 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"] }]
16081
- }], 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 }]; } });
16111
+ }], 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 }]; } });
16082
16112
 
16083
16113
  class MediaUtils {
16084
16114
  static toMediaTime(timeInSeconds) {
@@ -16216,7 +16246,7 @@ RecordingList.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version:
16216
16246
  </mat-card-content>
16217
16247
  </mat-card>
16218
16248
 
16219
- `, 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" }] });
16249
+ `, 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" }] });
16220
16250
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecordingList, decorators: [{
16221
16251
  type: Component,
16222
16252
  args: [{ selector: 'app-recordinglist', template: `
@@ -16297,7 +16327,7 @@ class RecorderCombiPane extends ResponsiveComponent {
16297
16327
  this.recordingListComp.selectTop();
16298
16328
  }
16299
16329
  }
16300
- 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 });
16330
+ 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 });
16301
16331
  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: `
16302
16332
  <div class="scrollList">
16303
16333
  <app-recordinglist [selectedRecordingFile]="selectedRecordingFile" [selectDisabled]="selectDisabled" (selectedRecordingFileChanged)="selectRecordingFile($event)"></app-recordinglist>
@@ -16326,7 +16356,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
16326
16356
  [playStopAction]="playStopAction"></app-audiodisplay>
16327
16357
  </div>
16328
16358
  `, 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"] }]
16329
- }], ctorParameters: function () { return [{ type: i1$3.BreakpointObserver }]; }, propDecorators: { recordingListComp: [{
16359
+ }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }]; }, propDecorators: { recordingListComp: [{
16330
16360
  type: ViewChild,
16331
16361
  args: [RecordingList]
16332
16362
  }], selectDisabled: [{
@@ -16353,11 +16383,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
16353
16383
  }] } });
16354
16384
 
16355
16385
  class AudioRecorder extends BasicRecorder {
16356
- constructor(bpo, changeDetectorRef, renderer, route, dialog, sessionService, recFileService, uploader, config) {
16386
+ constructor(bpo, changeDetectorRef, renderer, dialog, sessionService, recFileService, uploader, config) {
16357
16387
  super(bpo, changeDetectorRef, dialog, sessionService, uploader, config);
16358
16388
  this.bpo = bpo;
16359
16389
  this.renderer = renderer;
16360
- this.route = route;
16361
16390
  this.recFileService = recFileService;
16362
16391
  this.uploader = uploader;
16363
16392
  this._project = null;
@@ -17267,7 +17296,7 @@ class AudioRecorder extends BasicRecorder {
17267
17296
  }
17268
17297
  }
17269
17298
  }
17270
- 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 });
17299
+ 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 });
17271
17300
  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: `
17272
17301
  <app-warningbar [show]="isTestSession()" warningText="Test recording only!"></app-warningbar>
17273
17302
  <app-warningbar [show]="isDefaultAudioTestSession()"
@@ -17389,7 +17418,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
17389
17418
  </div>
17390
17419
  `, 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"] }]
17391
17420
  }], ctorParameters: function () {
17392
- 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: [{
17421
+ return [{ type: i1$2.BreakpointObserver }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i1$3.MatDialog }, { type: SessionService }, { type: RecordingService }, { type: SpeechRecorderUploader }, { type: SpeechRecorderConfig, decorators: [{
17393
17422
  type: Inject,
17394
17423
  args: [SPEECHRECORDER_CONFIG]
17395
17424
  }] }];
@@ -17435,7 +17464,7 @@ class AudioRecorderComponent extends RecorderComponent {
17435
17464
  }
17436
17465
  else {
17437
17466
  // all this attempts to customize the message do not work anymore (for security reasons)!!
17438
- var message = "Please do not leave the page, until all recordings are uploaded!";
17467
+ const message = "Please do not leave the page, until all recordings are uploaded!";
17439
17468
  alert(message);
17440
17469
  e = e || window.event;
17441
17470
  if (e) {
@@ -17535,7 +17564,7 @@ class AudioRecorderComponent extends RecorderComponent {
17535
17564
  return this.dataSaved && !this.ar.isActive();
17536
17565
  }
17537
17566
  }
17538
- 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 });
17567
+ 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 });
17539
17568
  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: `
17540
17569
  <app-audiorecorder [projectName]="_project?.name" [dataSaved]="dataSaved"></app-audiorecorder>
17541
17570
  `, 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"] }] });
@@ -17544,7 +17573,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
17544
17573
  args: [{ selector: 'app-audiorecorder-comp', providers: [SessionService], template: `
17545
17574
  <app-audiorecorder [projectName]="_project?.name" [dataSaved]="dataSaved"></app-audiorecorder>
17546
17575
  `, styles: [":host{flex:2;display:flex;height:100%;flex-direction:column;min-height:0}\n"] }]
17547
- }], ctorParameters: function () { return [{ type: i1$2.ActivatedRoute }, { type: i1$2.Router }, { type: i0.ChangeDetectorRef }, { type: SessionService }, { type: ProjectService }, { type: SpeechRecorderUploader }]; }, propDecorators: { ar: [{
17576
+ }], ctorParameters: function () { return [{ type: i4$2.ActivatedRoute }, { type: i4$2.Router }, { type: i0.ChangeDetectorRef }, { type: SessionService }, { type: ProjectService }, { type: SpeechRecorderUploader }]; }, propDecorators: { ar: [{
17548
17577
  type: ViewChild,
17549
17578
  args: [AudioRecorder, { static: true }]
17550
17579
  }] } });
@@ -17580,7 +17609,7 @@ class SpeechrecorderngModule {
17580
17609
  }
17581
17610
  SpeechrecorderngModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SpeechrecorderngModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
17582
17611
  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,
17583
- 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] });
17612
+ 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] });
17584
17613
  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] });
17585
17614
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SpeechrecorderngModule, decorators: [{
17586
17615
  type: NgModule,
@@ -17593,7 +17622,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
17593
17622
  }]
17594
17623
  }] });
17595
17624
 
17596
- const VERSION = '3.4.4';
17625
+ const VERSION = '3.4.5';
17597
17626
 
17598
17627
  /*
17599
17628
  * Public API Surface of speechrecorderng