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';
@@ -7272,6 +7273,7 @@ class BasicRecorder {
7272
7273
  this.readonly = false;
7273
7274
  this.processingRecording = false;
7274
7275
  this.ac = null;
7276
+ this._wakeLock = false;
7275
7277
  this._selectedDeviceId = undefined;
7276
7278
  this._channelCount = 2;
7277
7279
  this._session = null;
@@ -7284,6 +7286,7 @@ class BasicRecorder {
7284
7286
  this.audioFetchSubscription = null;
7285
7287
  this.destroyed = false;
7286
7288
  this.navigationDisabled = true;
7289
+ this.noSleep = null;
7287
7290
  this.userAgent = UserAgentBuilder.userAgent();
7288
7291
  console.debug("Detected platform: " + this.userAgent.detectedPlatform);
7289
7292
  console.debug("Detected browser: " + this.userAgent.detectedBrowser);
@@ -7293,6 +7296,27 @@ class BasicRecorder {
7293
7296
  this.streamLevelMeasure = new StreamLevelMeasure();
7294
7297
  this.selCaptureDeviceId = null;
7295
7298
  }
7299
+ get wakeLock() {
7300
+ return this._wakeLock;
7301
+ }
7302
+ set wakeLock(value) {
7303
+ this._wakeLock = value;
7304
+ }
7305
+ enableWakeLockCond() {
7306
+ if (this.wakeLock === true) {
7307
+ if (!this.noSleep) {
7308
+ this.noSleep = new NoSleep();
7309
+ }
7310
+ if (!this.noSleep.isEnabled) {
7311
+ this.noSleep.enable();
7312
+ }
7313
+ }
7314
+ }
7315
+ disableWakeLockCond() {
7316
+ if (this.noSleep && this.noSleep.isEnabled) {
7317
+ this.noSleep.disable();
7318
+ }
7319
+ }
7296
7320
  set audioDevices(audioDevices) {
7297
7321
  this._audioDevices = audioDevices;
7298
7322
  }
@@ -7889,6 +7913,7 @@ class SessionManager extends BasicRecorder {
7889
7913
  };
7890
7914
  }
7891
7915
  ngOnDestroy() {
7916
+ this.disableWakeLockCond();
7892
7917
  this.destroyed = true;
7893
7918
  // TODO stop capture /playback
7894
7919
  }
@@ -8096,6 +8121,7 @@ class SessionManager extends BasicRecorder {
8096
8121
  }
8097
8122
  }
8098
8123
  startItem() {
8124
+ this.enableWakeLockCond();
8099
8125
  this.transportActions.startAction.disabled = true;
8100
8126
  this.transportActions.pauseAction.disabled = true;
8101
8127
  if (this.readonly) {
@@ -8826,6 +8852,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
8826
8852
  args: ['window:keydown', ['$event']]
8827
8853
  }] } });
8828
8854
 
8855
+ class RecorderComponent {
8856
+ }
8857
+
8829
8858
  /**
8830
8859
  * Created by klausj on 17.06.2017.
8831
8860
  */
@@ -8874,8 +8903,9 @@ var Mode;
8874
8903
  Mode[Mode["SINGLE_SESSION"] = 0] = "SINGLE_SESSION";
8875
8904
  Mode[Mode["DEMO"] = 1] = "DEMO";
8876
8905
  })(Mode || (Mode = {}));
8877
- class SpeechrecorderngComponent {
8906
+ class SpeechrecorderngComponent extends RecorderComponent {
8878
8907
  constructor(route, router, changeDetectorRef, sessionsService, projectService, scriptService, recFilesService, uploader) {
8908
+ super();
8879
8909
  this.route = route;
8880
8910
  this.router = router;
8881
8911
  this.changeDetectorRef = changeDetectorRef;
@@ -8908,6 +8938,8 @@ class SpeechrecorderngComponent {
8908
8938
  }
8909
8939
  }
8910
8940
  ngAfterViewInit() {
8941
+ // let wakeLockSupp=('wakeLock' in navigator);
8942
+ // alert('Wake lock API supported: '+wakeLockSupp);
8911
8943
  if (this.sm.status !== 8 /* ERROR */) {
8912
8944
  let initSuccess = this.init();
8913
8945
  if (initSuccess) {
@@ -9070,6 +9102,7 @@ class SpeechrecorderngComponent {
9070
9102
  this.uploader.listener = (ue) => {
9071
9103
  this.uploadUpdate(ue);
9072
9104
  };
9105
+ //TODO Duplicate code in AudioRecorderComponent
9073
9106
  window.addEventListener('beforeunload', (e) => {
9074
9107
  console.debug("Before page unload event");
9075
9108
  if (this.ready()) {
@@ -9151,6 +9184,9 @@ class SpeechrecorderngComponent {
9151
9184
  let chCnt = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;
9152
9185
  if (project) {
9153
9186
  console.info("Project name: " + project.name);
9187
+ if (project.recordingDeviceWakeLock === true) {
9188
+ this.sm.wakeLock = true;
9189
+ }
9154
9190
  this.sm.audioDevices = project.audioDevices;
9155
9191
  chCnt = ProjectUtil.audioChannelCount(project);
9156
9192
  console.info("Project requested recording channel count: " + chCnt);
@@ -9256,7 +9292,7 @@ class SpeechrecorderngComponent {
9256
9292
  }
9257
9293
  }
9258
9294
  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 });
9259
- 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: `
9295
+ 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: `
9260
9296
  <app-sprrecordingsession [projectName]="project?.name" [dataSaved]="dataSaved"></app-sprrecordingsession>
9261
9297
  `, isInline: true, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0}\n"], components: [{ type: SessionManager, selector: "app-sprrecordingsession", inputs: ["projectName", "dataSaved"] }] });
9262
9298
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SpeechrecorderngComponent, decorators: [{
@@ -10921,11 +10957,11 @@ class Item {
10921
10957
  }
10922
10958
  }
10923
10959
  class AudioRecorder extends BasicRecorder {
10924
- constructor(changeDetectorRef, route, renderer, dialog, projectService, sessionService, recFileService, uploader, config) {
10960
+ constructor(changeDetectorRef, renderer, route, dialog, projectService, sessionService, recFileService, uploader, config) {
10925
10961
  super(dialog, sessionService);
10926
10962
  this.changeDetectorRef = changeDetectorRef;
10927
- this.route = route;
10928
10963
  this.renderer = renderer;
10964
+ this.route = route;
10929
10965
  this.dialog = dialog;
10930
10966
  this.projectService = projectService;
10931
10967
  this.sessionService = sessionService;
@@ -10946,6 +10982,7 @@ class AudioRecorder extends BasicRecorder {
10946
10982
  //selectedItemIdx: number;
10947
10983
  this._displayRecFile = null;
10948
10984
  this.displayRecFileVersion = 0;
10985
+ //super(injector);
10949
10986
  this.status = 1 /* IDLE */;
10950
10987
  this.audio = document.getElementById('audio');
10951
10988
  if (this.config && this.config.enableUploadRecordings != null) {
@@ -10954,25 +10991,26 @@ class AudioRecorder extends BasicRecorder {
10954
10991
  if (this.config && this.config.enableDownloadRecordings != null) {
10955
10992
  this.enableDownloadRecordings = this.config.enableDownloadRecordings;
10956
10993
  }
10957
- this.init();
10994
+ //this.init();
10958
10995
  }
10959
10996
  ngAfterViewInit() {
10960
- this.route.queryParams.subscribe((params) => {
10961
- if (params['sessionId']) {
10962
- this.fetchSession(params['sessionId']);
10963
- }
10964
- });
10965
10997
  this.streamLevelMeasure.levelListener = this.liveLevelDisplay;
10966
10998
  this.streamLevelMeasure.peakLevelListener = (peakLvlInDb) => {
10967
10999
  this.peakLevelInDb = peakLvlInDb;
10968
11000
  this.changeDetectorRef.detectChanges();
10969
11001
  };
11002
+ //let wakeLockSupp=('wakeLock' in navigator);
11003
+ //alert('Wake lock API supported: '+wakeLockSupp);
11004
+ }
11005
+ ready() {
11006
+ return this.dataSaved && !this.isActive();
10970
11007
  }
10971
11008
  ngOnDestroy() {
11009
+ this.disableWakeLockCond();
10972
11010
  this.destroyed = true;
10973
11011
  // TODO stop capture /playback
10974
11012
  }
10975
- init() {
11013
+ ngOnInit() {
10976
11014
  this.transportActions.startAction.disabled = true;
10977
11015
  this.transportActions.stopAction.disabled = true;
10978
11016
  this.transportActions.nextAction.disabled = true;
@@ -11022,7 +11060,7 @@ class AudioRecorder extends BasicRecorder {
11022
11060
  return;
11023
11061
  }
11024
11062
  else {
11025
- this.controlAudioPlayer = new AudioPlayer(context, this);
11063
+ //this.controlAudioPlayer = new AudioPlayer(context, this);
11026
11064
  this.ac = new AudioCapture(context);
11027
11065
  if (this.ac) {
11028
11066
  this.transportActions.startAction.onAction = () => this.startItem();
@@ -11054,6 +11092,23 @@ class AudioRecorder extends BasicRecorder {
11054
11092
  this.uploader.listener = (ue) => {
11055
11093
  this.uploadUpdate(ue);
11056
11094
  };
11095
+ let wakeLockSupp = ('wakeLock' in navigator);
11096
+ // if(wakeLockSupp) {
11097
+ // let wakeLock = null;
11098
+ // try {
11099
+ // //@ts-ignore
11100
+ // wakeLock = navigator.wakeLock.request('screen');
11101
+ //
11102
+ // //statusElem.textContent = 'Wake Lock is active!';
11103
+ // } catch (err) {
11104
+ // // The Wake Lock request has failed - usually system related, such as battery.
11105
+ // console.error('Wakelock failed'+err)
11106
+ // }
11107
+ // }else{
11108
+ // let noSleep=new NoSleep();
11109
+ // noSleep.enable();
11110
+ //
11111
+ // }
11057
11112
  }
11058
11113
  onKeyPress(ke) {
11059
11114
  if (ke.key == ' ') {
@@ -11099,43 +11154,6 @@ class AudioRecorder extends BasicRecorder {
11099
11154
  isDefaultAudioTestSessionOverwriteingProjectRequirements() {
11100
11155
  return ((this._session != null) && (this._session.type === 'TEST_DEF_A') && (this.audioDevices != null) && this.audioDevices.length > 0);
11101
11156
  }
11102
- fetchSession(sessionId) {
11103
- //Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'statusMsg: Player initialized.'. Current value: 'statusMsg: Fetching session info...'.
11104
- // params.subscribe seems not to be asynchronous
11105
- // this.sm.statusAlertType='info';
11106
- // this.sm.statusMsg = 'Fetching session info...';
11107
- // this.sm.statusWaiting=true;
11108
- let sessObs = this.sessionService.sessionObserver(sessionId);
11109
- if (sessObs) {
11110
- sessObs.subscribe(sess => {
11111
- //this.setSession(sess);
11112
- this.statusAlertType = 'info';
11113
- this.statusMsg = 'Received session info.';
11114
- this.statusWaiting = false;
11115
- this.session = sess;
11116
- if (sess.project) {
11117
- //console.debug("Session associated project: "+sess.project)
11118
- this.projectService.projectObservable(sess.project).subscribe(project => {
11119
- this.project = project;
11120
- this.fetchRecordings(sess);
11121
- }, reason => {
11122
- this.statusMsg = reason;
11123
- this.statusAlertType = 'error';
11124
- this.statusWaiting = false;
11125
- console.error("Error fetching project config: " + reason);
11126
- });
11127
- }
11128
- else {
11129
- console.info("Session has no associated project. Using default configuration.");
11130
- }
11131
- }, (reason) => {
11132
- this.statusMsg = reason;
11133
- this.statusAlertType = 'error';
11134
- this.statusWaiting = false;
11135
- console.error("Error fetching session " + reason);
11136
- });
11137
- }
11138
- }
11139
11157
  fetchRecordings(sess) {
11140
11158
  this.statusAlertType = 'info';
11141
11159
  this.statusMsg = 'Fetching infos of recordings...';
@@ -11187,6 +11205,9 @@ class AudioRecorder extends BasicRecorder {
11187
11205
  let chCnt = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;
11188
11206
  if (project) {
11189
11207
  console.info("Project name: " + project.name);
11208
+ if (project.recordingDeviceWakeLock === true) {
11209
+ this.wakeLock = true;
11210
+ }
11190
11211
  this.audioDevices = project.audioDevices;
11191
11212
  chCnt = ProjectUtil.audioChannelCount(project);
11192
11213
  console.info("Project requested recording channel count: " + chCnt);
@@ -11290,6 +11311,7 @@ class AudioRecorder extends BasicRecorder {
11290
11311
  }
11291
11312
  }
11292
11313
  startItem() {
11314
+ this.enableWakeLockCond();
11293
11315
  this.transportActions.startAction.disabled = true;
11294
11316
  this.transportActions.pauseAction.disabled = true;
11295
11317
  if (this.readonly) {
@@ -11605,8 +11627,8 @@ class AudioRecorder extends BasicRecorder {
11605
11627
  }
11606
11628
  }
11607
11629
  }
11608
- 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 });
11609
- 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: `
11630
+ 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 });
11631
+ 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: `
11610
11632
  <app-warningbar [show]="isTestSession()" warningText="Test recording only!"></app-warningbar>
11611
11633
  <app-warningbar [show]="isDefaultAudioTestSession()"
11612
11634
  warningText="This test uses default audio device! Regular sessions may require a particular audio device (microphone)!"></app-warningbar>
@@ -11662,7 +11684,7 @@ AudioRecorder.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
11662
11684
  [ready]="dataSaved && !isActive()"></app-readystateindicator>
11663
11685
  </div>
11664
11686
  </div>
11665
- `, 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"] }] });
11687
+ `, 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"] }] });
11666
11688
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: AudioRecorder, decorators: [{
11667
11689
  type: Component,
11668
11690
  args: [{
@@ -11732,8 +11754,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
11732
11754
  flex-direction: column;
11733
11755
  margin: 0;
11734
11756
  padding: 0;
11757
+ height: 100%;
11735
11758
  min-height: 0px;
11736
-
11737
11759
  /* Prevents horizontal scroll bar on swipe right */
11738
11760
  overflow: hidden;
11739
11761
  }`, `.ricontrols {
@@ -11762,11 +11784,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
11762
11784
  ]
11763
11785
  }]
11764
11786
  }], ctorParameters: function () {
11765
- 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: [{
11787
+ 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: [{
11766
11788
  type: Inject,
11767
11789
  args: [SPEECHRECORDER_CONFIG]
11768
11790
  }] }];
11769
- }, propDecorators: { projectName: [{
11791
+ }, propDecorators: { _project: [{
11792
+ type: Input
11793
+ }], projectName: [{
11770
11794
  type: Input
11771
11795
  }], recorderCombiPane: [{
11772
11796
  type: ViewChild,
@@ -11782,11 +11806,138 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
11782
11806
  }], onKeyDown: [{
11783
11807
  type: HostListener,
11784
11808
  args: ['window:keydown', ['$event']]
11809
+ }] } });
11810
+ class AudioRecorderComponent extends RecorderComponent {
11811
+ constructor(injector, route, router, changeDetectorRef, sessionService, projectService, recFilesService) {
11812
+ super();
11813
+ this.injector = injector;
11814
+ this.route = route;
11815
+ this.router = router;
11816
+ this.changeDetectorRef = changeDetectorRef;
11817
+ this.sessionService = sessionService;
11818
+ this.projectService = projectService;
11819
+ this.recFilesService = recFilesService;
11820
+ this.dataSaved = true;
11821
+ }
11822
+ ngOnInit() {
11823
+ //super.ngOnInit();
11824
+ let audioContext = AudioContextProvider.audioContextInstance();
11825
+ if (audioContext) {
11826
+ this.controlAudioPlayer = new AudioPlayer(audioContext, this.ar);
11827
+ }
11828
+ this.ar.controlAudioPlayer = this.controlAudioPlayer;
11829
+ //TODO Duplicate code in SpeechRecorderComponent
11830
+ window.addEventListener('beforeunload', (e) => {
11831
+ console.debug("Before page unload event");
11832
+ if (this.ready()) {
11833
+ return;
11834
+ }
11835
+ else {
11836
+ // all this attempts to customize the message do not work anymore (for security reasons)!!
11837
+ var message = "Please do not leave the page, until all recordings are uploaded!";
11838
+ alert(message);
11839
+ e = e || window.event;
11840
+ if (e) {
11841
+ e.returnValue = message;
11842
+ e.cancelBubble = true;
11843
+ if (e.stopPropagation) {
11844
+ e.stopPropagation();
11845
+ }
11846
+ if (e.preventDefault) {
11847
+ e.preventDefault();
11848
+ }
11849
+ }
11850
+ return message;
11851
+ }
11852
+ });
11853
+ }
11854
+ ngAfterViewInit() {
11855
+ this.route.queryParams.subscribe((params) => {
11856
+ if (params['sessionId']) {
11857
+ this.fetchSession(params['sessionId']);
11858
+ }
11859
+ });
11860
+ this.route.params.subscribe((params) => {
11861
+ let routeParamsId = params['id'];
11862
+ if (routeParamsId) {
11863
+ this.fetchSession(routeParamsId);
11864
+ }
11865
+ });
11866
+ }
11867
+ ngOnDestroy() {
11868
+ //super.ngOnDestroy();
11869
+ }
11870
+ fetchSession(sessionId) {
11871
+ //Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'statusMsg: Player initialized.'. Current value: 'statusMsg: Fetching session info...'.
11872
+ // params.subscribe seems not to be asynchronous
11873
+ // this.sm.statusAlertType='info';
11874
+ // this.sm.statusMsg = 'Fetching session info...';
11875
+ // this.sm.statusWaiting=true;
11876
+ let sessObs = this.sessionService.sessionObserver(sessionId);
11877
+ if (sessObs) {
11878
+ sessObs.subscribe(sess => {
11879
+ this.ar.statusAlertType = 'info';
11880
+ this.ar.statusMsg = 'Received session info.';
11881
+ this.ar.statusWaiting = false;
11882
+ this.session = sess;
11883
+ this.ar.session = sess;
11884
+ if (sess.project) {
11885
+ //console.debug("Session associated project: "+sess.project)
11886
+ this.projectService.projectObservable(sess.project).subscribe(project => {
11887
+ this.ar.project = project;
11888
+ this.ar.fetchRecordings(sess);
11889
+ }, reason => {
11890
+ this.ar.statusMsg = reason;
11891
+ this.ar.statusAlertType = 'error';
11892
+ this.ar.statusWaiting = false;
11893
+ console.error("Error fetching project config: " + reason);
11894
+ });
11895
+ }
11896
+ else {
11897
+ console.info("Session has no associated project. Using default configuration.");
11898
+ }
11899
+ }, (reason) => {
11900
+ this.ar.statusMsg = reason;
11901
+ this.ar.statusAlertType = 'error';
11902
+ this.ar.statusWaiting = false;
11903
+ console.error("Error fetching session " + reason);
11904
+ });
11905
+ }
11906
+ }
11907
+ ready() {
11908
+ return this.dataSaved && !this.ar.isActive();
11909
+ }
11910
+ }
11911
+ 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 });
11912
+ 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: `
11913
+ <app-audiorecorder [projectName]="_project?.name" [dataSaved]="dataSaved"></app-audiorecorder>
11914
+ `, 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"] }] });
11915
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: AudioRecorderComponent, decorators: [{
11916
+ type: Component,
11917
+ args: [{
11918
+ selector: 'app-audiorecorder-comp',
11919
+ providers: [SessionService],
11920
+ template: `
11921
+ <app-audiorecorder [projectName]="_project?.name" [dataSaved]="dataSaved"></app-audiorecorder>
11922
+ `,
11923
+ styles: [`:host{
11924
+ flex: 2;
11925
+ display: flex;
11926
+ height: 100%;
11927
+ flex-direction: column;
11928
+ min-height:0;
11929
+
11930
+ }`]
11931
+ }]
11932
+ }], 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: [{
11933
+ type: ViewChild,
11934
+ args: [AudioRecorder, { static: true }]
11785
11935
  }] } });
11786
11936
 
11787
11937
  const SPR_ROUTES = [
11788
11938
  { path: 'spr/session/:id', component: SpeechrecorderngComponent },
11789
- { path: 'recorder', component: AudioRecorder },
11939
+ { path: 'recorder/session/:id', component: AudioRecorderComponent },
11940
+ { path: 'recorder', component: AudioRecorderComponent },
11790
11941
  { path: 'spr/db/project/:project/session/:sessionId/recordingfile/_view/:recordingFileId', component: RecordingFileViewComponent },
11791
11942
  { path: 'spr/db/project/:project/session/:sessionId/recordingfile/_edit/:recordingFileId', component: RecordingFileUI },
11792
11943
  { path: 'spr/db/project/:project/session/:sessionId/recordingfile/_view', component: RecordingFileViewComponent },
@@ -11814,20 +11965,20 @@ class SpeechrecorderngModule {
11814
11965
  }
11815
11966
  SpeechrecorderngModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SpeechrecorderngModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
11816
11967
  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,
11817
- 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] });
11968
+ 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] });
11818
11969
  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]] });
11819
11970
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: SpeechrecorderngModule, decorators: [{
11820
11971
  type: NgModule,
11821
11972
  args: [{
11822
11973
  declarations: [AudioSignal, Sonagram, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar, Progress, SimpleTrafficLight, Recinstructions, Prompter, PromptContainer, PromptingContainer, Prompting, StatusDisplay,
11823
- ProgressDisplay, RecordingItemDisplay, RecordingItemControls, UploadStatus, TransportPanel, ReadyStateIndicator, ControlPanel, WarningBar, AudioRecorder, SessionManager, MessageDialog, SessionFinishedDialog, SpeechrecorderngComponent, RecordingFileViewComponent, RecordingFileUI, ScrollIntoViewDirective, RecordingFileNaviComponent, RecordingFileMetaComponent, RecordingList, RecorderCombiPane, AudioRecorder],
11974
+ ProgressDisplay, RecordingItemDisplay, RecordingItemControls, UploadStatus, TransportPanel, ReadyStateIndicator, ControlPanel, WarningBar, AudioRecorder, SessionManager, MessageDialog, SessionFinishedDialog, SpeechrecorderngComponent, AudioRecorderComponent, RecordingFileViewComponent, RecordingFileUI, ScrollIntoViewDirective, RecordingFileNaviComponent, RecordingFileMetaComponent, RecordingList, RecorderCombiPane, AudioRecorder],
11824
11975
  exports: [MessageDialog, SpeechrecorderngComponent, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar, AudioRecorder],
11825
11976
  imports: [RouterModule.forChild(SPR_ROUTES), FlexLayoutModule, CommonModule, MatIconModule, MatButtonModule, MatDialogModule, MatProgressBarModule, MatProgressSpinnerModule, MatTooltipModule, HttpClientModule, MatCheckboxModule, MatCardModule, MatDividerModule, MatGridListModule, MatTableModule, MatInputModule, MatSelectModule, MatSnackBarModule],
11826
11977
  providers: [SessionService, ProjectService, ScriptService, RecordingService, RecordingFileService, SpeechRecorderUploader]
11827
11978
  }]
11828
11979
  }] });
11829
11980
 
11830
- const VERSION = '2.23.7';
11981
+ const VERSION = '2.24.0';
11831
11982
 
11832
11983
  /*
11833
11984
  * Public API Surface of speechrecorderng
@@ -11837,5 +11988,5 @@ const VERSION = '2.23.7';
11837
11988
  * Generated bundle index. Do not edit.
11838
11989
  */
11839
11990
 
11840
- 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 };
11991
+ 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 };
11841
11992
  //# sourceMappingURL=speechrecorderng.mjs.map