speechrecorderng 2.23.7 → 2.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -22,6 +22,7 @@ import { MatButtonModule } from '@angular/material/button';
22
22
  import * as i1$3 from '@angular/material/progress-spinner';
23
23
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
24
24
  import * as i8 from '@angular/flex-layout/flex';
25
+ import NoSleep from 'nosleep.js';
25
26
  import * as i7 from '@angular/material/progress-bar';
26
27
  import { MatProgressBarModule } from '@angular/material/progress-bar';
27
28
  import { FlexLayoutModule } from '@angular/flex-layout';
@@ -7259,6 +7260,7 @@ class BasicRecorder {
7259
7260
  this.readonly = false;
7260
7261
  this.processingRecording = false;
7261
7262
  this.ac = null;
7263
+ this._wakeLock = false;
7262
7264
  this._selectedDeviceId = undefined;
7263
7265
  this._channelCount = 2;
7264
7266
  this._session = null;
@@ -7271,6 +7273,7 @@ class BasicRecorder {
7271
7273
  this.audioFetchSubscription = null;
7272
7274
  this.destroyed = false;
7273
7275
  this.navigationDisabled = true;
7276
+ this.noSleep = null;
7274
7277
  this.userAgent = UserAgentBuilder.userAgent();
7275
7278
  console.debug("Detected platform: " + this.userAgent.detectedPlatform);
7276
7279
  console.debug("Detected browser: " + this.userAgent.detectedBrowser);
@@ -7280,6 +7283,27 @@ class BasicRecorder {
7280
7283
  this.streamLevelMeasure = new StreamLevelMeasure();
7281
7284
  this.selCaptureDeviceId = null;
7282
7285
  }
7286
+ get wakeLock() {
7287
+ return this._wakeLock;
7288
+ }
7289
+ set wakeLock(value) {
7290
+ this._wakeLock = value;
7291
+ }
7292
+ enableWakeLockCond() {
7293
+ if (this.wakeLock === true) {
7294
+ if (!this.noSleep) {
7295
+ this.noSleep = new NoSleep();
7296
+ }
7297
+ if (!this.noSleep.isEnabled) {
7298
+ this.noSleep.enable();
7299
+ }
7300
+ }
7301
+ }
7302
+ disableWakeLockCond() {
7303
+ if (this.noSleep && this.noSleep.isEnabled) {
7304
+ this.noSleep.disable();
7305
+ }
7306
+ }
7283
7307
  set audioDevices(audioDevices) {
7284
7308
  this._audioDevices = audioDevices;
7285
7309
  }
@@ -7872,6 +7896,7 @@ class SessionManager extends BasicRecorder {
7872
7896
  };
7873
7897
  }
7874
7898
  ngOnDestroy() {
7899
+ this.disableWakeLockCond();
7875
7900
  this.destroyed = true;
7876
7901
  // TODO stop capture /playback
7877
7902
  }
@@ -8079,6 +8104,7 @@ class SessionManager extends BasicRecorder {
8079
8104
  }
8080
8105
  }
8081
8106
  startItem() {
8107
+ this.enableWakeLockCond();
8082
8108
  this.transportActions.startAction.disabled = true;
8083
8109
  this.transportActions.pauseAction.disabled = true;
8084
8110
  if (this.readonly) {
@@ -8807,6 +8833,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
8807
8833
  args: ['window:keydown', ['$event']]
8808
8834
  }] } });
8809
8835
 
8836
+ class RecorderComponent {
8837
+ }
8838
+
8810
8839
  /**
8811
8840
  * Created by klausj on 17.06.2017.
8812
8841
  */
@@ -8853,8 +8882,9 @@ var Mode;
8853
8882
  Mode[Mode["SINGLE_SESSION"] = 0] = "SINGLE_SESSION";
8854
8883
  Mode[Mode["DEMO"] = 1] = "DEMO";
8855
8884
  })(Mode || (Mode = {}));
8856
- class SpeechrecorderngComponent {
8885
+ class SpeechrecorderngComponent extends RecorderComponent {
8857
8886
  constructor(route, router, changeDetectorRef, sessionsService, projectService, scriptService, recFilesService, uploader) {
8887
+ super();
8858
8888
  this.route = route;
8859
8889
  this.router = router;
8860
8890
  this.changeDetectorRef = changeDetectorRef;
@@ -8887,6 +8917,8 @@ class SpeechrecorderngComponent {
8887
8917
  }
8888
8918
  }
8889
8919
  ngAfterViewInit() {
8920
+ // let wakeLockSupp=('wakeLock' in navigator);
8921
+ // alert('Wake lock API supported: '+wakeLockSupp);
8890
8922
  if (this.sm.status !== 8 /* ERROR */) {
8891
8923
  let initSuccess = this.init();
8892
8924
  if (initSuccess) {
@@ -9049,6 +9081,7 @@ class SpeechrecorderngComponent {
9049
9081
  this.uploader.listener = (ue) => {
9050
9082
  this.uploadUpdate(ue);
9051
9083
  };
9084
+ //TODO Duplicate code in AudioRecorderComponent
9052
9085
  window.addEventListener('beforeunload', (e) => {
9053
9086
  console.debug("Before page unload event");
9054
9087
  if (this.ready()) {
@@ -9130,6 +9163,9 @@ class SpeechrecorderngComponent {
9130
9163
  let chCnt = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;
9131
9164
  if (project) {
9132
9165
  console.info("Project name: " + project.name);
9166
+ if (project.recordingDeviceWakeLock === true) {
9167
+ this.sm.wakeLock = true;
9168
+ }
9133
9169
  this.sm.audioDevices = project.audioDevices;
9134
9170
  chCnt = ProjectUtil.audioChannelCount(project);
9135
9171
  console.info("Project requested recording channel count: " + chCnt);
@@ -9235,7 +9271,7 @@ class SpeechrecorderngComponent {
9235
9271
  }
9236
9272
  }
9237
9273
  SpeechrecorderngComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SpeechrecorderngComponent, deps: [{ token: i1$1.ActivatedRoute }, { token: i1$1.Router }, { token: i0.ChangeDetectorRef }, { token: SessionService }, { token: ProjectService }, { token: ScriptService }, { token: RecordingService }, { token: SpeechRecorderUploader }], target: i0.ɵɵFactoryTarget.Component });
9238
- SpeechrecorderngComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: SpeechrecorderngComponent, selector: "app-speechrecorder", providers: [SessionService], viewQueries: [{ propertyName: "sm", first: true, predicate: SessionManager, descendants: true, static: true }], ngImport: i0, template: `
9274
+ SpeechrecorderngComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: SpeechrecorderngComponent, selector: "app-speechrecorder", providers: [SessionService], viewQueries: [{ propertyName: "sm", first: true, predicate: SessionManager, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
9239
9275
  <app-sprrecordingsession [projectName]="project?.name" [dataSaved]="dataSaved"></app-sprrecordingsession>
9240
9276
  `, isInline: true, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0}\n"], components: [{ type: SessionManager, selector: "app-sprrecordingsession", inputs: ["projectName", "dataSaved"] }] });
9241
9277
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SpeechrecorderngComponent, decorators: [{
@@ -10893,11 +10929,11 @@ class Item {
10893
10929
  }
10894
10930
  }
10895
10931
  class AudioRecorder extends BasicRecorder {
10896
- constructor(changeDetectorRef, route, renderer, dialog, projectService, sessionService, recFileService, uploader, config) {
10932
+ constructor(changeDetectorRef, renderer, route, dialog, projectService, sessionService, recFileService, uploader, config) {
10897
10933
  super(dialog, sessionService);
10898
10934
  this.changeDetectorRef = changeDetectorRef;
10899
- this.route = route;
10900
10935
  this.renderer = renderer;
10936
+ this.route = route;
10901
10937
  this.dialog = dialog;
10902
10938
  this.projectService = projectService;
10903
10939
  this.sessionService = sessionService;
@@ -10918,6 +10954,7 @@ class AudioRecorder extends BasicRecorder {
10918
10954
  //selectedItemIdx: number;
10919
10955
  this._displayRecFile = null;
10920
10956
  this.displayRecFileVersion = 0;
10957
+ //super(injector);
10921
10958
  this.status = 1 /* IDLE */;
10922
10959
  this.audio = document.getElementById('audio');
10923
10960
  if (this.config && this.config.enableUploadRecordings != null) {
@@ -10926,25 +10963,26 @@ class AudioRecorder extends BasicRecorder {
10926
10963
  if (this.config && this.config.enableDownloadRecordings != null) {
10927
10964
  this.enableDownloadRecordings = this.config.enableDownloadRecordings;
10928
10965
  }
10929
- this.init();
10966
+ //this.init();
10930
10967
  }
10931
10968
  ngAfterViewInit() {
10932
- this.route.queryParams.subscribe((params) => {
10933
- if (params['sessionId']) {
10934
- this.fetchSession(params['sessionId']);
10935
- }
10936
- });
10937
10969
  this.streamLevelMeasure.levelListener = this.liveLevelDisplay;
10938
10970
  this.streamLevelMeasure.peakLevelListener = (peakLvlInDb) => {
10939
10971
  this.peakLevelInDb = peakLvlInDb;
10940
10972
  this.changeDetectorRef.detectChanges();
10941
10973
  };
10974
+ //let wakeLockSupp=('wakeLock' in navigator);
10975
+ //alert('Wake lock API supported: '+wakeLockSupp);
10976
+ }
10977
+ ready() {
10978
+ return this.dataSaved && !this.isActive();
10942
10979
  }
10943
10980
  ngOnDestroy() {
10981
+ this.disableWakeLockCond();
10944
10982
  this.destroyed = true;
10945
10983
  // TODO stop capture /playback
10946
10984
  }
10947
- init() {
10985
+ ngOnInit() {
10948
10986
  this.transportActions.startAction.disabled = true;
10949
10987
  this.transportActions.stopAction.disabled = true;
10950
10988
  this.transportActions.nextAction.disabled = true;
@@ -10994,7 +11032,7 @@ class AudioRecorder extends BasicRecorder {
10994
11032
  return;
10995
11033
  }
10996
11034
  else {
10997
- this.controlAudioPlayer = new AudioPlayer(context, this);
11035
+ //this.controlAudioPlayer = new AudioPlayer(context, this);
10998
11036
  this.ac = new AudioCapture(context);
10999
11037
  if (this.ac) {
11000
11038
  this.transportActions.startAction.onAction = () => this.startItem();
@@ -11026,6 +11064,23 @@ class AudioRecorder extends BasicRecorder {
11026
11064
  this.uploader.listener = (ue) => {
11027
11065
  this.uploadUpdate(ue);
11028
11066
  };
11067
+ let wakeLockSupp = ('wakeLock' in navigator);
11068
+ // if(wakeLockSupp) {
11069
+ // let wakeLock = null;
11070
+ // try {
11071
+ // //@ts-ignore
11072
+ // wakeLock = navigator.wakeLock.request('screen');
11073
+ //
11074
+ // //statusElem.textContent = 'Wake Lock is active!';
11075
+ // } catch (err) {
11076
+ // // The Wake Lock request has failed - usually system related, such as battery.
11077
+ // console.error('Wakelock failed'+err)
11078
+ // }
11079
+ // }else{
11080
+ // let noSleep=new NoSleep();
11081
+ // noSleep.enable();
11082
+ //
11083
+ // }
11029
11084
  }
11030
11085
  onKeyPress(ke) {
11031
11086
  if (ke.key == ' ') {
@@ -11071,43 +11126,6 @@ class AudioRecorder extends BasicRecorder {
11071
11126
  isDefaultAudioTestSessionOverwriteingProjectRequirements() {
11072
11127
  return ((this._session != null) && (this._session.type === 'TEST_DEF_A') && (this.audioDevices != null) && this.audioDevices.length > 0);
11073
11128
  }
11074
- fetchSession(sessionId) {
11075
- //Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'statusMsg: Player initialized.'. Current value: 'statusMsg: Fetching session info...'.
11076
- // params.subscribe seems not to be asynchronous
11077
- // this.sm.statusAlertType='info';
11078
- // this.sm.statusMsg = 'Fetching session info...';
11079
- // this.sm.statusWaiting=true;
11080
- let sessObs = this.sessionService.sessionObserver(sessionId);
11081
- if (sessObs) {
11082
- sessObs.subscribe(sess => {
11083
- //this.setSession(sess);
11084
- this.statusAlertType = 'info';
11085
- this.statusMsg = 'Received session info.';
11086
- this.statusWaiting = false;
11087
- this.session = sess;
11088
- if (sess.project) {
11089
- //console.debug("Session associated project: "+sess.project)
11090
- this.projectService.projectObservable(sess.project).subscribe(project => {
11091
- this.project = project;
11092
- this.fetchRecordings(sess);
11093
- }, reason => {
11094
- this.statusMsg = reason;
11095
- this.statusAlertType = 'error';
11096
- this.statusWaiting = false;
11097
- console.error("Error fetching project config: " + reason);
11098
- });
11099
- }
11100
- else {
11101
- console.info("Session has no associated project. Using default configuration.");
11102
- }
11103
- }, (reason) => {
11104
- this.statusMsg = reason;
11105
- this.statusAlertType = 'error';
11106
- this.statusWaiting = false;
11107
- console.error("Error fetching session " + reason);
11108
- });
11109
- }
11110
- }
11111
11129
  fetchRecordings(sess) {
11112
11130
  this.statusAlertType = 'info';
11113
11131
  this.statusMsg = 'Fetching infos of recordings...';
@@ -11159,6 +11177,9 @@ class AudioRecorder extends BasicRecorder {
11159
11177
  let chCnt = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;
11160
11178
  if (project) {
11161
11179
  console.info("Project name: " + project.name);
11180
+ if (project.recordingDeviceWakeLock === true) {
11181
+ this.wakeLock = true;
11182
+ }
11162
11183
  this.audioDevices = project.audioDevices;
11163
11184
  chCnt = ProjectUtil.audioChannelCount(project);
11164
11185
  console.info("Project requested recording channel count: " + chCnt);
@@ -11262,6 +11283,7 @@ class AudioRecorder extends BasicRecorder {
11262
11283
  }
11263
11284
  }
11264
11285
  startItem() {
11286
+ this.enableWakeLockCond();
11265
11287
  this.transportActions.startAction.disabled = true;
11266
11288
  this.transportActions.pauseAction.disabled = true;
11267
11289
  if (this.readonly) {
@@ -11577,8 +11599,8 @@ class AudioRecorder extends BasicRecorder {
11577
11599
  }
11578
11600
  }
11579
11601
  }
11580
- AudioRecorder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: AudioRecorder, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$1.ActivatedRoute }, { token: i0.Renderer2 }, { token: i1$2.MatDialog }, { token: ProjectService }, { token: SessionService }, { token: RecordingService }, { token: SpeechRecorderUploader }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
11581
- AudioRecorder.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", 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: `
11602
+ AudioRecorder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: AudioRecorder, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i1$1.ActivatedRoute }, { token: i1$2.MatDialog }, { token: ProjectService }, { token: SessionService }, { token: RecordingService }, { token: SpeechRecorderUploader }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
11603
+ AudioRecorder.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: AudioRecorder, selector: "app-audiorecorder", inputs: { _project: "_project", 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: `
11582
11604
  <app-warningbar [show]="isTestSession()" warningText="Test recording only!"></app-warningbar>
11583
11605
  <app-warningbar [show]="isDefaultAudioTestSession()"
11584
11606
  warningText="This test uses default audio device! Regular sessions may require a particular audio device (microphone)!"></app-warningbar>
@@ -11634,7 +11656,7 @@ AudioRecorder.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
11634
11656
  [ready]="dataSaved && !isActive()"></app-readystateindicator>
11635
11657
  </div>
11636
11658
  </div>
11637
- `, isInline: true, styles: [":host{flex:2;background:lightgrey;display:flex;flex-direction:column;margin:0;padding:0;min-height:0px;overflow:hidden}\n", ".ricontrols{padding:4px;box-sizing:border-box;height:100%}\n", ".dark{background:darkgray}\n", ".controlpanel{align-content:center;align-items:center;margin:0;padding:20px;min-height:-webkit-min-content;min-height:min-content}\n", ".startstop{width:100%;text-align:center;align-content:center;align-items:center}\n", ".bigbutton{min-width:70px;min-height:50px;font-size:50px;border-radius:20px}\n"], components: [{ type: WarningBar, selector: "app-warningbar", inputs: ["warningText", "show"] }, { type: RecorderCombiPane, selector: "app-recordercombipane", inputs: ["selectDisabled", "selectedRecordingFile", "audioSignalCollapsed", "displayAudioClip", "playStartAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "playStopAction"], outputs: ["selectedRecordingFileChanged"] }, { type: LevelBar, selector: "audio-levelbar", inputs: ["streamingMode", "displayLevelInfos"] }, { type: RecordingItemControls, selector: "spr-recordingitemcontrols", inputs: ["audioSignalCollapsed", "enableDownload", "peakDbLvl", "agc", "audioLoaded", "playStartAction", "playStopAction", "displayLevelInfos"], outputs: ["onShowRecordingDetails", "onDownloadRecording"] }, { type: UploadStatus, selector: "app-uploadstatus", inputs: ["value", "awaitNewUpload", "status"] }, { type: ReadyStateIndicator, selector: "app-readystateindicator", inputs: ["ready"] }, { type: StatusDisplay, selector: "app-sprstatusdisplay", inputs: ["statusAlertType", "statusMsg", "statusWaiting"] }, { type: i3$2.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"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i8.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i3$1.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i8.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3$1.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }] });
11659
+ `, isInline: true, 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{align-content:center;align-items:center;margin:0;padding:20px;min-height:-webkit-min-content;min-height:min-content}\n", ".startstop{width:100%;text-align:center;align-content:center;align-items:center}\n", ".bigbutton{min-width:70px;min-height:50px;font-size:50px;border-radius:20px}\n"], components: [{ type: WarningBar, selector: "app-warningbar", inputs: ["warningText", "show"] }, { type: RecorderCombiPane, selector: "app-recordercombipane", inputs: ["selectDisabled", "selectedRecordingFile", "audioSignalCollapsed", "displayAudioClip", "playStartAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "playStopAction"], outputs: ["selectedRecordingFileChanged"] }, { type: LevelBar, selector: "audio-levelbar", inputs: ["streamingMode", "displayLevelInfos"] }, { type: RecordingItemControls, selector: "spr-recordingitemcontrols", inputs: ["audioSignalCollapsed", "enableDownload", "peakDbLvl", "agc", "audioLoaded", "playStartAction", "playStopAction", "displayLevelInfos"], outputs: ["onShowRecordingDetails", "onDownloadRecording"] }, { type: UploadStatus, selector: "app-uploadstatus", inputs: ["value", "awaitNewUpload", "status"] }, { type: ReadyStateIndicator, selector: "app-readystateindicator", inputs: ["ready"] }, { type: StatusDisplay, selector: "app-sprstatusdisplay", inputs: ["statusAlertType", "statusMsg", "statusWaiting"] }, { type: i3$2.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"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i8.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i3$1.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i8.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3$1.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }] });
11638
11660
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: AudioRecorder, decorators: [{
11639
11661
  type: Component,
11640
11662
  args: [{
@@ -11704,8 +11726,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
11704
11726
  flex-direction: column;
11705
11727
  margin: 0;
11706
11728
  padding: 0;
11729
+ height: 100%;
11707
11730
  min-height: 0px;
11708
-
11709
11731
  /* Prevents horizontal scroll bar on swipe right */
11710
11732
  overflow: hidden;
11711
11733
  }`, `.ricontrols {
@@ -11733,10 +11755,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
11733
11755
  }`
11734
11756
  ]
11735
11757
  }]
11736
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1$1.ActivatedRoute }, { type: i0.Renderer2 }, { type: i1$2.MatDialog }, { type: ProjectService }, { type: SessionService }, { type: RecordingService }, { type: SpeechRecorderUploader }, { type: SpeechRecorderConfig, decorators: [{
11758
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i1$1.ActivatedRoute }, { type: i1$2.MatDialog }, { type: ProjectService }, { type: SessionService }, { type: RecordingService }, { type: SpeechRecorderUploader }, { type: SpeechRecorderConfig, decorators: [{
11737
11759
  type: Inject,
11738
11760
  args: [SPEECHRECORDER_CONFIG]
11739
- }] }]; }, propDecorators: { projectName: [{
11761
+ }] }]; }, propDecorators: { _project: [{
11762
+ type: Input
11763
+ }], projectName: [{
11740
11764
  type: Input
11741
11765
  }], recorderCombiPane: [{
11742
11766
  type: ViewChild,
@@ -11752,11 +11776,138 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
11752
11776
  }], onKeyDown: [{
11753
11777
  type: HostListener,
11754
11778
  args: ['window:keydown', ['$event']]
11779
+ }] } });
11780
+ class AudioRecorderComponent extends RecorderComponent {
11781
+ constructor(injector, route, router, changeDetectorRef, sessionService, projectService, recFilesService) {
11782
+ super();
11783
+ this.injector = injector;
11784
+ this.route = route;
11785
+ this.router = router;
11786
+ this.changeDetectorRef = changeDetectorRef;
11787
+ this.sessionService = sessionService;
11788
+ this.projectService = projectService;
11789
+ this.recFilesService = recFilesService;
11790
+ this.dataSaved = true;
11791
+ }
11792
+ ngOnInit() {
11793
+ //super.ngOnInit();
11794
+ let audioContext = AudioContextProvider.audioContextInstance();
11795
+ if (audioContext) {
11796
+ this.controlAudioPlayer = new AudioPlayer(audioContext, this.ar);
11797
+ }
11798
+ this.ar.controlAudioPlayer = this.controlAudioPlayer;
11799
+ //TODO Duplicate code in SpeechRecorderComponent
11800
+ window.addEventListener('beforeunload', (e) => {
11801
+ console.debug("Before page unload event");
11802
+ if (this.ready()) {
11803
+ return;
11804
+ }
11805
+ else {
11806
+ // all this attempts to customize the message do not work anymore (for security reasons)!!
11807
+ var message = "Please do not leave the page, until all recordings are uploaded!";
11808
+ alert(message);
11809
+ e = e || window.event;
11810
+ if (e) {
11811
+ e.returnValue = message;
11812
+ e.cancelBubble = true;
11813
+ if (e.stopPropagation) {
11814
+ e.stopPropagation();
11815
+ }
11816
+ if (e.preventDefault) {
11817
+ e.preventDefault();
11818
+ }
11819
+ }
11820
+ return message;
11821
+ }
11822
+ });
11823
+ }
11824
+ ngAfterViewInit() {
11825
+ this.route.queryParams.subscribe((params) => {
11826
+ if (params['sessionId']) {
11827
+ this.fetchSession(params['sessionId']);
11828
+ }
11829
+ });
11830
+ this.route.params.subscribe((params) => {
11831
+ let routeParamsId = params['id'];
11832
+ if (routeParamsId) {
11833
+ this.fetchSession(routeParamsId);
11834
+ }
11835
+ });
11836
+ }
11837
+ ngOnDestroy() {
11838
+ //super.ngOnDestroy();
11839
+ }
11840
+ fetchSession(sessionId) {
11841
+ //Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'statusMsg: Player initialized.'. Current value: 'statusMsg: Fetching session info...'.
11842
+ // params.subscribe seems not to be asynchronous
11843
+ // this.sm.statusAlertType='info';
11844
+ // this.sm.statusMsg = 'Fetching session info...';
11845
+ // this.sm.statusWaiting=true;
11846
+ let sessObs = this.sessionService.sessionObserver(sessionId);
11847
+ if (sessObs) {
11848
+ sessObs.subscribe(sess => {
11849
+ this.ar.statusAlertType = 'info';
11850
+ this.ar.statusMsg = 'Received session info.';
11851
+ this.ar.statusWaiting = false;
11852
+ this.session = sess;
11853
+ this.ar.session = sess;
11854
+ if (sess.project) {
11855
+ //console.debug("Session associated project: "+sess.project)
11856
+ this.projectService.projectObservable(sess.project).subscribe(project => {
11857
+ this.ar.project = project;
11858
+ this.ar.fetchRecordings(sess);
11859
+ }, reason => {
11860
+ this.ar.statusMsg = reason;
11861
+ this.ar.statusAlertType = 'error';
11862
+ this.ar.statusWaiting = false;
11863
+ console.error("Error fetching project config: " + reason);
11864
+ });
11865
+ }
11866
+ else {
11867
+ console.info("Session has no associated project. Using default configuration.");
11868
+ }
11869
+ }, (reason) => {
11870
+ this.ar.statusMsg = reason;
11871
+ this.ar.statusAlertType = 'error';
11872
+ this.ar.statusWaiting = false;
11873
+ console.error("Error fetching session " + reason);
11874
+ });
11875
+ }
11876
+ }
11877
+ ready() {
11878
+ return this.dataSaved && !this.ar.isActive();
11879
+ }
11880
+ }
11881
+ AudioRecorderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: AudioRecorderComponent, deps: [{ token: i0.Injector }, { token: i1$1.ActivatedRoute }, { token: i1$1.Router }, { token: i0.ChangeDetectorRef }, { token: SessionService }, { token: ProjectService }, { token: RecordingService }], target: i0.ɵɵFactoryTarget.Component });
11882
+ AudioRecorderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: AudioRecorderComponent, selector: "app-audiorecorder-comp", providers: [SessionService], viewQueries: [{ propertyName: "ar", first: true, predicate: AudioRecorder, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
11883
+ <app-audiorecorder [projectName]="_project?.name" [dataSaved]="dataSaved"></app-audiorecorder>
11884
+ `, isInline: true, styles: [":host{flex:2;display:flex;height:100%;flex-direction:column;min-height:0}\n"], components: [{ type: AudioRecorder, selector: "app-audiorecorder", inputs: ["_project", "projectName", "dataSaved"] }] });
11885
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: AudioRecorderComponent, decorators: [{
11886
+ type: Component,
11887
+ args: [{
11888
+ selector: 'app-audiorecorder-comp',
11889
+ providers: [SessionService],
11890
+ template: `
11891
+ <app-audiorecorder [projectName]="_project?.name" [dataSaved]="dataSaved"></app-audiorecorder>
11892
+ `,
11893
+ styles: [`:host{
11894
+ flex: 2;
11895
+ display: flex;
11896
+ height: 100%;
11897
+ flex-direction: column;
11898
+ min-height:0;
11899
+
11900
+ }`]
11901
+ }]
11902
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1$1.ActivatedRoute }, { type: i1$1.Router }, { type: i0.ChangeDetectorRef }, { type: SessionService }, { type: ProjectService }, { type: RecordingService }]; }, propDecorators: { ar: [{
11903
+ type: ViewChild,
11904
+ args: [AudioRecorder, { static: true }]
11755
11905
  }] } });
11756
11906
 
11757
11907
  const SPR_ROUTES = [
11758
11908
  { path: 'spr/session/:id', component: SpeechrecorderngComponent },
11759
- { path: 'recorder', component: AudioRecorder },
11909
+ { path: 'recorder/session/:id', component: AudioRecorderComponent },
11910
+ { path: 'recorder', component: AudioRecorderComponent },
11760
11911
  { path: 'spr/db/project/:project/session/:sessionId/recordingfile/_view/:recordingFileId', component: RecordingFileViewComponent },
11761
11912
  { path: 'spr/db/project/:project/session/:sessionId/recordingfile/_edit/:recordingFileId', component: RecordingFileUI },
11762
11913
  { path: 'spr/db/project/:project/session/:sessionId/recordingfile/_view', component: RecordingFileViewComponent },
@@ -11784,20 +11935,20 @@ class SpeechrecorderngModule {
11784
11935
  }
11785
11936
  SpeechrecorderngModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SpeechrecorderngModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
11786
11937
  SpeechrecorderngModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SpeechrecorderngModule, declarations: [AudioSignal, Sonagram, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar, Progress, SimpleTrafficLight, Recinstructions, Prompter, PromptContainer, PromptingContainer, Prompting, StatusDisplay,
11787
- ProgressDisplay, RecordingItemDisplay, RecordingItemControls, UploadStatus, TransportPanel, ReadyStateIndicator, ControlPanel, WarningBar, AudioRecorder, SessionManager, MessageDialog, SessionFinishedDialog, SpeechrecorderngComponent, RecordingFileViewComponent, RecordingFileUI, ScrollIntoViewDirective, RecordingFileNaviComponent, RecordingFileMetaComponent, RecordingList, RecorderCombiPane, AudioRecorder], imports: [i1$1.RouterModule, FlexLayoutModule, CommonModule, MatIconModule, MatButtonModule, MatDialogModule, MatProgressBarModule, MatProgressSpinnerModule, MatTooltipModule, HttpClientModule, MatCheckboxModule, MatCardModule, MatDividerModule, MatGridListModule, MatTableModule, MatInputModule, MatSelectModule, MatSnackBarModule], exports: [MessageDialog, SpeechrecorderngComponent, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar, AudioRecorder] });
11938
+ ProgressDisplay, RecordingItemDisplay, RecordingItemControls, UploadStatus, TransportPanel, ReadyStateIndicator, ControlPanel, WarningBar, AudioRecorder, SessionManager, MessageDialog, SessionFinishedDialog, SpeechrecorderngComponent, AudioRecorderComponent, RecordingFileViewComponent, RecordingFileUI, ScrollIntoViewDirective, RecordingFileNaviComponent, RecordingFileMetaComponent, RecordingList, RecorderCombiPane, AudioRecorder], imports: [i1$1.RouterModule, FlexLayoutModule, CommonModule, MatIconModule, MatButtonModule, MatDialogModule, MatProgressBarModule, MatProgressSpinnerModule, MatTooltipModule, HttpClientModule, MatCheckboxModule, MatCardModule, MatDividerModule, MatGridListModule, MatTableModule, MatInputModule, MatSelectModule, MatSnackBarModule], exports: [MessageDialog, SpeechrecorderngComponent, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar, AudioRecorder] });
11788
11939
  SpeechrecorderngModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SpeechrecorderngModule, providers: [SessionService, ProjectService, ScriptService, RecordingService, RecordingFileService, SpeechRecorderUploader], imports: [[RouterModule.forChild(SPR_ROUTES), FlexLayoutModule, CommonModule, MatIconModule, MatButtonModule, MatDialogModule, MatProgressBarModule, MatProgressSpinnerModule, MatTooltipModule, HttpClientModule, MatCheckboxModule, MatCardModule, MatDividerModule, MatGridListModule, MatTableModule, MatInputModule, MatSelectModule, MatSnackBarModule]] });
11789
11940
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SpeechrecorderngModule, decorators: [{
11790
11941
  type: NgModule,
11791
11942
  args: [{
11792
11943
  declarations: [AudioSignal, Sonagram, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar, Progress, SimpleTrafficLight, Recinstructions, Prompter, PromptContainer, PromptingContainer, Prompting, StatusDisplay,
11793
- ProgressDisplay, RecordingItemDisplay, RecordingItemControls, UploadStatus, TransportPanel, ReadyStateIndicator, ControlPanel, WarningBar, AudioRecorder, SessionManager, MessageDialog, SessionFinishedDialog, SpeechrecorderngComponent, RecordingFileViewComponent, RecordingFileUI, ScrollIntoViewDirective, RecordingFileNaviComponent, RecordingFileMetaComponent, RecordingList, RecorderCombiPane, AudioRecorder],
11944
+ ProgressDisplay, RecordingItemDisplay, RecordingItemControls, UploadStatus, TransportPanel, ReadyStateIndicator, ControlPanel, WarningBar, AudioRecorder, SessionManager, MessageDialog, SessionFinishedDialog, SpeechrecorderngComponent, AudioRecorderComponent, RecordingFileViewComponent, RecordingFileUI, ScrollIntoViewDirective, RecordingFileNaviComponent, RecordingFileMetaComponent, RecordingList, RecorderCombiPane, AudioRecorder],
11794
11945
  exports: [MessageDialog, SpeechrecorderngComponent, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar, AudioRecorder],
11795
11946
  imports: [RouterModule.forChild(SPR_ROUTES), FlexLayoutModule, CommonModule, MatIconModule, MatButtonModule, MatDialogModule, MatProgressBarModule, MatProgressSpinnerModule, MatTooltipModule, HttpClientModule, MatCheckboxModule, MatCardModule, MatDividerModule, MatGridListModule, MatTableModule, MatInputModule, MatSelectModule, MatSnackBarModule],
11796
11947
  providers: [SessionService, ProjectService, ScriptService, RecordingService, RecordingFileService, SpeechRecorderUploader]
11797
11948
  }]
11798
11949
  }] });
11799
11950
 
11800
- const VERSION = '2.23.7';
11951
+ const VERSION = '2.24.0';
11801
11952
 
11802
11953
  /*
11803
11954
  * Public API Surface of speechrecorderng
@@ -11807,5 +11958,5 @@ const VERSION = '2.23.7';
11807
11958
  * Generated bundle index. Do not edit.
11808
11959
  */
11809
11960
 
11810
- export { Action, ApiType, AudioClip, AudioClipUIContainer, AudioContextProvider, AudioDisplay, AudioDisplayControl, AudioDisplayPlayer, AudioDisplayScrollPane, AudioPlayer, AudioPlayerEvent, AudioRecorder, EventType, LevelBar, MessageDialog, ProjectService, RecordingFileService, RecordingFileUI, RecordingFileViewComponent, RecordingService, SPEECHRECORDER_CONFIG, ScriptService, ScrollPaneHorizontal, Selection, SessionService, SpeechRecorderConfig, SpeechrecorderngComponent, SpeechrecorderngModule, SprRecordingFile, UUID, VERSION };
11961
+ export { Action, ApiType, AudioClip, AudioClipUIContainer, AudioContextProvider, AudioDisplay, AudioDisplayControl, AudioDisplayPlayer, AudioDisplayScrollPane, AudioPlayer, AudioPlayerEvent, AudioRecorder, AudioRecorderComponent, EventType, LevelBar, MessageDialog, ProjectService, RecorderComponent, RecordingFileService, RecordingFileUI, RecordingFileViewComponent, RecordingService, SPEECHRECORDER_CONFIG, ScriptService, ScrollPaneHorizontal, Selection, SessionService, SpeechRecorderConfig, SpeechrecorderngComponent, SpeechrecorderngModule, SprRecordingFile, UUID, VERSION, WavWriter };
11811
11962
  //# sourceMappingURL=speechrecorderng.mjs.map