speechrecorderng 2.18.10 → 2.19.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.
Files changed (59) hide show
  1. package/bundles/speechrecorderng.umd.js +687 -247
  2. package/bundles/speechrecorderng.umd.js.map +1 -1
  3. package/esm2015/lib/audio/audio_display.js +4 -4
  4. package/esm2015/lib/audio/audio_player.js +4 -4
  5. package/esm2015/lib/audio/capture/capture.js +262 -83
  6. package/esm2015/lib/audio/format.js +1 -1
  7. package/esm2015/lib/audio/impl/wavformat.js +1 -1
  8. package/esm2015/lib/audio/ui/audio_canvas_layer_comp.js +7 -7
  9. package/esm2015/lib/audio/ui/audio_display_control.js +4 -4
  10. package/esm2015/lib/audio/ui/audio_display_scroll_pane.js +4 -4
  11. package/esm2015/lib/audio/ui/audiosignal.js +4 -4
  12. package/esm2015/lib/audio/ui/container.js +4 -4
  13. package/esm2015/lib/audio/ui/livelevel.js +4 -4
  14. package/esm2015/lib/audio/ui/scroll_pane_horizontal.js +12 -12
  15. package/esm2015/lib/audio/ui/sonagram.js +4 -4
  16. package/esm2015/lib/dsp/utils.js +1 -1
  17. package/esm2015/lib/io/BinaryWriter.js +1 -1
  18. package/esm2015/lib/io/stream.js +8 -7
  19. package/esm2015/lib/math/complex.js +1 -1
  20. package/esm2015/lib/math/dft.js +1 -1
  21. package/esm2015/lib/math/utils.js +1 -1
  22. package/esm2015/lib/speechrecorder/project/project.js +27 -1
  23. package/esm2015/lib/speechrecorder/project/project.service.js +4 -4
  24. package/esm2015/lib/speechrecorder/recordings/recordings.service.js +4 -4
  25. package/esm2015/lib/speechrecorder/script/script.service.js +4 -4
  26. package/esm2015/lib/speechrecorder/session/controlpanel.js +16 -16
  27. package/esm2015/lib/speechrecorder/session/progress.js +4 -4
  28. package/esm2015/lib/speechrecorder/session/prompting.js +16 -16
  29. package/esm2015/lib/speechrecorder/session/recordingfile/recording-file-meta.component.js +4 -4
  30. package/esm2015/lib/speechrecorder/session/recordingfile/recording-file-navi.component.js +4 -4
  31. package/esm2015/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.js +4 -4
  32. package/esm2015/lib/speechrecorder/session/recordingfile/recording-file-view.component.js +4 -4
  33. package/esm2015/lib/speechrecorder/session/recordingfile/recordingfile-service.js +4 -4
  34. package/esm2015/lib/speechrecorder/session/session.service.js +4 -4
  35. package/esm2015/lib/speechrecorder/session/session_finished_dialog.js +4 -4
  36. package/esm2015/lib/speechrecorder/session/sessionmanager.js +39 -12
  37. package/esm2015/lib/speechrecorder/session/warning_bar.js +4 -4
  38. package/esm2015/lib/speechrecorder/spruploader.js +4 -4
  39. package/esm2015/lib/speechrecorder/startstopsignal/startstopsignal.js +1 -1
  40. package/esm2015/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.js +4 -4
  41. package/esm2015/lib/speechrecorderng.component.js +5 -4
  42. package/esm2015/lib/speechrecorderng.module.js +5 -5
  43. package/esm2015/lib/spr.config.js +4 -4
  44. package/esm2015/lib/spr.module.version.js +2 -2
  45. package/esm2015/lib/ui/canvas_layer_comp.js +4 -4
  46. package/esm2015/lib/ui/livelevel_display.js +26 -6
  47. package/esm2015/lib/ui/message_dialog.js +4 -4
  48. package/esm2015/lib/utils/css_utils.js +1 -1
  49. package/esm2015/lib/utils/scrollIntoViewToBottom.js +4 -4
  50. package/esm2015/lib/utils/ua-parser.js +166 -0
  51. package/fesm2015/speechrecorderng.js +664 -247
  52. package/fesm2015/speechrecorderng.js.map +1 -1
  53. package/lib/audio/capture/capture.d.ts +8 -5
  54. package/lib/speechrecorder/project/project.d.ts +25 -0
  55. package/lib/speechrecorder/session/sessionmanager.d.ts +7 -3
  56. package/lib/spr.module.version.d.ts +1 -1
  57. package/lib/ui/livelevel_display.d.ts +4 -1
  58. package/lib/utils/ua-parser.d.ts +40 -0
  59. package/package.json +13 -13
@@ -720,15 +720,309 @@
720
720
  }());
721
721
  AudioPlayer.DEFAULT_BUFSIZE = 8192;
722
722
 
723
- var AudioStreamConstr = /** @class */ (function () {
724
- function AudioStreamConstr() {
725
- this.audio = true;
726
- this.video = false;
723
+ var UserAgentComponent = /** @class */ (function () {
724
+ function UserAgentComponent(name, version, comment) {
725
+ this.name = name;
726
+ this.version = version;
727
+ this.comment = comment;
727
728
  }
728
- return AudioStreamConstr;
729
+ UserAgentComponent.prototype.toString = function () {
730
+ var s = '[' + this.name + ']';
731
+ if (this.version) {
732
+ s = s + ' [' + this.version + ']';
733
+ }
734
+ if (this.comment) {
735
+ s = s + ' [' + this.comment + ']';
736
+ }
737
+ return s;
738
+ };
739
+ return UserAgentComponent;
729
740
  }());
741
+ var NAME_FIREFOX = 'Firefox';
742
+ var NAME_CHROME = 'Chrome';
743
+ var NAME_SAFARI = 'Safari';
744
+ var NAME_EDGE = 'Edge';
745
+ var Browser$1;
746
+ (function (Browser) {
747
+ Browser["Firefox"] = "Firefox";
748
+ Browser["Chrome"] = "Chrome";
749
+ Browser["Safari"] = "Safari";
750
+ Browser["Edge"] = "Edge";
751
+ })(Browser$1 || (Browser$1 = {}));
752
+ var OS_WINDOWS = 'Windows';
753
+ var OS_ANDROID = 'Android';
754
+ var Platform$1;
755
+ (function (Platform) {
756
+ Platform["Windows"] = "Windows";
757
+ Platform["Android"] = "Android";
758
+ Platform["macOS"] = "MAC OS X";
759
+ })(Platform$1 || (Platform$1 = {}));
760
+ var UserAgent = /** @class */ (function () {
761
+ function UserAgent(_detectedPlatform, _detectedBrowser) {
762
+ this._detectedPlatform = _detectedPlatform;
763
+ this._detectedBrowser = _detectedBrowser;
764
+ }
765
+ Object.defineProperty(UserAgent.prototype, "detectedBrowser", {
766
+ get: function () {
767
+ return this._detectedBrowser;
768
+ },
769
+ enumerable: false,
770
+ configurable: true
771
+ });
772
+ Object.defineProperty(UserAgent.prototype, "detectedPlatform", {
773
+ get: function () {
774
+ return this._detectedPlatform;
775
+ },
776
+ enumerable: false,
777
+ configurable: true
778
+ });
779
+ return UserAgent;
780
+ }());
781
+ var UserAgentBuilder = /** @class */ (function () {
782
+ function UserAgentBuilder() {
783
+ this.comps = new Array();
784
+ }
785
+ UserAgentBuilder.prototype.build = function () {
786
+ // // @ts-ignore
787
+ // if(navigator.userAgentData){
788
+ // // maybe we can use this in the future
789
+ // console.info("Browser provides userAgentData:");
790
+ //
791
+ // console.info("Brands:");
792
+ // // @ts-ignore
793
+ // navigator.userAgentData.brands.forEach((br=>{
794
+ // console.info(br.brand +" "+br.version);
795
+ // }))
796
+ // // @ts-ignore
797
+ // console.info("Platform: "+navigator.userAgentData.platform);
798
+ // // @ts-ignore
799
+ // console.info("Mobile:"+navigator.userAgentData.mobile);
800
+ // // @ts-ignore
801
+ // //console.info(navigator.userAgentData.toJSON());
802
+ // }else {
803
+ // console.info("Browser does not provide userAgentData.");
804
+ // }
805
+ var ua = navigator.userAgent;
806
+ this.comps = new Array();
807
+ var pp = 0;
808
+ while (pp < ua.length) {
809
+ //parse name/version
810
+ var name = null;
811
+ var version = null;
812
+ var comment = void 0;
813
+ var blPos = ua.indexOf(' ', pp);
814
+ var prt = void 0;
815
+ if (blPos == -1) {
816
+ prt = ua.substr(pp);
817
+ pp += prt.length;
818
+ }
819
+ else {
820
+ prt = ua.substr(pp, blPos - pp);
821
+ pp = blPos + 1;
822
+ }
823
+ var sepPos = prt.indexOf('/');
824
+ if (sepPos > 0) {
825
+ name = prt.substr(0, sepPos);
826
+ version = prt.substr(sepPos + 1);
827
+ }
828
+ else {
829
+ name = prt;
830
+ }
831
+ while (ua[pp] === ' ' && pp < ua.length) {
832
+ pp++;
833
+ }
834
+ if (ua[pp] === '(') {
835
+ pp++;
836
+ var commEnd = ua.indexOf(')', pp);
837
+ comment = ua.substr(pp, commEnd - pp);
838
+ pp = commEnd + 1;
839
+ }
840
+ while (ua[pp] === ' ' && pp < ua.length) {
841
+ pp++;
842
+ }
843
+ this.comps.push(new UserAgentComponent(name, version, comment));
844
+ }
845
+ var detPlatf = null;
846
+ if (this.runsOnOS(Platform$1.Android)) {
847
+ detPlatf = Platform$1.Android;
848
+ }
849
+ else if (this.runsOnOS(Platform$1.Windows)) {
850
+ detPlatf = Platform$1.Windows;
851
+ }
852
+ else if (this.runsOnOS(Platform$1.macOS)) {
853
+ detPlatf = Platform$1.macOS;
854
+ }
855
+ var detBr = null;
856
+ if (this.matchesBrowser(Browser$1.Firefox)) {
857
+ detBr = Browser$1.Firefox;
858
+ }
859
+ else if (this.matchesBrowser(Browser$1.Chrome)) {
860
+ detBr = Browser$1.Chrome;
861
+ }
862
+ else if (this.matchesBrowser(Browser$1.Safari)) {
863
+ detBr = Browser$1.Safari;
864
+ }
865
+ this.userAgent = new UserAgent(detPlatf, detBr);
866
+ };
867
+ UserAgentBuilder.prototype.matchesBrowser = function (browserName) {
868
+ for (var ci = 0; ci < this.comps.length; ci++) {
869
+ var bn = this.comps[ci].name;
870
+ var bnRe = new RegExp(browserName, 'i');
871
+ if (bn.match(bnRe)) {
872
+ return true;
873
+ }
874
+ }
875
+ return false;
876
+ };
877
+ UserAgentBuilder.prototype.runsOnOS = function (os) {
878
+ for (var ci = 0; ci < this.comps.length; ci++) {
879
+ var cc = this.comps[ci].comment;
880
+ if (cc) {
881
+ var osRe = new RegExp(os, 'i');
882
+ if (cc.match(osRe)) {
883
+ return true;
884
+ }
885
+ }
886
+ }
887
+ return false;
888
+ };
889
+ UserAgentBuilder.userAgent = function () {
890
+ if (!this.instance) {
891
+ this.instance = new UserAgentBuilder();
892
+ }
893
+ this.instance.build();
894
+ return this.instance.userAgent;
895
+ };
896
+ return UserAgentBuilder;
897
+ }());
898
+ UserAgentBuilder.instance = undefined;
899
+
900
+ var ConstraintType;
901
+ (function (ConstraintType) {
902
+ ConstraintType["Exact"] = "EXACT";
903
+ ConstraintType["Ideal"] = "IDEAL";
904
+ })(ConstraintType || (ConstraintType = {}));
905
+ ;
906
+ var Platform;
907
+ (function (Platform) {
908
+ Platform["Linux"] = "LINUX";
909
+ Platform["macOS"] = "MACOS";
910
+ Platform["Windows"] = "WINDOWS";
911
+ Platform["Android"] = "ANDROID";
912
+ })(Platform || (Platform = {}));
913
+ var BrowserBase;
914
+ (function (BrowserBase) {
915
+ BrowserBase["Chromium"] = "CHROMIUM";
916
+ })(BrowserBase || (BrowserBase = {}));
917
+ ;
918
+ var Browser;
919
+ (function (Browser) {
920
+ Browser["Firefox"] = "FIREFOX";
921
+ Browser["Chromium"] = "CHROMIUM";
922
+ Browser["Chrome"] = "CHROME";
923
+ Browser["Edge"] = "EDGE";
924
+ Browser["Opera"] = "OPERA";
925
+ })(Browser || (Browser = {}));
926
+ var ProjectUtil = /** @class */ (function () {
927
+ function ProjectUtil() {
928
+ }
929
+ ProjectUtil.audioChannelCount = function (project) {
930
+ var chs = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;
931
+ if (project.mediaCaptureFormat) {
932
+ chs = project.mediaCaptureFormat.audioChannelCount;
933
+ }
934
+ else if (project.audioFormat) {
935
+ chs = project.audioFormat.channels;
936
+ }
937
+ return chs;
938
+ };
939
+ return ProjectUtil;
940
+ }());
941
+ ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT = 2;
942
+
943
+ var CHROME_ACTIVATE_ECHO_CANCELLATION_WITH_AGC = false;
944
+ var DEBUG_TRACE_LEVEL = 0;
945
+ var ENABLE_AUDIO_WORKLET = true;
946
+ // Super dirty way to load this module
947
+ // Copy content of interceptor_worklet.js to this string
948
+ var awpStr = "class AudioCaptureInterceptorProcessor extends AudioWorkletProcessor{\n" +
949
+ "\n" +
950
+ " BUFFER_QUANTUMS=64;\n" +
951
+ " QUANTUM_FRAME_LEN=128;\n" +
952
+ " BUFFER_FRAME_LEN=this.QUANTUM_FRAME_LEN*this.BUFFER_QUANTUMS;\n" +
953
+ " buffer=null;\n" +
954
+ " bufferPos=0;\n" +
955
+ " bufferPosBytes=0;\n" +
956
+ " constructor() {\n" +
957
+ " super();\n" +
958
+ "\n" +
959
+ " }\n" +
960
+ "\n" +
961
+ " process(\n" +
962
+ " inputs,\n" +
963
+ " outputs,\n" +
964
+ " parameters\n" +
965
+ " ){\n" +
966
+ "\n" +
967
+ " let inputsCnt=inputs.length;\n" +
968
+ " let channelCount=0;\n" +
969
+ " let inputLen=0;\n" +
970
+ " let inputLenBytes=0;\n" +
971
+ " if(inputsCnt>0) {\n" +
972
+ " let input0 = inputs[0];\n" +
973
+ " channelCount = input0.length;\n" +
974
+ " if (channelCount > 0) {\n" +
975
+ " let input0ch0=input0[0];\n" +
976
+ " inputLen=input0ch0.length;\n" +
977
+ " inputLenBytes=input0ch0.buffer.length;\n" +
978
+ " }\n" +
979
+ " }\n" +
980
+ " if (!this.buffer || this.buffer.length < channelCount) {\n" +
981
+ " this.buffer = new Array(channelCount);\n" +
982
+ " this.bufferPos = 0\n" +
983
+ " for (let bch = 0; bch < channelCount; bch++) {\n" +
984
+ " this.buffer[bch] = new Float32Array(this.BUFFER_FRAME_LEN);\n" +
985
+ " this.bufferPos = 0;\n" +
986
+ " this.bufferPosBytes=0;\n" +
987
+ " }\n" +
988
+ " }\n" +
989
+ " let bufAvail = this.BUFFER_FRAME_LEN - this.bufferPos;\n" +
990
+ " // check if buffer has to be transferred\n" +
991
+ " if (inputLen > bufAvail) {\n" +
992
+ " let ada=new Array(channelCount);\n" +
993
+ " for (let ch = 0; ch < channelCount; ch++) {\n" +
994
+ " ada[ch]=this.buffer[ch].buffer.slice(0);\n" +
995
+ " }\n" +
996
+ " this.port.postMessage({\n" +
997
+ " data: ada,\n" +
998
+ " chs: channelCount,\n" +
999
+ " len: this.bufferPos\n" +
1000
+ " }, ada);\n" +
1001
+ " // buffer transferred, reset\n" +
1002
+ " this.bufferPos = 0;\n" +
1003
+ " this.bufferPosBytes=0;\n" +
1004
+ " }\n" +
1005
+ "\n" +
1006
+ " for(let ii=0;ii<inputsCnt;ii++) {\n" +
1007
+ " for (let ch = 0; ch < channelCount; ch++) {\n" +
1008
+ " // Mute outputs\n" +
1009
+ " //outputs[ii][ch].fill(0);\n" +
1010
+ " let chSamples = inputs[ii][ch];\n" +
1011
+ " this.buffer[ch].set(chSamples,this.bufferPos);\n" +
1012
+ " }\n" +
1013
+ " this.bufferPos+=inputLen;\n" +
1014
+ " this.bufferPosBytes+=inputLenBytes;\n" +
1015
+ " }\n" +
1016
+ " \n" +
1017
+ " return true;\n" +
1018
+ " }\n" +
1019
+ "}\n" +
1020
+ "\n" +
1021
+ "registerProcessor('capture-interceptor',AudioCaptureInterceptorProcessor);\n";
730
1022
  var AudioCapture = /** @class */ (function () {
731
1023
  function AudioCapture(context) {
1024
+ this.agcStatus = null;
1025
+ this.bufferingNode = null;
732
1026
  this.audioOutStream = null;
733
1027
  this.disconnectStreams = true;
734
1028
  this._opened = false;
@@ -783,7 +1077,7 @@
783
1077
  if (!labelsAvailable) {
784
1078
  //console.debug("Media device enumeration: No labels.")
785
1079
  if (retry) {
786
- //console.debug("Starting dummy session to request audio permissions...")
1080
+ console.info("Starting dummy session to request audio permissions...");
787
1081
  _this.dummySession().then(function (s) {
788
1082
  // and stop it immediately
789
1083
  if (s) {
@@ -848,13 +1142,14 @@
848
1142
  console.log("Audio device: Id: " + di.deviceId + " groupId: " + di.groupId + " label: " + di.label + " kind: " + di.kind);
849
1143
  }
850
1144
  };
851
- AudioCapture.prototype.open = function (channelCount, selDeviceId) {
1145
+ AudioCapture.prototype.open = function (channelCount, selDeviceId, autoGainControlConfigs) {
852
1146
  var _this = this;
853
1147
  this.context.resume().then(function () {
854
- _this._open(channelCount, selDeviceId);
1148
+ _this._open(channelCount, selDeviceId, autoGainControlConfigs);
855
1149
  });
856
1150
  };
857
- AudioCapture.prototype._open = function (channelCount, selDeviceId) {
1151
+ AudioCapture.prototype._open = function (channelCount, selDeviceId, autoGainControlConfigs) {
1152
+ var e_1, _a;
858
1153
  var _this = this;
859
1154
  this.channelCount = channelCount;
860
1155
  this.framesRecorded = 0;
@@ -871,7 +1166,58 @@
871
1166
  // TODO test if input is unprocessed
872
1167
  var msc;
873
1168
  console.info('User agent: ' + navigator.userAgent);
874
- if (navigator.userAgent.match(".*Edge.*")) {
1169
+ var ua = UserAgentBuilder.userAgent();
1170
+ // ua.components.forEach((c)=>{
1171
+ // console.info("UA_Comp: "+c.toString());
1172
+ // })
1173
+ var agcCfg = null;
1174
+ var autoGainControl = false;
1175
+ var chromeEchoCancellation = false;
1176
+ if (autoGainControlConfigs) {
1177
+ try {
1178
+ for (var autoGainControlConfigs_1 = __values(autoGainControlConfigs), autoGainControlConfigs_1_1 = autoGainControlConfigs_1.next(); !autoGainControlConfigs_1_1.done; autoGainControlConfigs_1_1 = autoGainControlConfigs_1.next()) {
1179
+ var agcc = autoGainControlConfigs_1_1.value;
1180
+ if (agcc.platform === Platform.Android && ua.detectedPlatform === Platform$1.Android) {
1181
+ agcCfg = agcc;
1182
+ break;
1183
+ }
1184
+ if (agcc.platform === Platform.Windows && ua.detectedPlatform === Platform$1.Windows) {
1185
+ agcCfg = agcc;
1186
+ break;
1187
+ }
1188
+ }
1189
+ }
1190
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
1191
+ finally {
1192
+ try {
1193
+ if (autoGainControlConfigs_1_1 && !autoGainControlConfigs_1_1.done && (_a = autoGainControlConfigs_1.return)) _a.call(autoGainControlConfigs_1);
1194
+ }
1195
+ finally { if (e_1) throw e_1.error; }
1196
+ }
1197
+ if (agcCfg) {
1198
+ // TODO use EXACT/IDEAL constraint
1199
+ autoGainControl = agcCfg.value;
1200
+ if (CHROME_ACTIVATE_ECHO_CANCELLATION_WITH_AGC) {
1201
+ chromeEchoCancellation = agcCfg.value;
1202
+ }
1203
+ // TODO query real AGC status
1204
+ this.agcStatus = agcCfg.value;
1205
+ }
1206
+ else {
1207
+ this.agcStatus = false;
1208
+ }
1209
+ }
1210
+ // default
1211
+ msc = {
1212
+ audio: {
1213
+ deviceId: selDeviceId,
1214
+ echoCancellation: false,
1215
+ channelCount: channelCount,
1216
+ autoGainControl: autoGainControl
1217
+ },
1218
+ video: false
1219
+ };
1220
+ if (ua.detectedBrowser === Browser$1.Edge) {
875
1221
  // Microsoft Edge sends unmodified audio
876
1222
  // The constraint can follow the specification
877
1223
  console.info("Setting media track constraints for Microsoft Edge.");
@@ -879,12 +1225,13 @@
879
1225
  audio: {
880
1226
  deviceId: selDeviceId,
881
1227
  echoCancellation: false,
882
- channelCount: channelCount
1228
+ channelCount: channelCount,
1229
+ autoGainControl: autoGainControl
883
1230
  },
884
1231
  video: false
885
1232
  };
886
1233
  }
887
- else if (navigator.userAgent.match(".*Chrome.*")) {
1234
+ else if (ua.detectedBrowser === Browser$1.Chrome) {
888
1235
  // Google Chrome: we need to switch of each of the preprocessing units including the
889
1236
  console.info("Setting media track constraints for Google Chrome.");
890
1237
  // Chrome 60 -> 61 changed
@@ -892,47 +1239,38 @@
892
1239
  // Requires at least Chrome 61
893
1240
  msc = {
894
1241
  audio: {
895
- "deviceId": selDeviceId,
896
- "channelCount": channelCount,
897
- "echoCancellation": false,
898
- "autoGainControl": false,
899
- "googEchoCancellation": false,
900
- "googExperimentalEchoCancellation": false,
901
- "googAutoGainControl": false,
902
- "googTypingNoiseDetection": false,
903
- "googNoiseSuppression": false,
904
- "googHighpassFilter": false,
905
- "googBeamforming": false
1242
+ deviceId: selDeviceId,
1243
+ channelCount: channelCount,
1244
+ echoCancellation: { exact: chromeEchoCancellation },
1245
+ autoGainControl: { exact: autoGainControl },
1246
+ sampleSize: { min: 16 },
906
1247
  },
907
1248
  video: false,
908
1249
  };
909
1250
  }
910
- else if (navigator.userAgent.match(".*Firefox.*")) {
1251
+ else if (ua.detectedBrowser === Browser$1.Firefox) {
911
1252
  console.info("Setting media track constraints for Mozilla Firefox.");
912
1253
  // Firefox
913
1254
  msc = {
914
1255
  audio: {
915
- "deviceId": selDeviceId,
916
- "channelCount": channelCount,
917
- "echoCancellation": false,
918
- "mozEchoCancellation": false,
919
- "autoGainControl": false,
920
- "mozAutoGainControl": false,
921
- "noiseSuppression": false,
922
- "mozNoiseSuppression": false
1256
+ deviceId: selDeviceId,
1257
+ channelCount: channelCount,
1258
+ echoCancellation: false,
1259
+ autoGainControl: autoGainControl,
1260
+ noiseSuppression: false
923
1261
  },
924
1262
  video: false,
925
1263
  };
926
1264
  }
927
- else if (navigator.userAgent.match(".*Safari.*")) {
1265
+ else if (ua.detectedBrowser === Browser$1.Safari) {
928
1266
  console.info("Setting media track constraints for Safari browser.");
929
1267
  console.info("Apply workaround for Safari: Avoid disconnect of streams.");
930
1268
  this.disconnectStreams = false;
931
1269
  msc = {
932
1270
  audio: {
933
- "deviceId": selDeviceId,
934
- "channelCount": channelCount,
935
- "echoCancellation": false
1271
+ deviceId: selDeviceId,
1272
+ channelCount: channelCount,
1273
+ echoCancellation: false
936
1274
  },
937
1275
  video: false,
938
1276
  };
@@ -940,6 +1278,7 @@
940
1278
  else {
941
1279
  // TODO default constraints or error Browser not supported
942
1280
  }
1281
+ console.debug("Audio capture, AGC: " + this.agcStatus);
943
1282
  var ump = navigator.mediaDevices.getUserMedia(msc);
944
1283
  ump.then(function (s) {
945
1284
  _this.stream = s;
@@ -947,6 +1286,11 @@
947
1286
  for (var i = 0; i < aTracks.length; i++) {
948
1287
  var aTrack = aTracks[i];
949
1288
  console.info("Track audio info: id: " + aTrack.id + " kind: " + aTrack.kind + " label: \"" + aTrack.label + "\"");
1289
+ var mtrSts = aTrack.getSettings();
1290
+ console.info("Track audio settings: Ch cnt: " + mtrSts.channelCount + ", AGC: " + mtrSts.autoGainControl + ", Echo cancell.: " + mtrSts.echoCancellation);
1291
+ if (mtrSts.autoGainControl) {
1292
+ _this.agcStatus = mtrSts.autoGainControl;
1293
+ }
950
1294
  }
951
1295
  var vTracks = s.getVideoTracks();
952
1296
  for (var i = 0; i < vTracks.length; i++) {
@@ -956,6 +1300,7 @@
956
1300
  _this.mediaStream = _this.context.createMediaStreamSource(s);
957
1301
  // stream channel count ( is always 2 !)
958
1302
  var streamChannelCount = _this.mediaStream.channelCount;
1303
+ console.info("Stream channel count: " + streamChannelCount);
959
1304
  // is not set!!
960
1305
  //this.currentSampleRate = this.mediaStream.sampleRate;
961
1306
  _this.currentSampleRate = _this.context.sampleRate;
@@ -965,57 +1310,117 @@
965
1310
  }
966
1311
  // W3C -> new name is createScriptProcessor
967
1312
  //
968
- // TODO Again deprecated, but AudioWorker not yet implemented in stable releases (June 2016)
1313
+ // Again deprecated, but AudioWorker not yet implemented in stable releases (June 2016)
969
1314
  // AudioWorker is now AudioWorkletProcessor ... (May 2017)
970
1315
  // Update 12-2020:
971
1316
  // The ScriptProcessorNode Interface - DEPRECATED
972
- // TODO
973
- if (_this.context.createAudioWorker) {
974
- //console.debug("Audio worker implemented!!")
975
- }
976
- else {
977
- //console.debug("Audio worker NOT implemented.")
978
- }
979
- if (_this.context.registerProcessor) {
980
- //console.debug("Audio worklet processor implemented!!");
981
- }
982
- else {
983
- //console.debug("Audio worklet processor NOT implemented.")
984
- }
985
- if (!_this.context.createScriptProcessor) {
986
- //console.debug("Audio script processor NOT implemented.")
1317
+ // Update 06-2021
1318
+ // AudioWorkletProcessor is here to stay. Web Audio API has now Recommendation status !
1319
+ if (ENABLE_AUDIO_WORKLET && _this.context.audioWorklet) {
1320
+ //const workletFileName = ('file-loader!./interceptor_worklet.js');
1321
+ //const workletFileName = 'http://localhost:4200/assets/interceptor_worklet.js';
1322
+ //console.log(awpStr);
1323
+ var audioWorkletModuleBlob = new Blob([awpStr], { type: 'text/javascript' });
1324
+ var audioWorkletModuleBlobUrl = window.URL.createObjectURL(audioWorkletModuleBlob);
1325
+ _this.context.audioWorklet.addModule(audioWorkletModuleBlobUrl).then(function () {
1326
+ var awn = new AudioWorkletNode(_this.context, 'capture-interceptor');
1327
+ awn.onprocessorerror = function (ev) {
1328
+ var msg = 'Unknwon error';
1329
+ if (ev instanceof ErrorEvent) {
1330
+ msg = ev.message;
1331
+ }
1332
+ console.error("Capture audio worklet error: " + msg);
1333
+ if (_this.listener) {
1334
+ _this.listener.error(msg);
1335
+ }
1336
+ };
1337
+ var awnPt = awn.port;
1338
+ if (awnPt) {
1339
+ awnPt.onmessage = function (ev) {
1340
+ if (_this.capturing) {
1341
+ var dt = ev.data;
1342
+ var chs = dt.chs;
1343
+ var adaLen = dt.data.length;
1344
+ if (DEBUG_TRACE_LEVEL > 8) {
1345
+ console.debug('Received data from worklet: ' + chs + ' ' + dt.len + ' Data chs: ' + adaLen);
1346
+ }
1347
+ //let chunkLen = adaLen / chs;
1348
+ var chunkLen = adaLen;
1349
+ var chunk = new Array(chs);
1350
+ for (var ch = 0; ch < chs; ch++) {
1351
+ if (_this.data && _this.data[ch]) {
1352
+ var adaPos = ch * chunkLen;
1353
+ if (dt.data[ch]) {
1354
+ var fa = new Float32Array(dt.data[ch]);
1355
+ _this.data[ch].push(fa);
1356
+ chunk[ch] = fa;
1357
+ // Use samples of channel 0 to count frames (samples)
1358
+ if (ch == 0) {
1359
+ _this.framesRecorded += fa.length;
1360
+ }
1361
+ }
1362
+ else {
1363
+ if (DEBUG_TRACE_LEVEL > 8) {
1364
+ console.debug('Channel ' + ch + ' data not set!!');
1365
+ }
1366
+ }
1367
+ }
1368
+ }
1369
+ if (_this.audioOutStream) {
1370
+ _this.audioOutStream.write(chunk);
1371
+ }
1372
+ }
1373
+ };
1374
+ }
1375
+ _this.bufferingNode = awn;
1376
+ _this._opened = true;
1377
+ if (_this.listener) {
1378
+ _this.listener.opened();
1379
+ }
1380
+ }).catch(function (error) {
1381
+ console.log('Could not add module ' + error);
1382
+ });
987
1383
  }
988
- else {
989
- //TODO
990
- // The ScriptProcessorNode Interface - DEPRECATED
991
- //console.debug("Audio script processor implemented!!");
1384
+ else if (_this.context.createScriptProcessor) {
1385
+ // The ScriptProcessorNode Interface - DEPRECATED Only as fallback
992
1386
  // TODO should we use streamChannelCount or channelCount here ?
993
- _this.bufferingNode = _this.context.createScriptProcessor(AudioCapture.BUFFER_SIZE, streamChannelCount, streamChannelCount);
1387
+ var scriptProcessorNode = _this.context.createScriptProcessor(AudioCapture.BUFFER_SIZE, streamChannelCount, streamChannelCount);
1388
+ _this.bufferingNode = scriptProcessorNode;
994
1389
  var c_1 = 0;
995
- _this.bufferingNode.onaudioprocess = function (e) {
996
- if (_this.capturing) {
997
- // TODO use chCnt
998
- var inBuffer = e.inputBuffer;
999
- var duration = inBuffer.duration;
1000
- // only process requested count of channels
1001
- var currentBuffers = new Array(channelCount);
1002
- for (var ch = 0; ch < channelCount; ch++) {
1003
- var chSamples = inBuffer.getChannelData(ch);
1004
- var chSamplesCopy = chSamples.slice(0);
1005
- currentBuffers[ch] = chSamplesCopy.slice(0);
1006
- _this.data[ch].push(chSamplesCopy);
1007
- _this.framesRecorded += chSamplesCopy.length;
1008
- }
1009
- c_1++;
1010
- if (_this.audioOutStream) {
1011
- _this.audioOutStream.write(currentBuffers);
1390
+ if (scriptProcessorNode.onaudioprocess) {
1391
+ scriptProcessorNode.onaudioprocess = function (e) {
1392
+ if (_this.capturing) {
1393
+ var inBuffer = e.inputBuffer;
1394
+ var duration = inBuffer.duration;
1395
+ // only process requested count of channels
1396
+ var currentBuffers = new Array(channelCount);
1397
+ for (var ch = 0; ch < channelCount; ch++) {
1398
+ var chSamples = inBuffer.getChannelData(ch);
1399
+ var chSamplesCopy = chSamples.slice(0);
1400
+ currentBuffers[ch] = chSamplesCopy.slice(0);
1401
+ _this.data[ch].push(chSamplesCopy);
1402
+ if (DEBUG_TRACE_LEVEL > 8) {
1403
+ console.debug("Process " + chSamplesCopy.length + " samples.");
1404
+ }
1405
+ _this.framesRecorded += chSamplesCopy.length;
1406
+ }
1407
+ c_1++;
1408
+ if (_this.audioOutStream) {
1409
+ _this.audioOutStream.write(currentBuffers);
1410
+ }
1012
1411
  }
1412
+ };
1413
+ _this._opened = true;
1414
+ if (_this.listener) {
1415
+ _this.listener.opened();
1013
1416
  }
1014
- };
1417
+ }
1418
+ else {
1419
+ _this.listener.error('Browser does not support audio processing (ScriptProcessor.onaudioprocess method not found)!');
1420
+ }
1015
1421
  }
1016
- _this._opened = true;
1017
- if (_this.listener) {
1018
- _this.listener.opened();
1422
+ else {
1423
+ _this.listener.error('Browser does not support audio processing (neither AudioWorkletProcessor nor ScriptProcessor)!');
1019
1424
  }
1020
1425
  }, function (e) {
1021
1426
  console.error(e + " Error name: " + e.name);
@@ -1042,14 +1447,16 @@
1042
1447
  this.audioOutStream.nextStream();
1043
1448
  }
1044
1449
  this.capturing = true;
1045
- this.mediaStream.connect(this.bufferingNode);
1046
- this.bufferingNode.connect(this.context.destination);
1450
+ if (this.bufferingNode) {
1451
+ this.mediaStream.connect(this.bufferingNode);
1452
+ this.bufferingNode.connect(this.context.destination);
1453
+ }
1047
1454
  if (this.listener) {
1048
1455
  this.listener.started();
1049
1456
  }
1050
1457
  };
1051
1458
  AudioCapture.prototype.stop = function () {
1052
- if (this.disconnectStreams) {
1459
+ if (this.disconnectStreams && this.bufferingNode) {
1053
1460
  this.mediaStream.disconnect(this.bufferingNode);
1054
1461
  this.bufferingNode.disconnect(this.context.destination);
1055
1462
  }
@@ -1075,7 +1482,7 @@
1075
1482
  this._opened = false;
1076
1483
  };
1077
1484
  AudioCapture.prototype.audioBuffer = function () {
1078
- var e_1, _a, e_2, _b;
1485
+ var e_2, _a, e_3, _b;
1079
1486
  var frameLen = 0;
1080
1487
  var ch0Data = this.data[0];
1081
1488
  try {
@@ -1084,31 +1491,31 @@
1084
1491
  frameLen += ch0Chk.length;
1085
1492
  }
1086
1493
  }
1087
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
1494
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
1088
1495
  finally {
1089
1496
  try {
1090
1497
  if (ch0Data_1_1 && !ch0Data_1_1.done && (_a = ch0Data_1.return)) _a.call(ch0Data_1);
1091
1498
  }
1092
- finally { if (e_1) throw e_1.error; }
1499
+ finally { if (e_2) throw e_2.error; }
1093
1500
  }
1094
1501
  var ab = this.context.createBuffer(this.channelCount, frameLen, this.context.sampleRate);
1095
1502
  for (var ch = 0; ch < this.channelCount; ch++) {
1096
1503
  var chD = ab.getChannelData(ch);
1097
1504
  var pos = 0;
1098
1505
  try {
1099
- for (var _c = (e_2 = void 0, __values(this.data[ch])), _d = _c.next(); !_d.done; _d = _c.next()) {
1506
+ for (var _c = (e_3 = void 0, __values(this.data[ch])), _d = _c.next(); !_d.done; _d = _c.next()) {
1100
1507
  var chChk = _d.value;
1101
1508
  var bufLen = chChk.length;
1102
1509
  chD.set(chChk, pos);
1103
1510
  pos += bufLen;
1104
1511
  }
1105
1512
  }
1106
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
1513
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
1107
1514
  finally {
1108
1515
  try {
1109
1516
  if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
1110
1517
  }
1111
- finally { if (e_2) throw e_2.error; }
1518
+ finally { if (e_3) throw e_3.error; }
1112
1519
  }
1113
1520
  }
1114
1521
  return ab;
@@ -1823,9 +2230,9 @@
1823
2230
  }
1824
2231
  return SpeechRecorderConfig;
1825
2232
  }());
1826
- SpeechRecorderConfig.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SpeechRecorderConfig, deps: [], target: i0__namespace.ɵɵFactoryTarget.Injectable });
1827
- SpeechRecorderConfig.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SpeechRecorderConfig });
1828
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SpeechRecorderConfig, decorators: [{
2233
+ SpeechRecorderConfig.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SpeechRecorderConfig, deps: [], target: i0__namespace.ɵɵFactoryTarget.Injectable });
2234
+ SpeechRecorderConfig.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SpeechRecorderConfig });
2235
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SpeechRecorderConfig, decorators: [{
1829
2236
  type: i0.Injectable
1830
2237
  }], ctorParameters: function () { return []; } });
1831
2238
 
@@ -1878,9 +2285,9 @@
1878
2285
  return ProjectService;
1879
2286
  }());
1880
2287
  ProjectService.PROJECT_API_CTX = 'project';
1881
- ProjectService.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ProjectService, deps: [{ token: i1__namespace.HttpClient }, { token: i4__namespace.PlatformLocation }, { token: SPEECHRECORDER_CONFIG }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
1882
- ProjectService.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ProjectService });
1883
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ProjectService, decorators: [{
2288
+ ProjectService.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: ProjectService, deps: [{ token: i1__namespace.HttpClient }, { token: i4__namespace.PlatformLocation }, { token: SPEECHRECORDER_CONFIG }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
2289
+ ProjectService.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: ProjectService });
2290
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: ProjectService, decorators: [{
1884
2291
  type: i0.Injectable
1885
2292
  }], ctorParameters: function () {
1886
2293
  return [{ type: i1__namespace.HttpClient }, { type: i4__namespace.PlatformLocation }, { type: SpeechRecorderConfig, decorators: [{
@@ -1944,9 +2351,9 @@
1944
2351
  return SessionService;
1945
2352
  }());
1946
2353
  SessionService.SESSION_API_CTX = 'session';
1947
- SessionService.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SessionService, deps: [{ token: i1__namespace.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
1948
- SessionService.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SessionService });
1949
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SessionService, decorators: [{
2354
+ SessionService.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SessionService, deps: [{ token: i1__namespace.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
2355
+ SessionService.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SessionService });
2356
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SessionService, decorators: [{
1950
2357
  type: i0.Injectable
1951
2358
  }], ctorParameters: function () {
1952
2359
  return [{ type: i1__namespace.HttpClient }, { type: SpeechRecorderConfig, decorators: [{
@@ -2254,9 +2661,9 @@
2254
2661
  };
2255
2662
  return LevelBar;
2256
2663
  }());
2257
- LevelBar.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: LevelBar, deps: [{ token: i0__namespace.ElementRef }, { token: i0__namespace.ChangeDetectorRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
2258
- LevelBar.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: LevelBar, selector: "audio-levelbar", inputs: { streamingMode: "streamingMode", displayLevelInfos: "displayLevelInfos" }, host: { listeners: { "scroll": "onScroll($event)", "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "virtualCanvasRef", first: true, predicate: ["virtualCanvas"], descendants: true, static: true }, { propertyName: "liveLevelCanvasRef", first: true, predicate: ["levelbar"], descendants: true, static: true }, { propertyName: "markerCanvasRef", first: true, predicate: ["markerCanvas"], descendants: true, static: true }], ngImport: i0__namespace, template: "\n <div #virtualCanvas>\n <canvas #levelbar></canvas>\n <canvas #markerCanvas></canvas>\n </div>\n ", isInline: true, styles: [":host {\n\n width: 100%;\n background: darkgray;\n box-sizing: border-box;\n height: 100%;\n position: relative;\n overflow-x: scroll;\n overflow-y: auto;\n }", "div {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n\n /*position: absolute;*/\n box-sizing: border-box;\n }", "canvas {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n }"] });
2259
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: LevelBar, decorators: [{
2664
+ LevelBar.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: LevelBar, deps: [{ token: i0__namespace.ElementRef }, { token: i0__namespace.ChangeDetectorRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
2665
+ LevelBar.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: LevelBar, selector: "audio-levelbar", inputs: { streamingMode: "streamingMode", displayLevelInfos: "displayLevelInfos" }, host: { listeners: { "scroll": "onScroll($event)", "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "virtualCanvasRef", first: true, predicate: ["virtualCanvas"], descendants: true, static: true }, { propertyName: "liveLevelCanvasRef", first: true, predicate: ["levelbar"], descendants: true, static: true }, { propertyName: "markerCanvasRef", first: true, predicate: ["markerCanvas"], descendants: true, static: true }], ngImport: i0__namespace, template: "\n <div #virtualCanvas>\n <canvas #levelbar></canvas>\n <canvas #markerCanvas></canvas>\n </div>\n ", isInline: true, styles: [":host {\n\n width: 100%;\n background: darkgray;\n box-sizing: border-box;\n height: 100%;\n position: relative;\n overflow-x: scroll;\n overflow-y: auto;\n }", "div {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n\n /*position: absolute;*/\n box-sizing: border-box;\n }", "canvas {\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n }"] });
2666
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: LevelBar, decorators: [{
2260
2667
  type: i0.Component,
2261
2668
  args: [{
2262
2669
  selector: 'audio-levelbar',
@@ -2297,6 +2704,8 @@
2297
2704
  this.peakDbLevelStr = "-___ dB";
2298
2705
  this.peakDbLvl = MIN_DB_LEVEL;
2299
2706
  this._displayLevelInfos = null;
2707
+ this._agc = undefined;
2708
+ this.agcString = 'n/a';
2300
2709
  this.onShowRecordingDetails = new i0.EventEmitter();
2301
2710
  this.onDownloadRecording = new i0.EventEmitter();
2302
2711
  this.playStartEnabled = false;
@@ -2305,6 +2714,24 @@
2305
2714
  this.destroyed = false;
2306
2715
  this.warnDbLevel = DEFAULT_WARN_DB_LEVEL;
2307
2716
  }
2717
+ Object.defineProperty(LevelBarDisplay.prototype, "agc", {
2718
+ set: function (agc) {
2719
+ this._agc = agc;
2720
+ if (this._agc === undefined || this._agc === null) {
2721
+ this.agcString = 'n/a';
2722
+ }
2723
+ else {
2724
+ if (this._agc === true) {
2725
+ this.agcString = 'On';
2726
+ }
2727
+ else {
2728
+ this.agcString = 'Off';
2729
+ }
2730
+ }
2731
+ },
2732
+ enumerable: false,
2733
+ configurable: true
2734
+ });
2308
2735
  LevelBarDisplay.prototype.ngOnDestroy = function () {
2309
2736
  this.destroyed = true;
2310
2737
  };
@@ -2370,13 +2797,13 @@
2370
2797
  };
2371
2798
  return LevelBarDisplay;
2372
2799
  }());
2373
- LevelBarDisplay.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: LevelBarDisplay, deps: [{ token: i0__namespace.ElementRef }, { token: i0__namespace.ChangeDetectorRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
2374
- LevelBarDisplay.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: LevelBarDisplay, selector: "spr-recordingitemdisplay", inputs: { streamingMode: "streamingMode", audioSignalCollapsed: "audioSignalCollapsed", enableDownload: "enableDownload", playStartAction: "playStartAction", playStopAction: "playStopAction", displayAudioBuffer: "displayAudioBuffer", displayLevelInfos: "displayLevelInfos" }, outputs: { onShowRecordingDetails: "onShowRecordingDetails", onDownloadRecording: "onDownloadRecording" }, viewQueries: [{ propertyName: "liveLevel", first: true, predicate: LevelBar, descendants: true, static: true }], ngImport: i0__namespace, template: "\n <audio-levelbar [streamingMode]=\"streamingMode\" [displayLevelInfos]=\"_displayLevelInfos\"></audio-levelbar>\n <button matTooltip=\"Start playback\" (click)=\"playStartAction?.perform()\"\n [disabled]=\"playStartAction?.disabled\"\n [style.color]=\"playStartAction?.disabled ? 'grey' : 'green'\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n <button matTooltip=\"Stop playback\" (click)=\"playStopAction?.perform()\"\n [disabled]=\"playStopAction?.disabled\"\n [style.color]=\"playStopAction?.disabled ? 'grey' : 'yellow'\">\n <mat-icon>stop</mat-icon>\n </button>\n <button matTooltip=\"Toggle detailed audio display\" [disabled]=\"displayAudioBuffer==null\"\n (click)=\"showRecordingDetails()\">\n <mat-icon>{{(audioSignalCollapsed) ? \"expand_less\" : \"expand_more\"}}</mat-icon>\n </button>\n <button matTooltip=\"Download current recording\" *ngIf=\"enableDownload\" [disabled]=\"displayAudioBuffer==null\"\n (click)=\"downloadRecording()\">\n <mat-icon>file_download</mat-icon>\n </button>\n <div style=\"min-width: 14ch;padding:2px\"><table border=\"0\"><tr><td>Peak:</td><td><span matTooltip=\"Peak level\"\n [style.color]=\"(peakDbLvl > warnDbLevel)?'red':'black'\">{{peakDbLvl | number:'1.1-1'}} dB </span></td></tr></table></div>\n ", isInline: true, styles: [":host {\n flex: 0; /* only required vertical space */\n width: 100%;\n background: darkgray;\n padding: 4px;\n box-sizing: border-box;\n height: 100px;\n min-height: 100px;\n display: flex; /* flex container: left level bar, right decimal peak level value */\n flex-direction: row;\n flex-wrap: nowrap; /* wrap could completely destroy the layout */\n }", "audio-levelbar {\n flex: 1;\n box-sizing: border-box;\n }", "span {\n flex: 0;\n font-weight: bold;\n display: inline-block;\n white-space: nowrap;\n box-sizing: border-box;\n }"], components: [{ type: LevelBar, selector: "audio-levelbar", inputs: ["streamingMode", "displayLevelInfos"] }, { type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i3__namespace.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "number": i4__namespace.DecimalPipe } });
2375
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: LevelBarDisplay, decorators: [{
2800
+ LevelBarDisplay.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: LevelBarDisplay, deps: [{ token: i0__namespace.ElementRef }, { token: i0__namespace.ChangeDetectorRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
2801
+ LevelBarDisplay.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: LevelBarDisplay, 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 }], ngImport: i0__namespace, template: "\n <audio-levelbar [streamingMode]=\"streamingMode\" [displayLevelInfos]=\"_displayLevelInfos\"></audio-levelbar>\n <button matTooltip=\"Start playback\" (click)=\"playStartAction?.perform()\"\n [disabled]=\"playStartAction?.disabled\"\n [style.color]=\"playStartAction?.disabled ? 'grey' : 'green'\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n <button matTooltip=\"Stop playback\" (click)=\"playStopAction?.perform()\"\n [disabled]=\"playStopAction?.disabled\"\n [style.color]=\"playStopAction?.disabled ? 'grey' : 'yellow'\">\n <mat-icon>stop</mat-icon>\n </button>\n <button matTooltip=\"Toggle detailed audio display\" [disabled]=\"displayAudioBuffer==null\"\n (click)=\"showRecordingDetails()\">\n <mat-icon>{{(audioSignalCollapsed) ? \"expand_less\" : \"expand_more\"}}</mat-icon>\n </button>\n <button matTooltip=\"Download current recording\" *ngIf=\"enableDownload\" [disabled]=\"displayAudioBuffer==null\"\n (click)=\"downloadRecording()\">\n <mat-icon>file_download</mat-icon>\n </button>\n <div style=\"min-width: 14ch;padding:2px\"><table border=\"0\"><tr><td>Peak:</td><td><span matTooltip=\"Peak level\"\n [style.color]=\"(peakDbLvl > warnDbLevel)?'red':'black'\">{{peakDbLvl | number:'1.1-1'}} dB </span></td></tr>\n <tr *ngIf=\"_agc\"><td>AGC:</td><td><span matTooltip=\"Auto gain control\">{{agcString}}</span></td></tr></table></div>\n ", isInline: true, styles: [":host {\n flex: 0; /* only required vertical space */\n width: 100%;\n background: darkgray;\n padding: 4px;\n box-sizing: border-box;\n height: 100px;\n min-height: 100px;\n display: flex; /* flex container: left level bar, right decimal peak level value */\n flex-direction: row;\n flex-wrap: nowrap; /* wrap could completely destroy the layout */\n }", "audio-levelbar {\n flex: 1;\n box-sizing: border-box;\n }", "span {\n flex: 0;\n font-weight: bold;\n display: inline-block;\n white-space: nowrap;\n box-sizing: border-box;\n }"], components: [{ type: LevelBar, selector: "audio-levelbar", inputs: ["streamingMode", "displayLevelInfos"] }, { type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i3__namespace.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "number": i4__namespace.DecimalPipe } });
2802
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: LevelBarDisplay, decorators: [{
2376
2803
  type: i0.Component,
2377
2804
  args: [{
2378
2805
  selector: 'spr-recordingitemdisplay',
2379
- template: "\n <audio-levelbar [streamingMode]=\"streamingMode\" [displayLevelInfos]=\"_displayLevelInfos\"></audio-levelbar>\n <button matTooltip=\"Start playback\" (click)=\"playStartAction?.perform()\"\n [disabled]=\"playStartAction?.disabled\"\n [style.color]=\"playStartAction?.disabled ? 'grey' : 'green'\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n <button matTooltip=\"Stop playback\" (click)=\"playStopAction?.perform()\"\n [disabled]=\"playStopAction?.disabled\"\n [style.color]=\"playStopAction?.disabled ? 'grey' : 'yellow'\">\n <mat-icon>stop</mat-icon>\n </button>\n <button matTooltip=\"Toggle detailed audio display\" [disabled]=\"displayAudioBuffer==null\"\n (click)=\"showRecordingDetails()\">\n <mat-icon>{{(audioSignalCollapsed) ? \"expand_less\" : \"expand_more\"}}</mat-icon>\n </button>\n <button matTooltip=\"Download current recording\" *ngIf=\"enableDownload\" [disabled]=\"displayAudioBuffer==null\"\n (click)=\"downloadRecording()\">\n <mat-icon>file_download</mat-icon>\n </button>\n <div style=\"min-width: 14ch;padding:2px\"><table border=\"0\"><tr><td>Peak:</td><td><span matTooltip=\"Peak level\"\n [style.color]=\"(peakDbLvl > warnDbLevel)?'red':'black'\">{{peakDbLvl | number:'1.1-1'}} dB </span></td></tr></table></div>\n ",
2806
+ template: "\n <audio-levelbar [streamingMode]=\"streamingMode\" [displayLevelInfos]=\"_displayLevelInfos\"></audio-levelbar>\n <button matTooltip=\"Start playback\" (click)=\"playStartAction?.perform()\"\n [disabled]=\"playStartAction?.disabled\"\n [style.color]=\"playStartAction?.disabled ? 'grey' : 'green'\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n <button matTooltip=\"Stop playback\" (click)=\"playStopAction?.perform()\"\n [disabled]=\"playStopAction?.disabled\"\n [style.color]=\"playStopAction?.disabled ? 'grey' : 'yellow'\">\n <mat-icon>stop</mat-icon>\n </button>\n <button matTooltip=\"Toggle detailed audio display\" [disabled]=\"displayAudioBuffer==null\"\n (click)=\"showRecordingDetails()\">\n <mat-icon>{{(audioSignalCollapsed) ? \"expand_less\" : \"expand_more\"}}</mat-icon>\n </button>\n <button matTooltip=\"Download current recording\" *ngIf=\"enableDownload\" [disabled]=\"displayAudioBuffer==null\"\n (click)=\"downloadRecording()\">\n <mat-icon>file_download</mat-icon>\n </button>\n <div style=\"min-width: 14ch;padding:2px\"><table border=\"0\"><tr><td>Peak:</td><td><span matTooltip=\"Peak level\"\n [style.color]=\"(peakDbLvl > warnDbLevel)?'red':'black'\">{{peakDbLvl | number:'1.1-1'}} dB </span></td></tr>\n <tr *ngIf=\"_agc\"><td>AGC:</td><td><span matTooltip=\"Auto gain control\">{{agcString}}</span></td></tr></table></div>\n ",
2380
2807
  styles: [":host {\n flex: 0; /* only required vertical space */\n width: 100%;\n background: darkgray;\n padding: 4px;\n box-sizing: border-box;\n height: 100px;\n min-height: 100px;\n display: flex; /* flex container: left level bar, right decimal peak level value */\n flex-direction: row;\n flex-wrap: nowrap; /* wrap could completely destroy the layout */\n }", "audio-levelbar {\n flex: 1;\n box-sizing: border-box;\n }", "span {\n flex: 0;\n font-weight: bold;\n display: inline-block;\n white-space: nowrap;\n box-sizing: border-box;\n }"]
2381
2808
  }]
2382
2809
  }], ctorParameters: function () { return [{ type: i0__namespace.ElementRef }, { type: i0__namespace.ChangeDetectorRef }]; }, propDecorators: { liveLevel: [{
@@ -2388,6 +2815,8 @@
2388
2815
  type: i0.Input
2389
2816
  }], enableDownload: [{
2390
2817
  type: i0.Input
2818
+ }], agc: [{
2819
+ type: i0.Input
2391
2820
  }], onShowRecordingDetails: [{
2392
2821
  type: i0.Output
2393
2822
  }], onDownloadRecording: [{
@@ -2809,9 +3238,9 @@
2809
3238
  });
2810
3239
  return SimpleTrafficLight;
2811
3240
  }());
2812
- SimpleTrafficLight.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SimpleTrafficLight, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
2813
- SimpleTrafficLight.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: SimpleTrafficLight, selector: "app-simpletrafficlight", inputs: { status: "status" }, ngImport: i0__namespace, template: "\n\n <div>\n <div class=\"circle {{lighttop}}\"></div>\n <div class=\"circle {{lightmid}}\"></div>\n <div class=\"circle {{lightbottom}}\"></div>\n </div>\n ", isInline: true, styles: [".circle {\n width: 50px;\n height: 50px;\n border-radius: 50%;\n margin: 5px;\n background: grey;\n }", ".red {\n background: red;\n }\n ", "\n .yellow {\n background: yellow;\n }\n ", "\n .green {\n background: green;\n }\n ", "\n .black {\n background: black;\n }", ":host {\n display: flex;\n flex-direction: column;\n background: black;\n \n padding: 2px;\n height: 170px;\n max-height: 170px;\n flex: 0 0 content;\n }\n "] });
2814
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SimpleTrafficLight, decorators: [{
3241
+ SimpleTrafficLight.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SimpleTrafficLight, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
3242
+ SimpleTrafficLight.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: SimpleTrafficLight, selector: "app-simpletrafficlight", inputs: { status: "status" }, ngImport: i0__namespace, template: "\n\n <div>\n <div class=\"circle {{lighttop}}\"></div>\n <div class=\"circle {{lightmid}}\"></div>\n <div class=\"circle {{lightbottom}}\"></div>\n </div>\n ", isInline: true, styles: [".circle {\n width: 50px;\n height: 50px;\n border-radius: 50%;\n margin: 5px;\n background: grey;\n }", ".red {\n background: red;\n }\n ", "\n .yellow {\n background: yellow;\n }\n ", "\n .green {\n background: green;\n }\n ", "\n .black {\n background: black;\n }", ":host {\n display: flex;\n flex-direction: column;\n background: black;\n \n padding: 2px;\n height: 170px;\n max-height: 170px;\n flex: 0 0 content;\n }\n "] });
3243
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SimpleTrafficLight, decorators: [{
2815
3244
  type: i0.Component,
2816
3245
  args: [{
2817
3246
  selector: 'app-simpletrafficlight',
@@ -2884,9 +3313,9 @@
2884
3313
  };
2885
3314
  return CanvasLayerComponent;
2886
3315
  }());
2887
- CanvasLayerComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: CanvasLayerComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Directive });
2888
- CanvasLayerComponent.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.5", type: CanvasLayerComponent, ngImport: i0__namespace });
2889
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: CanvasLayerComponent, decorators: [{
3316
+ CanvasLayerComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: CanvasLayerComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Directive });
3317
+ CanvasLayerComponent.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.10", type: CanvasLayerComponent, ngImport: i0__namespace });
3318
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: CanvasLayerComponent, decorators: [{
2890
3319
  type: i0.Directive
2891
3320
  }], ctorParameters: function () { return []; } });
2892
3321
 
@@ -3171,9 +3600,9 @@
3171
3600
  };
3172
3601
  return BasicAudioCanvasLayerComponent;
3173
3602
  }(CanvasLayerComponent));
3174
- BasicAudioCanvasLayerComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: BasicAudioCanvasLayerComponent, deps: null, target: i0__namespace.ɵɵFactoryTarget.Directive });
3175
- BasicAudioCanvasLayerComponent.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.5", type: BasicAudioCanvasLayerComponent, usesInheritance: true, ngImport: i0__namespace });
3176
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: BasicAudioCanvasLayerComponent, decorators: [{
3603
+ BasicAudioCanvasLayerComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: BasicAudioCanvasLayerComponent, deps: null, target: i0__namespace.ɵɵFactoryTarget.Directive });
3604
+ BasicAudioCanvasLayerComponent.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.10", type: BasicAudioCanvasLayerComponent, usesInheritance: true, ngImport: i0__namespace });
3605
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: BasicAudioCanvasLayerComponent, decorators: [{
3177
3606
  type: i0.Directive
3178
3607
  }] });
3179
3608
  var AudioCanvasLayerComponent = /** @class */ (function (_super) {
@@ -3391,9 +3820,9 @@
3391
3820
  };
3392
3821
  return AudioCanvasLayerComponent;
3393
3822
  }(BasicAudioCanvasLayerComponent));
3394
- AudioCanvasLayerComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AudioCanvasLayerComponent, deps: null, target: i0__namespace.ɵɵFactoryTarget.Directive });
3395
- AudioCanvasLayerComponent.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.5", type: AudioCanvasLayerComponent, inputs: { pointerPosition: "pointerPosition", selecting: "selecting", selection: "selection" }, outputs: { pointerPositionEventEmitter: "pointerPositionEventEmitter", selectingEventEmitter: "selectingEventEmitter", selectedEventEmitter: "selectedEventEmitter" }, host: { listeners: { "document:mouseup": "onMouseup($event)" } }, viewQueries: [{ propertyName: "bgCanvasRef", first: true, predicate: ["bg"], descendants: true, static: true }, { propertyName: "cursorCanvasRef", first: true, predicate: ["cursor"], descendants: true, static: true }], usesInheritance: true, ngImport: i0__namespace });
3396
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AudioCanvasLayerComponent, decorators: [{
3823
+ AudioCanvasLayerComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: AudioCanvasLayerComponent, deps: null, target: i0__namespace.ɵɵFactoryTarget.Directive });
3824
+ AudioCanvasLayerComponent.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.10", type: AudioCanvasLayerComponent, inputs: { pointerPosition: "pointerPosition", selecting: "selecting", selection: "selection" }, outputs: { pointerPositionEventEmitter: "pointerPositionEventEmitter", selectingEventEmitter: "selectingEventEmitter", selectedEventEmitter: "selectedEventEmitter" }, host: { listeners: { "document:mouseup": "onMouseup($event)" } }, viewQueries: [{ propertyName: "bgCanvasRef", first: true, predicate: ["bg"], descendants: true, static: true }, { propertyName: "cursorCanvasRef", first: true, predicate: ["cursor"], descendants: true, static: true }], usesInheritance: true, ngImport: i0__namespace });
3825
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: AudioCanvasLayerComponent, decorators: [{
3397
3826
  type: i0.Directive
3398
3827
  }], propDecorators: { bgCanvasRef: [{
3399
3828
  type: i0.ViewChild,
@@ -3726,9 +4155,9 @@
3726
4155
  };
3727
4156
  return AudioSignal;
3728
4157
  }(AudioCanvasLayerComponent));
3729
- AudioSignal.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AudioSignal, deps: [{ token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
3730
- AudioSignal.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AudioSignal, selector: "audio-signal", viewQueries: [{ propertyName: "audioSignalCanvasRef", first: true, predicate: ["audioSignal"], descendants: true, static: true }, { propertyName: "playPosCanvasRef", first: true, predicate: ["marker"], descendants: true, static: true }], usesInheritance: true, ngImport: i0__namespace, template: "\n <canvas #bg height=\"10\"></canvas>\n <canvas #audioSignal height=\"10\"></canvas>\n <canvas #cursor height=\"10\" (mousedown)=\"selectionStart($event)\" (mouseover)=\"updateCursorCanvas($event)\" (mousemove)=\"updateCursorCanvas($event)\"\n (mouseleave)=\"updateCursorCanvas($event, false)\"></canvas>\n <canvas #marker height=\"10\"></canvas>", isInline: true, styles: [":host{\n min-height: 0px;\n }", "canvas {\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n min-height: 0px;\n position: absolute;\n }"] });
3731
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AudioSignal, decorators: [{
4158
+ AudioSignal.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: AudioSignal, deps: [{ token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
4159
+ AudioSignal.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: AudioSignal, selector: "audio-signal", viewQueries: [{ propertyName: "audioSignalCanvasRef", first: true, predicate: ["audioSignal"], descendants: true, static: true }, { propertyName: "playPosCanvasRef", first: true, predicate: ["marker"], descendants: true, static: true }], usesInheritance: true, ngImport: i0__namespace, template: "\n <canvas #bg height=\"10\"></canvas>\n <canvas #audioSignal height=\"10\"></canvas>\n <canvas #cursor height=\"10\" (mousedown)=\"selectionStart($event)\" (mouseover)=\"updateCursorCanvas($event)\" (mousemove)=\"updateCursorCanvas($event)\"\n (mouseleave)=\"updateCursorCanvas($event, false)\"></canvas>\n <canvas #marker height=\"10\"></canvas>", isInline: true, styles: [":host{\n min-height: 0px;\n }", "canvas {\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n min-height: 0px;\n position: absolute;\n }"] });
4160
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: AudioSignal, decorators: [{
3732
4161
  type: i0.Component,
3733
4162
  args: [{
3734
4163
  selector: 'audio-signal',
@@ -4664,9 +5093,9 @@
4664
5093
  };
4665
5094
  return Sonagram;
4666
5095
  }(AudioCanvasLayerComponent));
4667
- Sonagram.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: Sonagram, deps: [{ token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
4668
- Sonagram.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: Sonagram, selector: "audio-sonagram", viewQueries: [{ propertyName: "sonagramCanvasRef", first: true, predicate: ["sonagram"], descendants: true, static: true }, { propertyName: "markerCanvasRef", first: true, predicate: ["marker"], descendants: true, static: true }], usesInheritance: true, ngImport: i0__namespace, template: "\n <canvas #sonagram height=\"10\"></canvas>\n <canvas #bg height=\"10\"></canvas>\n <canvas #cursor height=\"10\" (mousedown)=\"selectionStart($event)\" (mouseover)=\"updateCursorCanvas($event)\" (mousemove)=\"updateCursorCanvas($event)\"\n (mouseleave)=\"updateCursorCanvas($event, false)\"></canvas>\n <canvas #marker height=\"10\"></canvas>", isInline: true, styles: [":host{\n min-height: 0px;\n }", "canvas {\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n min-height: 0px;\n position: absolute;\n }"] });
4669
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: Sonagram, decorators: [{
5096
+ Sonagram.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: Sonagram, deps: [{ token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
5097
+ Sonagram.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: Sonagram, selector: "audio-sonagram", viewQueries: [{ propertyName: "sonagramCanvasRef", first: true, predicate: ["sonagram"], descendants: true, static: true }, { propertyName: "markerCanvasRef", first: true, predicate: ["marker"], descendants: true, static: true }], usesInheritance: true, ngImport: i0__namespace, template: "\n <canvas #sonagram height=\"10\"></canvas>\n <canvas #bg height=\"10\"></canvas>\n <canvas #cursor height=\"10\" (mousedown)=\"selectionStart($event)\" (mouseover)=\"updateCursorCanvas($event)\" (mousemove)=\"updateCursorCanvas($event)\"\n (mouseleave)=\"updateCursorCanvas($event, false)\"></canvas>\n <canvas #marker height=\"10\"></canvas>", isInline: true, styles: [":host{\n min-height: 0px;\n }", "canvas {\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n min-height: 0px;\n position: absolute;\n }"] });
5098
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: Sonagram, decorators: [{
4670
5099
  type: i0.Component,
4671
5100
  args: [{
4672
5101
  selector: 'audio-sonagram',
@@ -5025,9 +5454,9 @@
5025
5454
  return AudioClipUIContainer;
5026
5455
  }(BasicAudioCanvasLayerComponent));
5027
5456
  AudioClipUIContainer.DIVIDER_PIXEL_SIZE = 10;
5028
- AudioClipUIContainer.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AudioClipUIContainer, deps: [{ token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
5029
- AudioClipUIContainer.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AudioClipUIContainer, selector: "app-audio", inputs: { audioData: "audioData", audioClip: "audioClip" }, outputs: { selectionEventEmitter: "selectionEventEmitter" }, host: { listeners: { "window:resize": "onResize($event)", "document:mouseup": "onMouseup($event)", "document:mousemove": "onMousemove($event)" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["divider"], descendants: true, static: true }, { propertyName: "ceRef", first: true, predicate: ["virtualCanvas"], descendants: true, static: true }, { propertyName: "as", first: true, predicate: AudioSignal, descendants: true, static: true }, { propertyName: "so", first: true, predicate: Sonagram, descendants: true, static: true }], usesInheritance: true, ngImport: i0__namespace, template: "\n <div #virtualCanvas>\n <canvas #divider (mousedown)=\"mousedown($event)\" (mouseover)=\"mouseover($event)\"\n (mouseleave)=\"mouseleave($event)\" height=\"10\"></canvas>\n <audio-signal [pointerPosition]=\"pointer\" [selecting]=\"selecting\" [selection]=\"selection\" (pointerPositionEventEmitter)=\"pointerPositionChanged($event)\" (selectingEventEmitter)=\"selectingChanged($event)\" (selectedEventEmitter)=\"selectionChanged($event)\"></audio-signal>\n <audio-sonagram [pointerPosition]=\"pointer\" [selecting]=\"selecting\" [selection]=\"selection\" (pointerPositionEventEmitter)=\"pointerPositionChanged($event)\" (selectingEventEmitter)=\"selectingChanged($event)\" (selectedEventEmitter)=\"selectionChanged($event)\"></audio-sonagram>\n </div>\n ", isInline: true, styles: ["div {\n\n margin: 0;\n padding: 0;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: relative; /* TODO container div position must not be 'static' (default) to act as reference for the canvases */\n box-sizing: border-box;\n transform: none;\n }", "canvas{\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n cursor: ns-resize;\n position: absolute;\n zIndex: 1;\n transform: none;\n }", "audio-signal {\n top: 0;\n left: 0;\n position: absolute;\n zIndex: 1;\n transform: none;\n }", "audio-sonagram {\n top: 0;\n left: 0;\n position: absolute;\n zIndex: 1;\n transform: none;\n }"], components: [{ type: AudioSignal, selector: "audio-signal" }, { type: Sonagram, selector: "audio-sonagram" }] });
5030
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AudioClipUIContainer, decorators: [{
5457
+ AudioClipUIContainer.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: AudioClipUIContainer, deps: [{ token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
5458
+ AudioClipUIContainer.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: AudioClipUIContainer, selector: "app-audio", inputs: { audioData: "audioData", audioClip: "audioClip" }, outputs: { selectionEventEmitter: "selectionEventEmitter" }, host: { listeners: { "window:resize": "onResize($event)", "document:mouseup": "onMouseup($event)", "document:mousemove": "onMousemove($event)" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["divider"], descendants: true, static: true }, { propertyName: "ceRef", first: true, predicate: ["virtualCanvas"], descendants: true, static: true }, { propertyName: "as", first: true, predicate: AudioSignal, descendants: true, static: true }, { propertyName: "so", first: true, predicate: Sonagram, descendants: true, static: true }], usesInheritance: true, ngImport: i0__namespace, template: "\n <div #virtualCanvas>\n <canvas #divider (mousedown)=\"mousedown($event)\" (mouseover)=\"mouseover($event)\"\n (mouseleave)=\"mouseleave($event)\" height=\"10\"></canvas>\n <audio-signal [pointerPosition]=\"pointer\" [selecting]=\"selecting\" [selection]=\"selection\" (pointerPositionEventEmitter)=\"pointerPositionChanged($event)\" (selectingEventEmitter)=\"selectingChanged($event)\" (selectedEventEmitter)=\"selectionChanged($event)\"></audio-signal>\n <audio-sonagram [pointerPosition]=\"pointer\" [selecting]=\"selecting\" [selection]=\"selection\" (pointerPositionEventEmitter)=\"pointerPositionChanged($event)\" (selectingEventEmitter)=\"selectingChanged($event)\" (selectedEventEmitter)=\"selectionChanged($event)\"></audio-sonagram>\n </div>\n ", isInline: true, styles: ["div {\n\n margin: 0;\n padding: 0;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: relative; /* TODO container div position must not be 'static' (default) to act as reference for the canvases */\n box-sizing: border-box;\n transform: none;\n }", "canvas{\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n cursor: ns-resize;\n position: absolute;\n zIndex: 1;\n transform: none;\n }", "audio-signal {\n top: 0;\n left: 0;\n position: absolute;\n zIndex: 1;\n transform: none;\n }", "audio-sonagram {\n top: 0;\n left: 0;\n position: absolute;\n zIndex: 1;\n transform: none;\n }"], components: [{ type: AudioSignal, selector: "audio-signal" }, { type: Sonagram, selector: "audio-sonagram" }] });
5459
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: AudioClipUIContainer, decorators: [{
5031
5460
  type: i0.Component,
5032
5461
  args: [{
5033
5462
  selector: 'app-audio',
@@ -5188,9 +5617,9 @@
5188
5617
  });
5189
5618
  return AudioDisplayScrollPane;
5190
5619
  }());
5191
- AudioDisplayScrollPane.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AudioDisplayScrollPane, deps: [{ token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
5192
- AudioDisplayScrollPane.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: { audioClip: "audioClip" }, outputs: { zoomInAction: "zoomInAction", zoomOutAction: "zoomOutAction", zoomSelectedAction: "zoomSelectedAction", zoomFitToPanelAction: "zoomFitToPanelAction" }, host: { listeners: { "scroll": "onScroll($event)", "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "ac", first: true, predicate: AudioClipUIContainer, descendants: true, static: true }], ngImport: i0__namespace, template: "\n\n <app-audio #audioSignalContainer (selectionEventEmitter)=\"selectionChanged($event)\"></app-audio>\n\n ", isInline: true, styles: [":host {\n flex: 2;\n width: 100%;\n background: darkgray;\n box-sizing: border-box;\n height: 100%;\n position: relative;\n overflow-x: scroll;\n overflow-y: auto;\n }", "app-audio {\n\n margin: 0;\n padding: 0;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n\n /*position: absolute;*/\n box-sizing: border-box;\n }"], components: [{ type: AudioClipUIContainer, selector: "app-audio", inputs: ["audioData", "audioClip"], outputs: ["selectionEventEmitter"] }] });
5193
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AudioDisplayScrollPane, decorators: [{
5620
+ AudioDisplayScrollPane.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: AudioDisplayScrollPane, deps: [{ token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
5621
+ AudioDisplayScrollPane.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: { audioClip: "audioClip" }, outputs: { zoomInAction: "zoomInAction", zoomOutAction: "zoomOutAction", zoomSelectedAction: "zoomSelectedAction", zoomFitToPanelAction: "zoomFitToPanelAction" }, host: { listeners: { "scroll": "onScroll($event)", "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "ac", first: true, predicate: AudioClipUIContainer, descendants: true, static: true }], ngImport: i0__namespace, template: "\n\n <app-audio #audioSignalContainer (selectionEventEmitter)=\"selectionChanged($event)\"></app-audio>\n\n ", isInline: true, styles: [":host {\n flex: 2;\n width: 100%;\n background: darkgray;\n box-sizing: border-box;\n height: 100%;\n position: relative;\n overflow-x: scroll;\n overflow-y: auto;\n }", "app-audio {\n\n margin: 0;\n padding: 0;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n\n /*position: absolute;*/\n box-sizing: border-box;\n }"], components: [{ type: AudioClipUIContainer, selector: "app-audio", inputs: ["audioData", "audioClip"], outputs: ["selectionEventEmitter"] }] });
5622
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: AudioDisplayScrollPane, decorators: [{
5194
5623
  type: i0.Component,
5195
5624
  args: [{
5196
5625
  selector: 'audio-display-scroll-pane',
@@ -5254,9 +5683,9 @@
5254
5683
  };
5255
5684
  return AudioDisplayControl;
5256
5685
  }());
5257
- AudioDisplayControl.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AudioDisplayControl, deps: [{ token: i0__namespace.ChangeDetectorRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
5258
- AudioDisplayControl.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: AudioDisplayControl, selector: "audio-display-control", inputs: { audioClip: "audioClip", playStartAction: "playStartAction", playSelectionAction: "playSelectionAction", playStopAction: "playStopAction", zoomInAction: "zoomInAction", zoomOutAction: "zoomOutAction", zoomFitToPanelAction: "zoomFitToPanelAction", zoomSelectedAction: "zoomSelectedAction", autoPlayOnSelectToggleAction: "autoPlayOnSelectToggleAction" }, viewQueries: [{ propertyName: "autoplaySelectedCheckbox", first: true, predicate: i2$1.MatCheckbox, descendants: true, static: true }], ngImport: i0__namespace, template: "\n <div #controlPanel style=\"display:flex;flex-direction: row;\">\n <fieldset>\n\n <legend>Play</legend>\n\n <button (click)=\"playStartAction?.perform()\" [disabled]=\"playStartAction?.disabled\"\n [style.color]=\"playStartAction?.disabled ? 'grey' : 'green'\" matTooltip=\"Play all\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n <button (click)=\"playSelectionAction?.perform()\" [disabled]=\"playSelectionAction?.disabled\"\n [style.color]=\"playSelectionAction?.disabled ? 'grey' : 'green'\" matTooltip=\"Play selection\">\n <mat-icon>play_circle_outline</mat-icon>\n </button>\n <button (click)=\"playStopAction?.perform()\" [disabled]=\"playStopAction?.disabled\"\n [style.color]=\"playStopAction?.disabled ? 'grey' : 'yellow'\">\n <mat-icon>stop</mat-icon>\n </button>&nbsp;\n <mat-checkbox #autoplaySelectionCheckbox (change)=\"autoPlaySelectionChange($event)\">Autoplay on select\n </mat-checkbox>\n </fieldset>\n <fieldset>\n\n <legend>Zoom</legend>\n <button (click)=\"zoomFitToPanelAction?.perform()\"\n [disabled]=\"zoomFitToPanelAction?.disabled\">{{zoomFitToPanelAction?.name}}</button>\n <button (click)=\"zoomOutAction?.perform()\"\n [disabled]=\"zoomOutAction?.disabled\">{{zoomOutAction?.name}}</button>\n <button (click)=\"zoomInAction?.perform()\"\n [disabled]=\"zoomInAction?.disabled\">{{zoomInAction?.name}}</button>\n <button (click)=\"zoomSelectedAction?.perform()\"\n [disabled]=\"zoomSelectedAction?.disabled\">{{zoomSelectedAction?.name}}</button>\n </fieldset>\n <fieldset>\n <legend>Selection</legend>\n {{audioClip?.selection?.leftFrame}} <span\n *ngIf=\"audioClip?.selection\">to</span> {{audioClip?.selection?.rightFrame}}\n <button (click)=\"clearSelection()\" [disabled]=\"audioClip?.selection==null\"\n [style.color]=\"hasSelection() ? 'red' : 'grey'\" matTooltip=\"Clear selection\">\n <mat-icon>clear</mat-icon>\n </button>\n\n </fieldset>\n </div>", isInline: true, styles: [":host {\n flex: 0;\n\n }"], components: [{ type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2__namespace$1.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], directives: [{ type: i3__namespace.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
5259
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AudioDisplayControl, decorators: [{
5686
+ AudioDisplayControl.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: AudioDisplayControl, deps: [{ token: i0__namespace.ChangeDetectorRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
5687
+ AudioDisplayControl.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: AudioDisplayControl, selector: "audio-display-control", inputs: { audioClip: "audioClip", playStartAction: "playStartAction", playSelectionAction: "playSelectionAction", playStopAction: "playStopAction", zoomInAction: "zoomInAction", zoomOutAction: "zoomOutAction", zoomFitToPanelAction: "zoomFitToPanelAction", zoomSelectedAction: "zoomSelectedAction", autoPlayOnSelectToggleAction: "autoPlayOnSelectToggleAction" }, viewQueries: [{ propertyName: "autoplaySelectedCheckbox", first: true, predicate: i2$1.MatCheckbox, descendants: true, static: true }], ngImport: i0__namespace, template: "\n <div #controlPanel style=\"display:flex;flex-direction: row;\">\n <fieldset>\n\n <legend>Play</legend>\n\n <button (click)=\"playStartAction?.perform()\" [disabled]=\"playStartAction?.disabled\"\n [style.color]=\"playStartAction?.disabled ? 'grey' : 'green'\" matTooltip=\"Play all\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n <button (click)=\"playSelectionAction?.perform()\" [disabled]=\"playSelectionAction?.disabled\"\n [style.color]=\"playSelectionAction?.disabled ? 'grey' : 'green'\" matTooltip=\"Play selection\">\n <mat-icon>play_circle_outline</mat-icon>\n </button>\n <button (click)=\"playStopAction?.perform()\" [disabled]=\"playStopAction?.disabled\"\n [style.color]=\"playStopAction?.disabled ? 'grey' : 'yellow'\">\n <mat-icon>stop</mat-icon>\n </button>&nbsp;\n <mat-checkbox #autoplaySelectionCheckbox (change)=\"autoPlaySelectionChange($event)\">Autoplay on select\n </mat-checkbox>\n </fieldset>\n <fieldset>\n\n <legend>Zoom</legend>\n <button (click)=\"zoomFitToPanelAction?.perform()\"\n [disabled]=\"zoomFitToPanelAction?.disabled\">{{zoomFitToPanelAction?.name}}</button>\n <button (click)=\"zoomOutAction?.perform()\"\n [disabled]=\"zoomOutAction?.disabled\">{{zoomOutAction?.name}}</button>\n <button (click)=\"zoomInAction?.perform()\"\n [disabled]=\"zoomInAction?.disabled\">{{zoomInAction?.name}}</button>\n <button (click)=\"zoomSelectedAction?.perform()\"\n [disabled]=\"zoomSelectedAction?.disabled\">{{zoomSelectedAction?.name}}</button>\n </fieldset>\n <fieldset>\n <legend>Selection</legend>\n {{audioClip?.selection?.leftFrame}} <span\n *ngIf=\"audioClip?.selection\">to</span> {{audioClip?.selection?.rightFrame}}\n <button (click)=\"clearSelection()\" [disabled]=\"audioClip?.selection==null\"\n [style.color]=\"hasSelection() ? 'red' : 'grey'\" matTooltip=\"Clear selection\">\n <mat-icon>clear</mat-icon>\n </button>\n\n </fieldset>\n </div>", isInline: true, styles: [":host {\n flex: 0;\n\n }"], components: [{ type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2__namespace$1.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], directives: [{ type: i3__namespace.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
5688
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: AudioDisplayControl, decorators: [{
5260
5689
  type: i0.Component,
5261
5690
  args: [{
5262
5691
  selector: 'audio-display-control',
@@ -5366,9 +5795,9 @@
5366
5795
  };
5367
5796
  return AudioDisplay;
5368
5797
  }());
5369
- AudioDisplay.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AudioDisplay, deps: [{ token: i1__namespace$1.ActivatedRoute }, { token: i0__namespace.ChangeDetectorRef }, { token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
5370
- AudioDisplay.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", 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__namespace, template: "\n\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\n\n <audio-display-control [audioClip]=\"audioClip\"\n [playStartAction]=\"playStartAction\"\n [playSelectionAction]=\"playSelectionAction\"\n [playStopAction]=\"playStopAction\"\n [autoPlayOnSelectToggleAction]=\"autoPlayOnSelectToggleAction\"\n [zoomInAction]=\"zoomInAction\"\n [zoomOutAction]=\"zoomOutAction\"\n [zoomSelectedAction]=\"zoomSelectedAction\"\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control>\n ", isInline: true, styles: [":host {\n display: flex;\n flex-direction: column;\n position: absolute;\n bottom: 0px;\n height: 100%;\n width: 100%;\n overflow: hidden;\n padding: 20px;\n z-index: 5;\n box-sizing: border-box;\n background-color: rgba(230, 230, 230, 1.0)\n }", "\n legend{\n margin-left: 1em; padding: 0.2em 0.8em;font-size: 0.8em;\n }", "\n fieldset{\n border: 1px darkgray solid\n }\n "], components: [{ type: AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: ["audioClip"], outputs: ["zoomInAction", "zoomOutAction", "zoomSelectedAction", "zoomFitToPanelAction"] }, { type: AudioDisplayControl, selector: "audio-display-control", inputs: ["audioClip", "playStartAction", "playSelectionAction", "playStopAction", "zoomInAction", "zoomOutAction", "zoomFitToPanelAction", "zoomSelectedAction", "autoPlayOnSelectToggleAction"] }] });
5371
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AudioDisplay, decorators: [{
5798
+ AudioDisplay.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: AudioDisplay, deps: [{ token: i1__namespace$1.ActivatedRoute }, { token: i0__namespace.ChangeDetectorRef }, { token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
5799
+ AudioDisplay.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", 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__namespace, template: "\n\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\n\n <audio-display-control [audioClip]=\"audioClip\"\n [playStartAction]=\"playStartAction\"\n [playSelectionAction]=\"playSelectionAction\"\n [playStopAction]=\"playStopAction\"\n [autoPlayOnSelectToggleAction]=\"autoPlayOnSelectToggleAction\"\n [zoomInAction]=\"zoomInAction\"\n [zoomOutAction]=\"zoomOutAction\"\n [zoomSelectedAction]=\"zoomSelectedAction\"\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control>\n ", isInline: true, styles: [":host {\n display: flex;\n flex-direction: column;\n position: absolute;\n bottom: 0px;\n height: 100%;\n width: 100%;\n overflow: hidden;\n padding: 20px;\n z-index: 5;\n box-sizing: border-box;\n background-color: rgba(230, 230, 230, 1.0)\n }", "\n legend{\n margin-left: 1em; padding: 0.2em 0.8em;font-size: 0.8em;\n }", "\n fieldset{\n border: 1px darkgray solid\n }\n "], components: [{ type: AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: ["audioClip"], outputs: ["zoomInAction", "zoomOutAction", "zoomSelectedAction", "zoomFitToPanelAction"] }, { type: AudioDisplayControl, selector: "audio-display-control", inputs: ["audioClip", "playStartAction", "playSelectionAction", "playStopAction", "zoomInAction", "zoomOutAction", "zoomFitToPanelAction", "zoomSelectedAction", "autoPlayOnSelectToggleAction"] }] });
5800
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: AudioDisplay, decorators: [{
5372
5801
  type: i0.Component,
5373
5802
  args: [{
5374
5803
  selector: 'app-audiodisplay',
@@ -5409,9 +5838,9 @@
5409
5838
  });
5410
5839
  return ScrollIntoViewDirective;
5411
5840
  }());
5412
- ScrollIntoViewDirective.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ScrollIntoViewDirective, deps: [{ token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Directive });
5413
- ScrollIntoViewDirective.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.5", type: ScrollIntoViewDirective, selector: "[scrollIntoViewToBottom]", inputs: { scrollIntoViewToBottom: "scrollIntoViewToBottom" }, ngImport: i0__namespace });
5414
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ScrollIntoViewDirective, decorators: [{
5841
+ ScrollIntoViewDirective.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: ScrollIntoViewDirective, deps: [{ token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Directive });
5842
+ ScrollIntoViewDirective.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.10", type: ScrollIntoViewDirective, selector: "[scrollIntoViewToBottom]", inputs: { scrollIntoViewToBottom: "scrollIntoViewToBottom" }, ngImport: i0__namespace });
5843
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: ScrollIntoViewDirective, decorators: [{
5415
5844
  type: i0.Directive,
5416
5845
  args: [{
5417
5846
  selector: "[scrollIntoViewToBottom]"
@@ -5458,9 +5887,9 @@
5458
5887
  });
5459
5888
  return Progress;
5460
5889
  }());
5461
- Progress.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: Progress, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
5462
- Progress.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: Progress, selector: "app-sprprogress", inputs: { items: "items", selectedItemIdx: "selectedItemIdx", enableDownload: "enableDownload" }, outputs: { onRowSelect: "onRowSelect", rowSelect: "rowSelect", onShowDoneAction: "onShowDoneAction", clickDone: "clickDone", onDownloadDoneAction: "onDownloadDoneAction", clickDownloadDone: "clickDownloadDone" }, ngImport: i0__namespace, template: "\n\n <table class=\"mat-typography\">\n <thead>\n <tr>\n <th>#</th><!--<th>Code</th>-->\n <th>Prompt</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngIf=\"items\">\n\n <tr *ngFor=\"let item of items; let itIdx=index;\"\n (click)=\"rowSelect=itIdx\" [class.selRow]=\"itIdx===selectedItemIdx\"\n [scrollIntoViewToBottom]=\"itIdx===selectedItemIdx\">\n <td>{{itIdx}}</td>\n <td class=\"promptDescriptor\">{{item.promptAsString}}</td>\n <td>\n <mat-icon *ngIf=\"item.recs && item.recs.length>0\">done</mat-icon>\n\n </td>\n </tr>\n </ng-container>\n\n </tbody>\n </table>\n ", isInline: true, styles: [":host {\n overflow-x: hidden;\n overflow-y: scroll;\n padding: 10pt;\n /*flex: 0.1 0 300px; \n min-width: 300px; */\n flex: 0.1 0 content;\n background: white;\n /* Workaround for Firefox\n If the progress table gets long (script with many items) FF increases the height of the overflow progressContainer and\n the whole app does not fit into the page anymore. The app overflows and shows a vertical scrollbar for the whole app.\n See http://stackoverflow.com/questions/28636832/firefox-overflow-y-not-working-with-nested-flexbox\n */\n /* min-height:0px; */\n min-height: 1px;\n }", "table {\n min-height: 1px;\n border-collapse: collapse;\n /* Tables do not have a natural min size */\n /*min-width: 300px; */\n \n }\n\n table, th, td {\n border: 1px solid lightgrey;\n padding: 0.5em;\n \n }\n\n ", "\n .selRow {\n background: lightblue;\n }\n ", ".promptDescriptor{\n \n max-width: 200px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }"], components: [{ type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: ScrollIntoViewDirective, selector: "[scrollIntoViewToBottom]", inputs: ["scrollIntoViewToBottom"] }] });
5463
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: Progress, decorators: [{
5890
+ Progress.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: Progress, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
5891
+ Progress.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: Progress, selector: "app-sprprogress", inputs: { items: "items", selectedItemIdx: "selectedItemIdx", enableDownload: "enableDownload" }, outputs: { onRowSelect: "onRowSelect", rowSelect: "rowSelect", onShowDoneAction: "onShowDoneAction", clickDone: "clickDone", onDownloadDoneAction: "onDownloadDoneAction", clickDownloadDone: "clickDownloadDone" }, ngImport: i0__namespace, template: "\n\n <table class=\"mat-typography\">\n <thead>\n <tr>\n <th>#</th><!--<th>Code</th>-->\n <th>Prompt</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngIf=\"items\">\n\n <tr *ngFor=\"let item of items; let itIdx=index;\"\n (click)=\"rowSelect=itIdx\" [class.selRow]=\"itIdx===selectedItemIdx\"\n [scrollIntoViewToBottom]=\"itIdx===selectedItemIdx\">\n <td>{{itIdx}}</td>\n <td class=\"promptDescriptor\">{{item.promptAsString}}</td>\n <td>\n <mat-icon *ngIf=\"item.recs && item.recs.length>0\">done</mat-icon>\n\n </td>\n </tr>\n </ng-container>\n\n </tbody>\n </table>\n ", isInline: true, styles: [":host {\n overflow-x: hidden;\n overflow-y: scroll;\n padding: 10pt;\n /*flex: 0.1 0 300px; \n min-width: 300px; */\n flex: 0.1 0 content;\n background: white;\n /* Workaround for Firefox\n If the progress table gets long (script with many items) FF increases the height of the overflow progressContainer and\n the whole app does not fit into the page anymore. The app overflows and shows a vertical scrollbar for the whole app.\n See http://stackoverflow.com/questions/28636832/firefox-overflow-y-not-working-with-nested-flexbox\n */\n /* min-height:0px; */\n min-height: 1px;\n }", "table {\n min-height: 1px;\n border-collapse: collapse;\n /* Tables do not have a natural min size */\n /*min-width: 300px; */\n \n }\n\n table, th, td {\n border: 1px solid lightgrey;\n padding: 0.5em;\n \n }\n\n ", "\n .selRow {\n background: lightblue;\n }\n ", ".promptDescriptor{\n \n max-width: 200px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }"], components: [{ type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: ScrollIntoViewDirective, selector: "[scrollIntoViewToBottom]", inputs: ["scrollIntoViewToBottom"] }] });
5892
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: Progress, decorators: [{
5464
5893
  type: i0.Component,
5465
5894
  args: [{
5466
5895
  selector: 'app-sprprogress',
@@ -5503,9 +5932,9 @@
5503
5932
  };
5504
5933
  return Recinstructions;
5505
5934
  }());
5506
- Recinstructions.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: Recinstructions, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
5507
- Recinstructions.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: Recinstructions, selector: "spr-recinstructions", inputs: { recinstructions: "recinstructions", selectedItemIdx: "selectedItemIdx", itemCount: "itemCount" }, ngImport: i0__namespace, template: "\n\n {{displayText()}}\n ", isInline: true, styles: [":host {\n\n justify-content: left; /* align horizontal center */\n align-items: flex-start; /* align vertical center */\n background: white;\n text-align: left;\n font-size: 1em;\n flex: 0;\n width: 100%;\n }\n "] });
5508
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: Recinstructions, decorators: [{
5935
+ Recinstructions.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: Recinstructions, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
5936
+ Recinstructions.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: Recinstructions, selector: "spr-recinstructions", inputs: { recinstructions: "recinstructions", selectedItemIdx: "selectedItemIdx", itemCount: "itemCount" }, ngImport: i0__namespace, template: "\n\n {{displayText()}}\n ", isInline: true, styles: [":host {\n\n justify-content: left; /* align horizontal center */\n align-items: flex-start; /* align vertical center */\n background: white;\n text-align: left;\n font-size: 1em;\n flex: 0;\n width: 100%;\n }\n "] });
5937
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: Recinstructions, decorators: [{
5509
5938
  type: i0.Component,
5510
5939
  args: [{
5511
5940
  selector: 'spr-recinstructions',
@@ -5693,9 +6122,9 @@
5693
6122
  });
5694
6123
  return Prompter;
5695
6124
  }());
5696
- Prompter.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: Prompter, deps: [{ token: i0__namespace.ElementRef }, { token: i0__namespace.Renderer2 }, { token: ProjectService }], target: i0__namespace.ɵɵFactoryTarget.Component });
5697
- Prompter.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: Prompter, selector: "app-sprprompter", inputs: { projectName: "projectName", prompterHeight: "prompterHeight", promptMediaItems: "promptMediaItems" }, host: { properties: { "class.fill": "this.prompterStyleFill" } }, ngImport: i0__namespace, template: "\n\n <!--<ng-template [ngIf]=\"text\">{{text}}</ng-template>-->\n <!-- <img *ngIf=\"src\" #promptImage [src]=\"srcUrl()\" [height]=\"prompterHeight-20\" /> -->\n ", isInline: true, styles: [":host {\n\n justify-content: center; /* align horizontal center */\n align-items: center; /* align vertical center */\n background: white;\n text-align: center;\n /* font-size: 2em; */\n line-height: 1.2em;\n font-weight: bold;\n /* Use only natural size of the prompt */\n /* The prompter compnent then ets aligned vertically centered */\n flex: 0 1;\n\n }", ":host(.fill) {\n /* Use all space to scale images */\n flex: 3;\n width: 100%;\n height: 100%;\n max-height: 100%;\n max-width: 100%;\n /* A separate flex container might be necessayr to alighn centered */\n vertical-align: middle; /* TODO does not work, image is not vertically centered */\n }"] });
5698
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: Prompter, decorators: [{
6125
+ Prompter.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: Prompter, deps: [{ token: i0__namespace.ElementRef }, { token: i0__namespace.Renderer2 }, { token: ProjectService }], target: i0__namespace.ɵɵFactoryTarget.Component });
6126
+ Prompter.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: Prompter, selector: "app-sprprompter", inputs: { projectName: "projectName", prompterHeight: "prompterHeight", promptMediaItems: "promptMediaItems" }, host: { properties: { "class.fill": "this.prompterStyleFill" } }, ngImport: i0__namespace, template: "\n\n <!--<ng-template [ngIf]=\"text\">{{text}}</ng-template>-->\n <!-- <img *ngIf=\"src\" #promptImage [src]=\"srcUrl()\" [height]=\"prompterHeight-20\" /> -->\n ", isInline: true, styles: [":host {\n\n justify-content: center; /* align horizontal center */\n align-items: center; /* align vertical center */\n background: white;\n text-align: center;\n /* font-size: 2em; */\n line-height: 1.2em;\n font-weight: bold;\n /* Use only natural size of the prompt */\n /* The prompter compnent then ets aligned vertically centered */\n flex: 0 1;\n\n }", ":host(.fill) {\n /* Use all space to scale images */\n flex: 3;\n width: 100%;\n height: 100%;\n max-height: 100%;\n max-width: 100%;\n /* A separate flex container might be necessayr to alighn centered */\n vertical-align: middle; /* TODO does not work, image is not vertically centered */\n }"] });
6127
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: Prompter, decorators: [{
5699
6128
  type: i0.Component,
5700
6129
  args: [{
5701
6130
  selector: 'app-sprprompter',
@@ -5850,9 +6279,9 @@
5850
6279
  };
5851
6280
  return PromptContainer;
5852
6281
  }());
5853
- PromptContainer.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: PromptContainer, deps: [{ token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
5854
- PromptContainer.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: PromptContainer, selector: "app-sprpromptcontainer", inputs: { projectName: "projectName", mediaitems: "mediaitems" }, host: { listeners: { "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "prompter", first: true, predicate: Prompter, descendants: true, static: true }], ngImport: i0__namespace, template: "\n <app-sprprompter #prompter [projectName]=\"projectName\" [promptMediaItems]=\"mediaitems\" [style.font-size]=\"fontSize+'px'\" [style.visibility]=\"prDisplay\" [prompterHeight]=\"prompterHeight\"></app-sprprompter>\n ", isInline: true, styles: [":host {\n\n flex: 3; /* the container consumes all available space */\n padding: 10pt;\n height: 100%;\n max-height: 100%;\n\n justify-content: center; /* align horizontal center*/\n align-items: center; /* align vertical center */\n background: white;\n text-align: center;\n display: flex;\n flex-direction: column;\n min-height: 0px;\n width: 100%;\n }\n "], components: [{ type: Prompter, selector: "app-sprprompter", inputs: ["projectName", "prompterHeight", "promptMediaItems"] }] });
5855
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: PromptContainer, decorators: [{
6282
+ PromptContainer.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: PromptContainer, deps: [{ token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
6283
+ PromptContainer.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: PromptContainer, selector: "app-sprpromptcontainer", inputs: { projectName: "projectName", mediaitems: "mediaitems" }, host: { listeners: { "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "prompter", first: true, predicate: Prompter, descendants: true, static: true }], ngImport: i0__namespace, template: "\n <app-sprprompter #prompter [projectName]=\"projectName\" [promptMediaItems]=\"mediaitems\" [style.font-size]=\"fontSize+'px'\" [style.visibility]=\"prDisplay\" [prompterHeight]=\"prompterHeight\"></app-sprprompter>\n ", isInline: true, styles: [":host {\n\n flex: 3; /* the container consumes all available space */\n padding: 10pt;\n height: 100%;\n max-height: 100%;\n\n justify-content: center; /* align horizontal center*/\n align-items: center; /* align vertical center */\n background: white;\n text-align: center;\n display: flex;\n flex-direction: column;\n min-height: 0px;\n width: 100%;\n }\n "], components: [{ type: Prompter, selector: "app-sprprompter", inputs: ["projectName", "prompterHeight", "promptMediaItems"] }] });
6284
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: PromptContainer, decorators: [{
5856
6285
  type: i0.Component,
5857
6286
  args: [{
5858
6287
  selector: 'app-sprpromptcontainer',
@@ -5978,9 +6407,9 @@
5978
6407
  };
5979
6408
  return PromptingContainer;
5980
6409
  }());
5981
- PromptingContainer.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: PromptingContainer, deps: [{ token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
5982
- PromptingContainer.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: PromptingContainer, selector: "app-sprpromptingcontainer", inputs: { projectName: "projectName", promptItem: "promptItem", showPrompt: "showPrompt", selectedItemIdx: "selectedItemIdx", itemCount: "itemCount", transportActions: "transportActions" }, host: { listeners: { "touchstart": "onTouchstart($event)", "touchend": "onTouchEnd($event)", "touchmove": "onTouchMove($event)", "touchcancel": "onTouchCancel($event)" } }, ngImport: i0__namespace, template: "\n <spr-recinstructions [selectedItemIdx]=\"selectedItemIdx\" [itemCount]=\"itemCount\"\n [recinstructions]=\"promptItem?.recinstructions?.recinstructions\"></spr-recinstructions>\n <app-sprpromptcontainer [projectName]=\"projectName\"\n [mediaitems]=\"showPrompt?(promptItem?promptItem.mediaitems:null):null\"></app-sprpromptcontainer>\n\n ", isInline: true, styles: [":host {\n position: relative;\n flex: 3; /* the container consumes all available space */\n padding: 10pt;\n justify-content: center; /* align horizontal center*/\n align-items: center; /* align vertical center */\n background: white;\n text-align: center;\n display: flex;\n flex-direction: column;\n min-height: 0px;\n }\n "], components: [{ type: Recinstructions, selector: "spr-recinstructions", inputs: ["recinstructions", "selectedItemIdx", "itemCount"] }, { type: PromptContainer, selector: "app-sprpromptcontainer", inputs: ["projectName", "mediaitems"] }] });
5983
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: PromptingContainer, decorators: [{
6410
+ PromptingContainer.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: PromptingContainer, deps: [{ token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
6411
+ PromptingContainer.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: PromptingContainer, selector: "app-sprpromptingcontainer", inputs: { projectName: "projectName", promptItem: "promptItem", showPrompt: "showPrompt", selectedItemIdx: "selectedItemIdx", itemCount: "itemCount", transportActions: "transportActions" }, host: { listeners: { "touchstart": "onTouchstart($event)", "touchend": "onTouchEnd($event)", "touchmove": "onTouchMove($event)", "touchcancel": "onTouchCancel($event)" } }, ngImport: i0__namespace, template: "\n <spr-recinstructions [selectedItemIdx]=\"selectedItemIdx\" [itemCount]=\"itemCount\"\n [recinstructions]=\"promptItem?.recinstructions?.recinstructions\"></spr-recinstructions>\n <app-sprpromptcontainer [projectName]=\"projectName\"\n [mediaitems]=\"showPrompt?(promptItem?promptItem.mediaitems:null):null\"></app-sprpromptcontainer>\n\n ", isInline: true, styles: [":host {\n position: relative;\n flex: 3; /* the container consumes all available space */\n padding: 10pt;\n justify-content: center; /* align horizontal center*/\n align-items: center; /* align vertical center */\n background: white;\n text-align: center;\n display: flex;\n flex-direction: column;\n min-height: 0px;\n }\n "], components: [{ type: Recinstructions, selector: "spr-recinstructions", inputs: ["recinstructions", "selectedItemIdx", "itemCount"] }, { type: PromptContainer, selector: "app-sprpromptcontainer", inputs: ["projectName", "mediaitems"] }] });
6412
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: PromptingContainer, decorators: [{
5984
6413
  type: i0.Component,
5985
6414
  args: [{
5986
6415
  selector: 'app-sprpromptingcontainer',
@@ -6035,9 +6464,9 @@
6035
6464
  };
6036
6465
  return Prompting;
6037
6466
  }());
6038
- Prompting.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: Prompting, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
6039
- Prompting.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", 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 }], ngImport: i0__namespace, template: "\n\n <app-simpletrafficlight [status]=\"startStopSignalState\"></app-simpletrafficlight>\n <app-sprpromptingcontainer [projectName]=\"projectName\" [promptItem]=\"promptItem\" [showPrompt]=\"showPrompt\"\n [itemCount]=\"items?.length\" [selectedItemIdx]=\"selectedItemIdx\"\n [transportActions]=\"transportActions\"></app-sprpromptingcontainer>\n <app-sprprogress fxHide.xs [items]=\"items\" [selectedItemIdx]=\"selectedItemIdx\"\n (onRowSelect)=\"itemSelect($event)\"></app-sprprogress>\n <div #asCt [class.active]=\"!audioSignalCollapsed\">\n\n <app-audiodisplay #audioSignalContainer [class.active]=\"!audioSignalCollapsed\"\n [audioClip]=\"displayAudioClip\"\n [playStartAction]=\"playStartAction\"\n [playSelectionAction]=\"playSelectionAction\"\n [autoPlayOnSelectToggleAction]=\"autoPlayOnSelectToggleAction\"\n [playStopAction]=\"playStopAction\"></app-audiodisplay>\n\n\n </div>\n\n\n\n ", isInline: true, styles: [":host {\n position: relative;\n margin: 0;\n padding: 0;\n background: lightgrey;\n width: 100%; /* use all horizontal available space */\n flex: 1; /* ... and fill rest of vertical available space (other components have flex 0) */\n\n /* Workaround for Firefox\n If the progress table gets long (script with many items) FF increases the height of the overflow progressContainer and\n the whole app does not fit into the page anymore. The app overflows and shows a vertical scrollbar for the whole app.\n See http://stackoverflow.com/questions/28636832/firefox-overflow-y-not-working-with-nested-flexbox\n */\n min-height: 0px;\n\n display: flex; /* flex container: left traffic light, right prompter (container) */\n flex-direction: row;\n flex-wrap: nowrap; /* wrap could completely destroy the layout */\n }", "\n app-simpletrafficlight {\n margin: 10px;\n min-height: 0px;\n z-index: 3;\n }\n ", "\n app-sprprogress {\n z-index: 3;\n }\n ", "\n div {\n display: none;\n position: absolute;\n\n\n /* height: 50%; */\n /* width: 100%; */\n\n /* overflow: hidden; */\n\n /* margin: 20px; */\n /* border: 20px; */\n z-index: 5;\n /*background-color: red; */\n }", "\n div.active {\n display: flex;\n position: absolute;\n bottom: 0px;\n /*left: 0px; */\n\n height: 90%;\n width: 100%;\n\n overflow: hidden;\n\n padding: 0px;\n /* margin: 20px; */\n /* border: 20px; */\n z-index: 5;\n box-sizing: border-box;\n background-color: rgba(0, 0, 0, 0)\n\n }"], components: [{ type: SimpleTrafficLight, selector: "app-simpletrafficlight", inputs: ["status"] }, { type: PromptingContainer, selector: "app-sprpromptingcontainer", inputs: ["projectName", "promptItem", "showPrompt", "selectedItemIdx", "itemCount", "transportActions"] }, { type: Progress, selector: "app-sprprogress", inputs: ["items", "selectedItemIdx", "enableDownload"], outputs: ["onRowSelect", "rowSelect", "onShowDoneAction", "clickDone", "onDownloadDoneAction", "clickDownloadDone"] }, { type: AudioDisplay, selector: "app-audiodisplay", inputs: ["playStartAction", "playStopAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "audioData", "audioClip"] }], directives: [{ type: i6__namespace.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"] }] });
6040
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: Prompting, decorators: [{
6467
+ Prompting.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: Prompting, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
6468
+ Prompting.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", 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 }], ngImport: i0__namespace, template: "\n\n <app-simpletrafficlight [status]=\"startStopSignalState\"></app-simpletrafficlight>\n <app-sprpromptingcontainer [projectName]=\"projectName\" [promptItem]=\"promptItem\" [showPrompt]=\"showPrompt\"\n [itemCount]=\"items?.length\" [selectedItemIdx]=\"selectedItemIdx\"\n [transportActions]=\"transportActions\"></app-sprpromptingcontainer>\n <app-sprprogress fxHide.xs [items]=\"items\" [selectedItemIdx]=\"selectedItemIdx\"\n (onRowSelect)=\"itemSelect($event)\"></app-sprprogress>\n <div #asCt [class.active]=\"!audioSignalCollapsed\">\n\n <app-audiodisplay #audioSignalContainer [class.active]=\"!audioSignalCollapsed\"\n [audioClip]=\"displayAudioClip\"\n [playStartAction]=\"playStartAction\"\n [playSelectionAction]=\"playSelectionAction\"\n [autoPlayOnSelectToggleAction]=\"autoPlayOnSelectToggleAction\"\n [playStopAction]=\"playStopAction\"></app-audiodisplay>\n\n\n </div>\n\n\n\n ", isInline: true, styles: [":host {\n position: relative;\n margin: 0;\n padding: 0;\n background: lightgrey;\n width: 100%; /* use all horizontal available space */\n flex: 1; /* ... and fill rest of vertical available space (other components have flex 0) */\n\n /* Workaround for Firefox\n If the progress table gets long (script with many items) FF increases the height of the overflow progressContainer and\n the whole app does not fit into the page anymore. The app overflows and shows a vertical scrollbar for the whole app.\n See http://stackoverflow.com/questions/28636832/firefox-overflow-y-not-working-with-nested-flexbox\n */\n min-height: 0px;\n\n display: flex; /* flex container: left traffic light, right prompter (container) */\n flex-direction: row;\n flex-wrap: nowrap; /* wrap could completely destroy the layout */\n }", "\n app-simpletrafficlight {\n margin: 10px;\n min-height: 0px;\n z-index: 3;\n }\n ", "\n app-sprprogress {\n z-index: 3;\n }\n ", "\n div {\n display: none;\n position: absolute;\n\n\n /* height: 50%; */\n /* width: 100%; */\n\n /* overflow: hidden; */\n\n /* margin: 20px; */\n /* border: 20px; */\n z-index: 5;\n /*background-color: red; */\n }", "\n div.active {\n display: flex;\n position: absolute;\n bottom: 0px;\n /*left: 0px; */\n\n height: 90%;\n width: 100%;\n\n overflow: hidden;\n\n padding: 0px;\n /* margin: 20px; */\n /* border: 20px; */\n z-index: 5;\n box-sizing: border-box;\n background-color: rgba(0, 0, 0, 0)\n\n }"], components: [{ type: SimpleTrafficLight, selector: "app-simpletrafficlight", inputs: ["status"] }, { type: PromptingContainer, selector: "app-sprpromptingcontainer", inputs: ["projectName", "promptItem", "showPrompt", "selectedItemIdx", "itemCount", "transportActions"] }, { type: Progress, selector: "app-sprprogress", inputs: ["items", "selectedItemIdx", "enableDownload"], outputs: ["onRowSelect", "rowSelect", "onShowDoneAction", "clickDone", "onDownloadDoneAction", "clickDownloadDone"] }, { type: AudioDisplay, selector: "app-audiodisplay", inputs: ["playStartAction", "playStopAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "audioData", "audioClip"] }], directives: [{ type: i6__namespace.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"] }] });
6469
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: Prompting, decorators: [{
6041
6470
  type: i0.Component,
6042
6471
  args: [{
6043
6472
  selector: 'app-sprprompting',
@@ -6132,12 +6561,13 @@
6132
6561
  toFill = avail;
6133
6562
  }
6134
6563
  var sliceEnd = copied + toFill;
6135
- for (var ch = 0; ch < this._channels; ch++) {
6136
- var cpPrt = buffers[ch].slice(copied, sliceEnd);
6137
- var prtLen = cpPrt.length;
6138
- var buf = this.bufs[ch];
6139
- var bufLen = buf.length;
6140
- buf.set(cpPrt, this.filled);
6564
+ // Firefox on Android sends only the first channel
6565
+ for (var ch = 0; ch < buffersLen; ch++) {
6566
+ if (buffers[ch]) {
6567
+ var cpPrt = buffers[ch].slice(copied, sliceEnd);
6568
+ var buf = this.bufs[ch];
6569
+ buf.set(cpPrt, this.filled);
6570
+ }
6141
6571
  }
6142
6572
  copied += toFill;
6143
6573
  avail -= toFill;
@@ -6198,9 +6628,9 @@
6198
6628
  }
6199
6629
  return StatusDisplay;
6200
6630
  }());
6201
- StatusDisplay.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StatusDisplay, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
6202
- StatusDisplay.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: StatusDisplay, selector: "app-sprstatusdisplay", inputs: { statusAlertType: "statusAlertType", statusMsg: "statusMsg", statusWaiting: "statusWaiting" }, ngImport: i0__namespace, template: "\n <p matTooltip=\"Status\">\n <mat-progress-spinner *ngIf=\"statusWaiting\" color=\"black\" mode=\"indeterminate\" [diameter]=\"30\" [strokeWidth]=\"5\"></mat-progress-spinner><mat-icon *ngIf=\"statusAlertType==='error'\" style=\"color:red\">report_problem</mat-icon>\n {{statusMsg}}\n </p>\n ", isInline: true, styles: [":host {\n flex: 1;\n /* align-self: flex-start; */\n display: inline;\n text-align: left;\n font-size: smaller;\n }", "\n p {\n white-space:nowrap;\n display: inline-block;\n }\n ", "\n mat-progress-spinner {\n color: black;\n display: inline-block;\n }\n ", "\n span {\n color: red;\n }\n "], components: [{ type: i1__namespace$2.MatProgressSpinner, selector: "mat-progress-spinner", inputs: ["color", "mode", "diameter", "strokeWidth", "value"], exportAs: ["matProgressSpinner"] }, { type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i3__namespace.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
6203
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: StatusDisplay, decorators: [{
6631
+ StatusDisplay.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: StatusDisplay, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
6632
+ StatusDisplay.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: StatusDisplay, selector: "app-sprstatusdisplay", inputs: { statusAlertType: "statusAlertType", statusMsg: "statusMsg", statusWaiting: "statusWaiting" }, ngImport: i0__namespace, template: "\n <p matTooltip=\"Status\">\n <mat-progress-spinner *ngIf=\"statusWaiting\" color=\"black\" mode=\"indeterminate\" [diameter]=\"30\" [strokeWidth]=\"5\"></mat-progress-spinner><mat-icon *ngIf=\"statusAlertType==='error'\" style=\"color:red\">report_problem</mat-icon>\n {{statusMsg}}\n </p>\n ", isInline: true, styles: [":host {\n flex: 1;\n /* align-self: flex-start; */\n display: inline;\n text-align: left;\n font-size: smaller;\n }", "\n p {\n white-space:nowrap;\n display: inline-block;\n }\n ", "\n mat-progress-spinner {\n color: black;\n display: inline-block;\n }\n ", "\n span {\n color: red;\n }\n "], components: [{ type: i1__namespace$2.MatProgressSpinner, selector: "mat-progress-spinner", inputs: ["color", "mode", "diameter", "strokeWidth", "value"], exportAs: ["matProgressSpinner"] }, { type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i3__namespace.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
6633
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: StatusDisplay, decorators: [{
6204
6634
  type: i0.Component,
6205
6635
  args: [{
6206
6636
  selector: 'app-sprstatusdisplay',
@@ -6274,9 +6704,9 @@
6274
6704
  });
6275
6705
  return UploadStatus;
6276
6706
  }());
6277
- UploadStatus.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: UploadStatus, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
6278
- UploadStatus.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: UploadStatus, selector: "app-uploadstatus", inputs: { value: "value", awaitNewUpload: "awaitNewUpload", status: "status" }, ngImport: i0__namespace, template: "\n <mat-progress-spinner [mode]=\"spinnerMode\" [color]=\"status\" [diameter]=\"30\" [strokeWidth]=\"5\" [value]=\"_value\" [matTooltip]=\"toolTipText\"></mat-progress-spinner>\n ", isInline: true, styles: [":host {\n flex: 1;\n /* align-self: flex-start; */\n /*display: inline; */\n text-align: left;\n }", "mat-progress-spinner{\n display: inline-block;\n }"], components: [{ type: i1__namespace$2.MatProgressSpinner, selector: "mat-progress-spinner", inputs: ["color", "mode", "diameter", "strokeWidth", "value"], exportAs: ["matProgressSpinner"] }], directives: [{ type: i3__namespace.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
6279
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: UploadStatus, decorators: [{
6707
+ UploadStatus.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: UploadStatus, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
6708
+ UploadStatus.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: UploadStatus, selector: "app-uploadstatus", inputs: { value: "value", awaitNewUpload: "awaitNewUpload", status: "status" }, ngImport: i0__namespace, template: "\n <mat-progress-spinner [mode]=\"spinnerMode\" [color]=\"status\" [diameter]=\"30\" [strokeWidth]=\"5\" [value]=\"_value\" [matTooltip]=\"toolTipText\"></mat-progress-spinner>\n ", isInline: true, styles: [":host {\n flex: 1;\n /* align-self: flex-start; */\n /*display: inline; */\n text-align: left;\n }", "mat-progress-spinner{\n display: inline-block;\n }"], components: [{ type: i1__namespace$2.MatProgressSpinner, selector: "mat-progress-spinner", inputs: ["color", "mode", "diameter", "strokeWidth", "value"], exportAs: ["matProgressSpinner"] }], directives: [{ type: i3__namespace.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
6709
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: UploadStatus, decorators: [{
6280
6710
  type: i0.Component,
6281
6711
  args: [{
6282
6712
  selector: 'app-uploadstatus',
@@ -6296,9 +6726,9 @@
6296
6726
  }
6297
6727
  return ProgressDisplay;
6298
6728
  }());
6299
- ProgressDisplay.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ProgressDisplay, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
6300
- ProgressDisplay.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ProgressDisplay, selector: "app-sprprogressdisplay", ngImport: i0__namespace, template: "\n <p>{{progressMsg}}</p>\n ", isInline: true, styles: [":host {\n flex: 1;\n /* align-self: flex-start; */\n /*display: inline; */\n width: 100%;\n text-align: left;\n }"] });
6301
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ProgressDisplay, decorators: [{
6729
+ ProgressDisplay.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: ProgressDisplay, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
6730
+ ProgressDisplay.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: ProgressDisplay, selector: "app-sprprogressdisplay", ngImport: i0__namespace, template: "\n <p>{{progressMsg}}</p>\n ", isInline: true, styles: [":host {\n flex: 1;\n /* align-self: flex-start; */\n /*display: inline; */\n width: 100%;\n text-align: left;\n }"] });
6731
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: ProgressDisplay, decorators: [{
6302
6732
  type: i0.Component,
6303
6733
  args: [{
6304
6734
  selector: 'app-sprprogressdisplay',
@@ -6391,9 +6821,9 @@
6391
6821
  };
6392
6822
  return TransportPanel;
6393
6823
  }());
6394
- TransportPanel.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: TransportPanel, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
6395
- TransportPanel.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: TransportPanel, selector: "app-sprtransport", inputs: { readonly: "readonly", actions: "actions", navigationEnabled: "navigationEnabled" }, ngImport: i0__namespace, template: "\n <button id=\"bwdBtn\" *ngIf=\"navigationEnabled\" (click)=\"actions.bwdAction.perform()\" [disabled]=\"bwdDisabled()\"\n mat-raised-button>\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button (click)=\"startStopNextPerform()\" [disabled]=\"startDisabled() && stopDisabled() && nextDisabled()\" mat-raised-button>\n <mat-icon [style.color]=\"startStopNextIconColor()\">{{startStopNextIconName()}}</mat-icon><mat-icon *ngIf=\"!nextDisabled()\" [style.color]=\"nextDisabled() ? 'grey' : 'black'\">chevron_right</mat-icon>\n <span fxShow.xs=\"false\">{{startStopNextName()}}</span>\n </button>\n <button (click)=\"actions.pauseAction.perform()\" [disabled]=\"pauseDisabled()\" mat-raised-button>\n <mat-icon>pause</mat-icon>\n <span fxShow.xs=\"false\">Pause</span>\n </button>\n <button id=\"fwdNextBtn\" *ngIf=\"navigationEnabled\" fxHide.xs (click)=\"actions.fwdNextAction.perform()\" [disabled]=\"fwdNextDisabled()\" mat-raised-button>\n <mat-icon>redo</mat-icon>\n </button>\n <button id=\"fwdBtn\" *ngIf=\"navigationEnabled\" (click)=\"actions.fwdAction.perform()\" [disabled]=\"fwdDisabled()\" mat-raised-button>\n <mat-icon>chevron_right</mat-icon>\n </button>\n\n ", isInline: true, styles: [":host {\n flex: 20;\n align-self: center;\n width: 100%;\n text-align: center;\n align-content: center;\n margin: 0;\n }", "\n div {\n display: inline;\n flex: 0;\n }"], components: [{ type: i3__namespace$1.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__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6__namespace.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"] }] });
6396
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: TransportPanel, decorators: [{
6824
+ TransportPanel.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: TransportPanel, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
6825
+ TransportPanel.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: TransportPanel, selector: "app-sprtransport", inputs: { readonly: "readonly", actions: "actions", navigationEnabled: "navigationEnabled" }, ngImport: i0__namespace, template: "\n <button id=\"bwdBtn\" *ngIf=\"navigationEnabled\" (click)=\"actions.bwdAction.perform()\" [disabled]=\"bwdDisabled()\"\n mat-raised-button>\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button (click)=\"startStopNextPerform()\" [disabled]=\"startDisabled() && stopDisabled() && nextDisabled()\" mat-raised-button>\n <mat-icon [style.color]=\"startStopNextIconColor()\">{{startStopNextIconName()}}</mat-icon><mat-icon *ngIf=\"!nextDisabled()\" [style.color]=\"nextDisabled() ? 'grey' : 'black'\">chevron_right</mat-icon>\n <span fxShow.xs=\"false\">{{startStopNextName()}}</span>\n </button>\n <button (click)=\"actions.pauseAction.perform()\" [disabled]=\"pauseDisabled()\" mat-raised-button>\n <mat-icon>pause</mat-icon>\n <span fxShow.xs=\"false\">Pause</span>\n </button>\n <button id=\"fwdNextBtn\" *ngIf=\"navigationEnabled\" fxHide.xs (click)=\"actions.fwdNextAction.perform()\" [disabled]=\"fwdNextDisabled()\" mat-raised-button>\n <mat-icon>redo</mat-icon>\n </button>\n <button id=\"fwdBtn\" *ngIf=\"navigationEnabled\" (click)=\"actions.fwdAction.perform()\" [disabled]=\"fwdDisabled()\" mat-raised-button>\n <mat-icon>chevron_right</mat-icon>\n </button>\n\n ", isInline: true, styles: [":host {\n flex: 20;\n align-self: center;\n width: 100%;\n text-align: center;\n align-content: center;\n margin: 0;\n }", "\n div {\n display: inline;\n flex: 0;\n }"], components: [{ type: i3__namespace$1.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__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6__namespace.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"] }] });
6826
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: TransportPanel, decorators: [{
6397
6827
  type: i0.Component,
6398
6828
  args: [{
6399
6829
  selector: 'app-sprtransport',
@@ -6431,9 +6861,9 @@
6431
6861
  });
6432
6862
  return ControlPanel;
6433
6863
  }());
6434
- ControlPanel.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ControlPanel, deps: [{ token: i1__namespace$3.MatDialog }], target: i0__namespace.ɵɵFactoryTarget.Component });
6435
- ControlPanel.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", 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 }], ngImport: i0__namespace, template: "\n <app-sprstatusdisplay fxHide.xs [statusMsg]=\"statusMsg\" [statusAlertType]=\"statusAlertType\" [statusWaiting]=\"statusWaiting\"\n class=\"hidden-xs\"></app-sprstatusdisplay>\n\n <app-sprtransport [readonly]=\"readonly\" [actions]=\"transportActions\" [navigationEnabled]=\"navigationEnabled\"></app-sprtransport>\n\n <app-uploadstatus fxHide.xs *ngIf=\"enableUploadRecordings\" [value]=\"uploadProgress\"\n [status]=\"uploadStatus\" [awaitNewUpload]=\"processing\"></app-uploadstatus>\n <mat-icon fxHide.xs [matTooltip]=\"readyStateToolTip\">{{hourGlassIconName}}</mat-icon>\n ", isInline: true, styles: [":host {\n flex: 0; /* only required vertical space */\n /* width: 100%; */ /* available horizontal sace */\n /* display: inline; */\n display: flex; /* Horizontal flex container: Bottom transport panel, above prompting panel */\n flex-direction: row;\n align-content: center;\n align-items: center;\n margin: 0;\n padding: 20px;\n min-height: min-content; /* important */\n }", "\n div {\n flex: 0;\n }\n "], components: [{ type: StatusDisplay, selector: "app-sprstatusdisplay", inputs: ["statusAlertType", "statusMsg", "statusWaiting"] }, { type: TransportPanel, selector: "app-sprtransport", inputs: ["readonly", "actions", "navigationEnabled"] }, { type: UploadStatus, selector: "app-uploadstatus", inputs: ["value", "awaitNewUpload", "status"] }, { type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i6__namespace.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"] }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3__namespace.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
6436
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ControlPanel, decorators: [{
6864
+ ControlPanel.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: ControlPanel, deps: [{ token: i1__namespace$3.MatDialog }], target: i0__namespace.ɵɵFactoryTarget.Component });
6865
+ ControlPanel.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", 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 }], ngImport: i0__namespace, template: "\n <app-sprstatusdisplay fxHide.xs [statusMsg]=\"statusMsg\" [statusAlertType]=\"statusAlertType\" [statusWaiting]=\"statusWaiting\"\n class=\"hidden-xs\"></app-sprstatusdisplay>\n\n <app-sprtransport [readonly]=\"readonly\" [actions]=\"transportActions\" [navigationEnabled]=\"navigationEnabled\"></app-sprtransport>\n\n <app-uploadstatus fxHide.xs *ngIf=\"enableUploadRecordings\" [value]=\"uploadProgress\"\n [status]=\"uploadStatus\" [awaitNewUpload]=\"processing\"></app-uploadstatus>\n <mat-icon fxHide.xs [matTooltip]=\"readyStateToolTip\">{{hourGlassIconName}}</mat-icon>\n ", isInline: true, styles: [":host {\n flex: 0; /* only required vertical space */\n /* width: 100%; */ /* available horizontal sace */\n /* display: inline; */\n display: flex; /* Horizontal flex container: Bottom transport panel, above prompting panel */\n flex-direction: row;\n align-content: center;\n align-items: center;\n margin: 0;\n padding: 20px;\n min-height: min-content; /* important */\n }", "\n div {\n flex: 0;\n }\n "], components: [{ type: StatusDisplay, selector: "app-sprstatusdisplay", inputs: ["statusAlertType", "statusMsg", "statusWaiting"] }, { type: TransportPanel, selector: "app-sprtransport", inputs: ["readonly", "actions", "navigationEnabled"] }, { type: UploadStatus, selector: "app-uploadstatus", inputs: ["value", "awaitNewUpload", "status"] }, { type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i6__namespace.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"] }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3__namespace.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
6866
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: ControlPanel, decorators: [{
6437
6867
  type: i0.Component,
6438
6868
  args: [{
6439
6869
  selector: 'app-sprcontrolpanel',
@@ -6482,9 +6912,9 @@
6482
6912
  };
6483
6913
  return SessionFinishedDialog;
6484
6914
  }());
6485
- SessionFinishedDialog.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SessionFinishedDialog, deps: [{ token: i1__namespace$3.MatDialogRef }, { token: i1$3.MAT_DIALOG_DATA }], target: i0__namespace.ɵɵFactoryTarget.Component });
6486
- SessionFinishedDialog.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: SessionFinishedDialog, selector: "spr-session-finished-dialog", ngImport: i0__namespace, template: "<h1 mat-dialog-title><mat-icon [style.color]=\"'green'\">done_all</mat-icon> Session finished</h1>\n <div mat-dialog-content>\n\n <p>Thank you! The recording session is complete.</p>\n\n </div>\n <div mat-dialog-actions>\n <button mat-button (click)=\"closeDialog()\">OK</button>\n </div>\n ", isInline: true, components: [{ type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3__namespace$1.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"] }], directives: [{ type: i1__namespace$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1__namespace$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i1__namespace$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }] });
6487
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SessionFinishedDialog, decorators: [{
6915
+ SessionFinishedDialog.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SessionFinishedDialog, deps: [{ token: i1__namespace$3.MatDialogRef }, { token: i1$3.MAT_DIALOG_DATA }], target: i0__namespace.ɵɵFactoryTarget.Component });
6916
+ SessionFinishedDialog.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: SessionFinishedDialog, selector: "spr-session-finished-dialog", ngImport: i0__namespace, template: "<h1 mat-dialog-title><mat-icon [style.color]=\"'green'\">done_all</mat-icon> Session finished</h1>\n <div mat-dialog-content>\n\n <p>Thank you! The recording session is complete.</p>\n\n </div>\n <div mat-dialog-actions>\n <button mat-button (click)=\"closeDialog()\">OK</button>\n </div>\n ", isInline: true, components: [{ type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3__namespace$1.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"] }], directives: [{ type: i1__namespace$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1__namespace$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i1__namespace$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }] });
6917
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SessionFinishedDialog, decorators: [{
6488
6918
  type: i0.Component,
6489
6919
  args: [{
6490
6920
  selector: 'spr-session-finished-dialog',
@@ -6507,9 +6937,9 @@
6507
6937
  };
6508
6938
  return MessageDialog;
6509
6939
  }());
6510
- MessageDialog.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageDialog, deps: [{ token: i1__namespace$3.MatDialogRef }, { token: i1$3.MAT_DIALOG_DATA }], target: i0__namespace.ɵɵFactoryTarget.Component });
6511
- MessageDialog.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageDialog, selector: "msg-dialog", ngImport: i0__namespace, template: "<h1 mat-dialog-title><mat-icon *ngIf=\"data.type==='error'\" [style.color]=\"'red'\">error</mat-icon>\n <mat-icon *ngIf=\"data.type==='warning'\" [style.color]=\"'yellow'\">warning</mat-icon>{{data.title}}</h1>\n <div mat-dialog-content>\n\n <p>{{data.msg}}</p>\n <p>{{data.advice}}</p>\n\n </div>\n <div mat-dialog-actions>\n <button mat-button (click)=\"closeDialog()\">OK</button>\n </div>\n ", isInline: true, components: [{ type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3__namespace$1.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"] }], directives: [{ type: i1__namespace$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1__namespace$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i1__namespace$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }] });
6512
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: MessageDialog, decorators: [{
6940
+ MessageDialog.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: MessageDialog, deps: [{ token: i1__namespace$3.MatDialogRef }, { token: i1$3.MAT_DIALOG_DATA }], target: i0__namespace.ɵɵFactoryTarget.Component });
6941
+ MessageDialog.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: MessageDialog, selector: "msg-dialog", ngImport: i0__namespace, template: "<h1 mat-dialog-title><mat-icon *ngIf=\"data.type==='error'\" [style.color]=\"'red'\">error</mat-icon>\n <mat-icon *ngIf=\"data.type==='warning'\" [style.color]=\"'yellow'\">warning</mat-icon>{{data.title}}</h1>\n <div mat-dialog-content>\n\n <p>{{data.msg}}</p>\n <p>{{data.advice}}</p>\n\n </div>\n <div mat-dialog-actions>\n <button mat-button (click)=\"closeDialog()\">OK</button>\n </div>\n ", isInline: true, components: [{ type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3__namespace$1.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"] }], directives: [{ type: i1__namespace$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1__namespace$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i1__namespace$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }] });
6942
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: MessageDialog, decorators: [{
6513
6943
  type: i0.Component,
6514
6944
  args: [{
6515
6945
  selector: 'msg-dialog',
@@ -6707,9 +7137,9 @@
6707
7137
  return RecordingService;
6708
7138
  }());
6709
7139
  RecordingService.REC_API_CTX = 'recfile';
6710
- RecordingService.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: RecordingService, deps: [{ token: i1__namespace.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
6711
- RecordingService.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: RecordingService });
6712
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: RecordingService, decorators: [{
7140
+ RecordingService.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: RecordingService, deps: [{ token: i1__namespace.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
7141
+ RecordingService.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: RecordingService });
7142
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: RecordingService, decorators: [{
6713
7143
  type: i0.Injectable
6714
7144
  }], ctorParameters: function () {
6715
7145
  return [{ type: i1__namespace.HttpClient }, { type: SpeechRecorderConfig, decorators: [{
@@ -6728,9 +7158,9 @@
6728
7158
  }
6729
7159
  return SpeechRecorderUploader;
6730
7160
  }(Uploader));
6731
- SpeechRecorderUploader.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SpeechRecorderUploader, deps: [{ token: i1__namespace.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
6732
- SpeechRecorderUploader.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SpeechRecorderUploader });
6733
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SpeechRecorderUploader, decorators: [{
7161
+ SpeechRecorderUploader.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SpeechRecorderUploader, deps: [{ token: i1__namespace.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
7162
+ SpeechRecorderUploader.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SpeechRecorderUploader });
7163
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SpeechRecorderUploader, decorators: [{
6734
7164
  type: i0.Injectable
6735
7165
  }], ctorParameters: function () {
6736
7166
  return [{ type: i1__namespace.HttpClient }, { type: SpeechRecorderConfig, decorators: [{
@@ -6757,9 +7187,9 @@
6757
7187
  });
6758
7188
  return WarningBar;
6759
7189
  }());
6760
- WarningBar.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: WarningBar, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
6761
- WarningBar.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: WarningBar, selector: "app-warningbar", inputs: { warningText: "warningText", show: "show" }, providers: [SessionService], ngImport: i0__namespace, template: "\n <div [class]=\"displayClass\">{{warningText}}</div>\n\n ", isInline: true, styles: [":host {\n\n flex: 0 0 content;\n background: orange;\n\n }", "\n .off {\n display: none;\n }\n ", "\n .on {\n padding: 2px;\n display: inline-block;\n width: 100%;\n font-weight: bold;\n font-size: larger;\n text-align: center;\n }\n "] });
6762
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: WarningBar, decorators: [{
7190
+ WarningBar.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: WarningBar, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
7191
+ WarningBar.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: WarningBar, selector: "app-warningbar", inputs: { warningText: "warningText", show: "show" }, providers: [SessionService], ngImport: i0__namespace, template: "\n <div [class]=\"displayClass\">{{warningText}}</div>\n\n ", isInline: true, styles: [":host {\n\n flex: 0 0 content;\n background: orange;\n\n }", "\n .off {\n display: none;\n }\n ", "\n .on {\n padding: 2px;\n display: inline-block;\n width: 100%;\n font-weight: bold;\n font-size: larger;\n text-align: center;\n }\n "] });
7192
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: WarningBar, decorators: [{
6763
7193
  type: i0.Component,
6764
7194
  args: [{
6765
7195
  selector: 'app-warningbar',
@@ -6773,6 +7203,7 @@
6773
7203
  type: i0.Input
6774
7204
  }] } });
6775
7205
 
7206
+ var FORCE_REQUEST_AUDIO_PERMISSIONS = false;
6776
7207
  var RECFILE_API_CTX = 'recfile';
6777
7208
  var MAX_RECORDING_TIME_MS = 1000 * 60 * 60 * 60; // 1 hour
6778
7209
  var DEFAULT_PRE_REC_DELAY = 1000;
@@ -6824,6 +7255,9 @@
6824
7255
  this.selCaptureDeviceId = null;
6825
7256
  this.levelMeasure = new LevelMeasure();
6826
7257
  this.streamLevelMeasure = new StreamLevelMeasure();
7258
+ this.userAgent = UserAgentBuilder.userAgent();
7259
+ console.debug("Detected platform: " + this.userAgent.detectedPlatform);
7260
+ console.debug("Detected browser: " + this.userAgent.detectedBrowser);
6827
7261
  if (this.config && this.config.enableUploadRecordings !== undefined) {
6828
7262
  this.enableUploadRecordings = this.config.enableUploadRecordings;
6829
7263
  }
@@ -6875,7 +7309,7 @@
6875
7309
  else {
6876
7310
  console.info("No audio context available!");
6877
7311
  }
6878
- if (!navigator.mediaDevices) {
7312
+ if (!context || !navigator.mediaDevices) {
6879
7313
  this.status = 8 /* ERROR */;
6880
7314
  var errMsg = 'Browser does not support Media streams!';
6881
7315
  this.statusMsg = 'ERROR: ' + errMsg;
@@ -7008,6 +7442,13 @@
7008
7442
  enumerable: false,
7009
7443
  configurable: true
7010
7444
  });
7445
+ Object.defineProperty(SessionManager.prototype, "autoGainControlConfigs", {
7446
+ set: function (autoGainControlConfigs) {
7447
+ this._autoGainControlConfigs = autoGainControlConfigs;
7448
+ },
7449
+ enumerable: false,
7450
+ configurable: true
7451
+ });
7011
7452
  SessionManager.prototype.update = function (e) {
7012
7453
  if (e.type == exports.EventType.STARTED) {
7013
7454
  this.playStartAction.disabled = true;
@@ -7090,7 +7531,7 @@
7090
7531
  else {
7091
7532
  console.log("Open session with default audio device for " + this._channelCount + " channels");
7092
7533
  }
7093
- this.ac.open(this._channelCount, this._selectedDeviceId);
7534
+ this.ac.open(this._channelCount, this._selectedDeviceId, this._autoGainControlConfigs);
7094
7535
  }
7095
7536
  else {
7096
7537
  this.ac.start();
@@ -7342,9 +7783,22 @@
7342
7783
  this.sessionService.patchSessionObserver(this._session, body).subscribe();
7343
7784
  }
7344
7785
  }
7786
+ // Check browser compatibility
7787
+ if (this.userAgent.detectedBrowser === Browser$1.Safari && this._channelCount > 1) {
7788
+ var eMsg = "Error: Safari browser does not support stereo recordings.";
7789
+ console.error(eMsg);
7790
+ this.dialog.open(MessageDialog, {
7791
+ data: {
7792
+ type: 'error',
7793
+ title: 'Browser not supported',
7794
+ msg: eMsg,
7795
+ advice: "Please use a supported browser, e.g. Mozilla Firefox."
7796
+ }
7797
+ });
7798
+ }
7345
7799
  //console.log("Session ID: "+this._session.session+ " status: "+this._session.status)
7346
7800
  this._selectedDeviceId = undefined;
7347
- if (!this.readonly && this.ac) {
7801
+ if (!this.readonly && this.ac && (FORCE_REQUEST_AUDIO_PERMISSIONS || (this._audioDevices && this._audioDevices.length > 0))) {
7348
7802
  this.statusMsg = 'Requesting audio permissions...';
7349
7803
  this.statusAlertType = 'info';
7350
7804
  this.ac.deviceInfos(function (mdis) {
@@ -7461,6 +7915,7 @@
7461
7915
  }
7462
7916
  });
7463
7917
  }
7918
+ // Safari does not list playback devices
7464
7919
  if (!audioPlayDeviceAvail) {
7465
7920
  // Firefox does not enumerate audiooutput devices
7466
7921
  // Do not show this warning, because it would always appear on Firefox
@@ -7468,7 +7923,8 @@
7468
7923
  // It is already implemneted but kept behind a preference setting https://bugzilla.mozilla.org/show_bug.cgi?id=1152401
7469
7924
  // Output devices are listed if about:config media.setsinkid.enabled=true
7470
7925
  // but default setting is false
7471
- if (!navigator.userAgent.match(".*Firefox.*")) {
7926
+ // Same problem with Safari
7927
+ if (!(_this.userAgent.detectedBrowser === Browser$1.Safari || _this.userAgent.detectedBrowser === Browser$1.Firefox)) {
7472
7928
  // no device found
7473
7929
  _this.statusMsg = 'WARNING: No audio playback device available!';
7474
7930
  _this.statusAlertType = 'warn';
@@ -7878,14 +8334,14 @@
7878
8334
  };
7879
8335
  return SessionManager;
7880
8336
  }());
7881
- SessionManager.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SessionManager, deps: [{ token: i0__namespace.ChangeDetectorRef }, { token: i0__namespace.Renderer2 }, { token: i1__namespace$3.MatDialog }, { token: SessionService }, { token: RecordingService }, { token: SpeechRecorderUploader }, { token: SPEECHRECORDER_CONFIG }], target: i0__namespace.ɵɵFactoryTarget.Component });
7882
- SessionManager.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", 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: LevelBarDisplay, descendants: true, static: true }], ngImport: i0__namespace, template: "\n <app-warningbar [show]=\"isTestSession()\" warningText=\"Test recording only!\"></app-warningbar>\n <app-warningbar [show]=\"isDefaultAudioTestSession()\" warningText=\"This test uses default audio device! Regular sessions may require a particular audio device (microphone)!\"></app-warningbar>\n <app-sprprompting [projectName]=\"projectName\"\n [startStopSignalState]=\"startStopSignalState\" [promptItem]=\"promptItem\" [showPrompt]=\"showPrompt\"\n [items]=\"items\"\n [transportActions]=\"transportActions\"\n [selectedItemIdx]=\"promptIndex\" (onItemSelect)=\"itemSelect($event)\" (onNextItem)=\"nextItem()\" (onPrevItem)=\"prevItem()\"\n [audioSignalCollapsed]=\"audioSignalCollapsed\" [displayAudioClip]=\"displayAudioClip\"\n [playStartAction]=\"controlAudioPlayer?.startAction\"\n [playSelectionAction]=\"controlAudioPlayer?.startSelectionAction\"\n [autoPlayOnSelectToggleAction]=\"controlAudioPlayer?.autoPlayOnSelectToggleAction\"\n [playStopAction]=\"controlAudioPlayer?.stopAction\">\n\n </app-sprprompting>\n <mat-progress-bar [value]=\"progressPercentValue()\" fxShow=\"false\" fxShow.xs=\"true\" ></mat-progress-bar>\n\n <spr-recordingitemdisplay #levelbardisplay\n [playStartAction]=\"controlAudioPlayer?.startAction\"\n [playStopAction]=\"controlAudioPlayer?.stopAction\"\n [streamingMode]=\"isRecording()\"\n [displayLevelInfos]=\"displayLevelInfos\"\n [displayAudioBuffer]=\"displayAudioClip?.buffer\" [audioSignalCollapsed]=\"audioSignalCollapsed\"\n (onShowRecordingDetails)=\"audioSignalCollapsed=!audioSignalCollapsed\"\n (onDownloadRecording)=\"downloadRecording()\"\n [enableDownload]=\"enableDownloadRecordings\"></spr-recordingitemdisplay>\n <app-sprcontrolpanel [enableUploadRecordings]=\"enableUploadRecordings\" [readonly]=\"readonly\" [currentRecording]=\"displayAudioClip?.buffer\"\n [transportActions]=\"transportActions\" [statusMsg]=\"statusMsg\" [statusWaiting]=\"statusWaiting\"\n [statusAlertType]=\"statusAlertType\" [uploadProgress]=\"uploadProgress\"\n [uploadStatus]=\"uploadStatus\" [ready]=\"dataSaved && !isActive()\" [processing]=\"processingRecording\" [navigationEnabled]=\"items==null || items.length>1\"></app-sprcontrolpanel>\n\n ", isInline: true, styles: [":host {\n flex: 2;\n background: lightgrey;\n display: flex; /* Vertical flex container: Bottom transport panel, above prompting panel */\n flex-direction: column;\n margin: 0;\n padding: 0;\n min-height: 0px;\n\n /* Prevents horizontal scroll bar on swipe right */\n overflow: hidden;\n }"], components: [{ type: WarningBar, selector: "app-warningbar", inputs: ["warningText", "show"] }, { type: Prompting, selector: "app-sprprompting", inputs: ["projectName", "startStopSignalState", "promptItem", "showPrompt", "items", "selectedItemIdx", "transportActions", "enableDownload", "audioSignalCollapsed", "displayAudioClip", "playStartAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "playStopAction"], outputs: ["onItemSelect", "onNextItem", "onPrevItem"] }, { type: i7__namespace.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "mode", "value", "bufferValue"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { type: LevelBarDisplay, selector: "spr-recordingitemdisplay", inputs: ["streamingMode", "audioSignalCollapsed", "enableDownload", "playStartAction", "playStopAction", "displayAudioBuffer", "displayLevelInfos"], outputs: ["onShowRecordingDetails", "onDownloadRecording"] }, { type: ControlPanel, selector: "app-sprcontrolpanel", inputs: ["readonly", "transportActions", "processing", "statusMsg", "statusAlertType", "statusWaiting", "uploadStatus", "uploadProgress", "currentRecording", "enableUploadRecordings", "navigationEnabled", "ready"] }], directives: [{ type: i6__namespace.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"] }] });
7883
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SessionManager, decorators: [{
8337
+ SessionManager.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SessionManager, deps: [{ token: i0__namespace.ChangeDetectorRef }, { token: i0__namespace.Renderer2 }, { token: i1__namespace$3.MatDialog }, { token: SessionService }, { token: RecordingService }, { token: SpeechRecorderUploader }, { token: SPEECHRECORDER_CONFIG }], target: i0__namespace.ɵɵFactoryTarget.Component });
8338
+ SessionManager.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", 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: LevelBarDisplay, descendants: true, static: true }], ngImport: i0__namespace, template: "\n <app-warningbar [show]=\"isTestSession()\" warningText=\"Test recording only!\"></app-warningbar>\n <app-warningbar [show]=\"isDefaultAudioTestSession()\" warningText=\"This test uses default audio device! Regular sessions may require a particular audio device (microphone)!\"></app-warningbar>\n <app-sprprompting [projectName]=\"projectName\"\n [startStopSignalState]=\"startStopSignalState\" [promptItem]=\"promptItem\" [showPrompt]=\"showPrompt\"\n [items]=\"items\"\n [transportActions]=\"transportActions\"\n [selectedItemIdx]=\"promptIndex\" (onItemSelect)=\"itemSelect($event)\" (onNextItem)=\"nextItem()\" (onPrevItem)=\"prevItem()\"\n [audioSignalCollapsed]=\"audioSignalCollapsed\" [displayAudioClip]=\"displayAudioClip\"\n [playStartAction]=\"controlAudioPlayer?.startAction\"\n [playSelectionAction]=\"controlAudioPlayer?.startSelectionAction\"\n [autoPlayOnSelectToggleAction]=\"controlAudioPlayer?.autoPlayOnSelectToggleAction\"\n [playStopAction]=\"controlAudioPlayer?.stopAction\">\n\n </app-sprprompting>\n <mat-progress-bar [value]=\"progressPercentValue()\" fxShow=\"false\" fxShow.xs=\"true\" ></mat-progress-bar>\n\n <spr-recordingitemdisplay #levelbardisplay\n [playStartAction]=\"controlAudioPlayer?.startAction\"\n [playStopAction]=\"controlAudioPlayer?.stopAction\"\n [streamingMode]=\"isRecording()\"\n [displayLevelInfos]=\"displayLevelInfos\"\n [displayAudioBuffer]=\"displayAudioClip?.buffer\"\n [agc]=\"this.ac?.agcStatus\"\n [audioSignalCollapsed]=\"audioSignalCollapsed\"\n (onShowRecordingDetails)=\"audioSignalCollapsed=!audioSignalCollapsed\"\n (onDownloadRecording)=\"downloadRecording()\"\n [enableDownload]=\"enableDownloadRecordings\"></spr-recordingitemdisplay>\n <app-sprcontrolpanel [enableUploadRecordings]=\"enableUploadRecordings\" [readonly]=\"readonly\" [currentRecording]=\"displayAudioClip?.buffer\"\n [transportActions]=\"transportActions\" [statusMsg]=\"statusMsg\" [statusWaiting]=\"statusWaiting\"\n [statusAlertType]=\"statusAlertType\" [uploadProgress]=\"uploadProgress\"\n [uploadStatus]=\"uploadStatus\" [ready]=\"dataSaved && !isActive()\" [processing]=\"processingRecording\" [navigationEnabled]=\"items==null || items.length>1\"></app-sprcontrolpanel>\n\n ", isInline: true, styles: [":host {\n flex: 2;\n background: lightgrey;\n display: flex; /* Vertical flex container: Bottom transport panel, above prompting panel */\n flex-direction: column;\n margin: 0;\n padding: 0;\n min-height: 0px;\n\n /* Prevents horizontal scroll bar on swipe right */\n overflow: hidden;\n }"], components: [{ type: WarningBar, selector: "app-warningbar", inputs: ["warningText", "show"] }, { type: Prompting, selector: "app-sprprompting", inputs: ["projectName", "startStopSignalState", "promptItem", "showPrompt", "items", "selectedItemIdx", "transportActions", "enableDownload", "audioSignalCollapsed", "displayAudioClip", "playStartAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "playStopAction"], outputs: ["onItemSelect", "onNextItem", "onPrevItem"] }, { type: i7__namespace.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "mode", "value", "bufferValue"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { type: LevelBarDisplay, selector: "spr-recordingitemdisplay", inputs: ["streamingMode", "audioSignalCollapsed", "enableDownload", "agc", "playStartAction", "playStopAction", "displayAudioBuffer", "displayLevelInfos"], outputs: ["onShowRecordingDetails", "onDownloadRecording"] }, { type: ControlPanel, selector: "app-sprcontrolpanel", inputs: ["readonly", "transportActions", "processing", "statusMsg", "statusAlertType", "statusWaiting", "uploadStatus", "uploadProgress", "currentRecording", "enableUploadRecordings", "navigationEnabled", "ready"] }], directives: [{ type: i6__namespace.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"] }] });
8339
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SessionManager, decorators: [{
7884
8340
  type: i0.Component,
7885
8341
  args: [{
7886
8342
  selector: 'app-sprrecordingsession',
7887
8343
  providers: [SessionService],
7888
- template: "\n <app-warningbar [show]=\"isTestSession()\" warningText=\"Test recording only!\"></app-warningbar>\n <app-warningbar [show]=\"isDefaultAudioTestSession()\" warningText=\"This test uses default audio device! Regular sessions may require a particular audio device (microphone)!\"></app-warningbar>\n <app-sprprompting [projectName]=\"projectName\"\n [startStopSignalState]=\"startStopSignalState\" [promptItem]=\"promptItem\" [showPrompt]=\"showPrompt\"\n [items]=\"items\"\n [transportActions]=\"transportActions\"\n [selectedItemIdx]=\"promptIndex\" (onItemSelect)=\"itemSelect($event)\" (onNextItem)=\"nextItem()\" (onPrevItem)=\"prevItem()\"\n [audioSignalCollapsed]=\"audioSignalCollapsed\" [displayAudioClip]=\"displayAudioClip\"\n [playStartAction]=\"controlAudioPlayer?.startAction\"\n [playSelectionAction]=\"controlAudioPlayer?.startSelectionAction\"\n [autoPlayOnSelectToggleAction]=\"controlAudioPlayer?.autoPlayOnSelectToggleAction\"\n [playStopAction]=\"controlAudioPlayer?.stopAction\">\n\n </app-sprprompting>\n <mat-progress-bar [value]=\"progressPercentValue()\" fxShow=\"false\" fxShow.xs=\"true\" ></mat-progress-bar>\n\n <spr-recordingitemdisplay #levelbardisplay\n [playStartAction]=\"controlAudioPlayer?.startAction\"\n [playStopAction]=\"controlAudioPlayer?.stopAction\"\n [streamingMode]=\"isRecording()\"\n [displayLevelInfos]=\"displayLevelInfos\"\n [displayAudioBuffer]=\"displayAudioClip?.buffer\" [audioSignalCollapsed]=\"audioSignalCollapsed\"\n (onShowRecordingDetails)=\"audioSignalCollapsed=!audioSignalCollapsed\"\n (onDownloadRecording)=\"downloadRecording()\"\n [enableDownload]=\"enableDownloadRecordings\"></spr-recordingitemdisplay>\n <app-sprcontrolpanel [enableUploadRecordings]=\"enableUploadRecordings\" [readonly]=\"readonly\" [currentRecording]=\"displayAudioClip?.buffer\"\n [transportActions]=\"transportActions\" [statusMsg]=\"statusMsg\" [statusWaiting]=\"statusWaiting\"\n [statusAlertType]=\"statusAlertType\" [uploadProgress]=\"uploadProgress\"\n [uploadStatus]=\"uploadStatus\" [ready]=\"dataSaved && !isActive()\" [processing]=\"processingRecording\" [navigationEnabled]=\"items==null || items.length>1\"></app-sprcontrolpanel>\n\n ",
8344
+ template: "\n <app-warningbar [show]=\"isTestSession()\" warningText=\"Test recording only!\"></app-warningbar>\n <app-warningbar [show]=\"isDefaultAudioTestSession()\" warningText=\"This test uses default audio device! Regular sessions may require a particular audio device (microphone)!\"></app-warningbar>\n <app-sprprompting [projectName]=\"projectName\"\n [startStopSignalState]=\"startStopSignalState\" [promptItem]=\"promptItem\" [showPrompt]=\"showPrompt\"\n [items]=\"items\"\n [transportActions]=\"transportActions\"\n [selectedItemIdx]=\"promptIndex\" (onItemSelect)=\"itemSelect($event)\" (onNextItem)=\"nextItem()\" (onPrevItem)=\"prevItem()\"\n [audioSignalCollapsed]=\"audioSignalCollapsed\" [displayAudioClip]=\"displayAudioClip\"\n [playStartAction]=\"controlAudioPlayer?.startAction\"\n [playSelectionAction]=\"controlAudioPlayer?.startSelectionAction\"\n [autoPlayOnSelectToggleAction]=\"controlAudioPlayer?.autoPlayOnSelectToggleAction\"\n [playStopAction]=\"controlAudioPlayer?.stopAction\">\n\n </app-sprprompting>\n <mat-progress-bar [value]=\"progressPercentValue()\" fxShow=\"false\" fxShow.xs=\"true\" ></mat-progress-bar>\n\n <spr-recordingitemdisplay #levelbardisplay\n [playStartAction]=\"controlAudioPlayer?.startAction\"\n [playStopAction]=\"controlAudioPlayer?.stopAction\"\n [streamingMode]=\"isRecording()\"\n [displayLevelInfos]=\"displayLevelInfos\"\n [displayAudioBuffer]=\"displayAudioClip?.buffer\"\n [agc]=\"this.ac?.agcStatus\"\n [audioSignalCollapsed]=\"audioSignalCollapsed\"\n (onShowRecordingDetails)=\"audioSignalCollapsed=!audioSignalCollapsed\"\n (onDownloadRecording)=\"downloadRecording()\"\n [enableDownload]=\"enableDownloadRecordings\"></spr-recordingitemdisplay>\n <app-sprcontrolpanel [enableUploadRecordings]=\"enableUploadRecordings\" [readonly]=\"readonly\" [currentRecording]=\"displayAudioClip?.buffer\"\n [transportActions]=\"transportActions\" [statusMsg]=\"statusMsg\" [statusWaiting]=\"statusWaiting\"\n [statusAlertType]=\"statusAlertType\" [uploadProgress]=\"uploadProgress\"\n [uploadStatus]=\"uploadStatus\" [ready]=\"dataSaved && !isActive()\" [processing]=\"processingRecording\" [navigationEnabled]=\"items==null || items.length>1\"></app-sprcontrolpanel>\n\n ",
7889
8345
  styles: [":host {\n flex: 2;\n background: lightgrey;\n display: flex; /* Vertical flex container: Bottom transport panel, above prompting panel */\n flex-direction: column;\n margin: 0;\n padding: 0;\n min-height: 0px;\n\n /* Prevents horizontal scroll bar on swipe right */\n overflow: hidden;\n }"]
7890
8346
  }]
7891
8347
  }], ctorParameters: function () {
@@ -7911,23 +8367,6 @@
7911
8367
  args: ['window:keydown', ['$event']]
7912
8368
  }] } });
7913
8369
 
7914
- var ProjectUtil = /** @class */ (function () {
7915
- function ProjectUtil() {
7916
- }
7917
- ProjectUtil.audioChannelCount = function (project) {
7918
- var chs = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;
7919
- if (project.mediaCaptureFormat) {
7920
- chs = project.mediaCaptureFormat.audioChannelCount;
7921
- }
7922
- else if (project.audioFormat) {
7923
- chs = project.audioFormat.channels;
7924
- }
7925
- return chs;
7926
- };
7927
- return ProjectUtil;
7928
- }());
7929
- ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT = 2;
7930
-
7931
8370
  /**
7932
8371
  * Created by klausj on 17.06.2017.
7933
8372
  */
@@ -7961,9 +8400,9 @@
7961
8400
  };
7962
8401
  return ScriptService;
7963
8402
  }());
7964
- ScriptService.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ScriptService, deps: [{ token: i1__namespace.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
7965
- ScriptService.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ScriptService });
7966
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ScriptService, decorators: [{
8403
+ ScriptService.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: ScriptService, deps: [{ token: i1__namespace.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
8404
+ ScriptService.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: ScriptService });
8405
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: ScriptService, decorators: [{
7967
8406
  type: i0.Injectable
7968
8407
  }], ctorParameters: function () {
7969
8408
  return [{ type: i1__namespace.HttpClient }, { type: SpeechRecorderConfig, decorators: [{
@@ -8263,6 +8702,7 @@
8263
8702
  this.sm.audioDevices = project.audioDevices;
8264
8703
  chCnt = ProjectUtil.audioChannelCount(project);
8265
8704
  console.info("Project requested recording channel count: " + chCnt);
8705
+ this.sm.autoGainControlConfigs = project.autoGainControlConfigs;
8266
8706
  }
8267
8707
  else {
8268
8708
  console.error("Empty project configuration!");
@@ -8365,9 +8805,9 @@
8365
8805
  };
8366
8806
  return SpeechrecorderngComponent;
8367
8807
  }());
8368
- SpeechrecorderngComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SpeechrecorderngComponent, deps: [{ token: i1__namespace$1.ActivatedRoute }, { token: i1__namespace$1.Router }, { token: i0__namespace.ChangeDetectorRef }, { token: SessionService }, { token: ProjectService }, { token: ScriptService }, { token: RecordingService }, { token: SpeechRecorderUploader }], target: i0__namespace.ɵɵFactoryTarget.Component });
8369
- SpeechrecorderngComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: SpeechrecorderngComponent, selector: "app-speechrecorder", providers: [SessionService], viewQueries: [{ propertyName: "sm", first: true, predicate: SessionManager, descendants: true, static: true }], ngImport: i0__namespace, template: "\n <app-sprrecordingsession [projectName]=\"project?.name\" [dataSaved]=\"dataSaved\"></app-sprrecordingsession>\n ", isInline: true, styles: [":host{\n flex: 2;\n display: flex;\n flex-direction: column;\n min-height:0;\n\n }"], components: [{ type: SessionManager, selector: "app-sprrecordingsession", inputs: ["projectName", "dataSaved"] }] });
8370
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SpeechrecorderngComponent, decorators: [{
8808
+ SpeechrecorderngComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SpeechrecorderngComponent, deps: [{ token: i1__namespace$1.ActivatedRoute }, { token: i1__namespace$1.Router }, { token: i0__namespace.ChangeDetectorRef }, { token: SessionService }, { token: ProjectService }, { token: ScriptService }, { token: RecordingService }, { token: SpeechRecorderUploader }], target: i0__namespace.ɵɵFactoryTarget.Component });
8809
+ SpeechrecorderngComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: SpeechrecorderngComponent, selector: "app-speechrecorder", providers: [SessionService], viewQueries: [{ propertyName: "sm", first: true, predicate: SessionManager, descendants: true, static: true }], ngImport: i0__namespace, template: "\n <app-sprrecordingsession [projectName]=\"project?.name\" [dataSaved]=\"dataSaved\"></app-sprrecordingsession>\n ", isInline: true, styles: [":host{\n flex: 2;\n display: flex;\n flex-direction: column;\n min-height:0;\n\n }"], components: [{ type: SessionManager, selector: "app-sprrecordingsession", inputs: ["projectName", "dataSaved"] }] });
8810
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SpeechrecorderngComponent, decorators: [{
8371
8811
  type: i0.Component,
8372
8812
  args: [{
8373
8813
  selector: 'app-speechrecorder',
@@ -8385,9 +8825,9 @@
8385
8825
  }
8386
8826
  return ScrollPaneHorizontal;
8387
8827
  }());
8388
- ScrollPaneHorizontal.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ScrollPaneHorizontal, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
8389
- ScrollPaneHorizontal.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: ScrollPaneHorizontal, selector: "scroll-pane-horizontal", ngImport: i0__namespace, template: '', isInline: true, styles: [":host {\n width: 100%;\n background: darkgray;\n box-sizing: border-box;\n height: 100%;\n position: relative;\n overflow-x: scroll;\n overflow-y: auto;\n }"] });
8390
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: ScrollPaneHorizontal, decorators: [{
8828
+ ScrollPaneHorizontal.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: ScrollPaneHorizontal, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
8829
+ ScrollPaneHorizontal.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: ScrollPaneHorizontal, selector: "scroll-pane-horizontal", ngImport: i0__namespace, template: '', isInline: true, styles: [":host {\n width: 100%;\n background: darkgray;\n box-sizing: border-box;\n height: 100%;\n position: relative;\n overflow-x: scroll;\n overflow-y: auto;\n }"] });
8830
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: ScrollPaneHorizontal, decorators: [{
8391
8831
  type: i0.Component,
8392
8832
  args: [{
8393
8833
  selector: 'scroll-pane-horizontal',
@@ -8614,9 +9054,9 @@
8614
9054
  };
8615
9055
  return AudioDisplayPlayer;
8616
9056
  }());
8617
- AudioDisplayPlayer.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AudioDisplayPlayer, deps: [{ token: i1__namespace$1.ActivatedRoute }, { token: i0__namespace.ChangeDetectorRef }, { token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
8618
- AudioDisplayPlayer.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", 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__namespace, template: "\n\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\n\n <audio-display-control [audioClip]=\"audioClip\"\n [playStartAction]=\"playStartAction\"\n [playSelectionAction]=\"playSelectionAction\"\n [playStopAction]=\"playStopAction\"\n [autoPlayOnSelectToggleAction]=\"ap?.autoPlayOnSelectToggleAction\"\n [zoomInAction]=\"zoomInAction\"\n [zoomOutAction]=\"zoomOutAction\"\n [zoomSelectedAction]=\"zoomSelectedAction\"\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control><p>{{status}}\n ", isInline: true, styles: [":host {\n display: flex;\n flex-direction: column;\n position: absolute;\n bottom: 0px;\n height: 100%;\n width: 100%;\n overflow: hidden;\n padding: 20px;\n z-index: 5;\n box-sizing: border-box;\n background-color: rgba(0, 0, 0, 0.75)\n }"], components: [{ type: AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: ["audioClip"], outputs: ["zoomInAction", "zoomOutAction", "zoomSelectedAction", "zoomFitToPanelAction"] }, { type: AudioDisplayControl, selector: "audio-display-control", inputs: ["audioClip", "playStartAction", "playSelectionAction", "playStopAction", "zoomInAction", "zoomOutAction", "zoomFitToPanelAction", "zoomSelectedAction", "autoPlayOnSelectToggleAction"] }] });
8619
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: AudioDisplayPlayer, decorators: [{
9057
+ AudioDisplayPlayer.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: AudioDisplayPlayer, deps: [{ token: i1__namespace$1.ActivatedRoute }, { token: i0__namespace.ChangeDetectorRef }, { token: i0__namespace.ElementRef }], target: i0__namespace.ɵɵFactoryTarget.Component });
9058
+ AudioDisplayPlayer.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", 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__namespace, template: "\n\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\n\n <audio-display-control [audioClip]=\"audioClip\"\n [playStartAction]=\"playStartAction\"\n [playSelectionAction]=\"playSelectionAction\"\n [playStopAction]=\"playStopAction\"\n [autoPlayOnSelectToggleAction]=\"ap?.autoPlayOnSelectToggleAction\"\n [zoomInAction]=\"zoomInAction\"\n [zoomOutAction]=\"zoomOutAction\"\n [zoomSelectedAction]=\"zoomSelectedAction\"\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control><p>{{status}}\n ", isInline: true, styles: [":host {\n display: flex;\n flex-direction: column;\n position: absolute;\n bottom: 0px;\n height: 100%;\n width: 100%;\n overflow: hidden;\n padding: 20px;\n z-index: 5;\n box-sizing: border-box;\n background-color: rgba(0, 0, 0, 0.75)\n }"], components: [{ type: AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: ["audioClip"], outputs: ["zoomInAction", "zoomOutAction", "zoomSelectedAction", "zoomFitToPanelAction"] }, { type: AudioDisplayControl, selector: "audio-display-control", inputs: ["audioClip", "playStartAction", "playSelectionAction", "playStopAction", "zoomInAction", "zoomOutAction", "zoomFitToPanelAction", "zoomSelectedAction", "autoPlayOnSelectToggleAction"] }] });
9059
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: AudioDisplayPlayer, decorators: [{
8620
9060
  type: i0.Component,
8621
9061
  args: [{
8622
9062
  selector: 'app-audiodisplayplayer',
@@ -8889,9 +9329,9 @@
8889
9329
  return RecordingFileService;
8890
9330
  }());
8891
9331
  RecordingFileService.RECOFILE_API_CTX = 'recordingfile';
8892
- RecordingFileService.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: RecordingFileService, deps: [{ token: i1__namespace.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
8893
- RecordingFileService.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: RecordingFileService });
8894
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: RecordingFileService, decorators: [{
9332
+ RecordingFileService.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: RecordingFileService, deps: [{ token: i1__namespace.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
9333
+ RecordingFileService.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: RecordingFileService });
9334
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: RecordingFileService, decorators: [{
8895
9335
  type: i0.Injectable
8896
9336
  }], ctorParameters: function () {
8897
9337
  return [{ type: i1__namespace.HttpClient }, { type: SpeechRecorderConfig, decorators: [{
@@ -8914,9 +9354,9 @@
8914
9354
  };
8915
9355
  return RecordingFileMetaComponent;
8916
9356
  }());
8917
- RecordingFileMetaComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: RecordingFileMetaComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
8918
- RecordingFileMetaComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: RecordingFileMetaComponent, selector: "app-recording-file-meta", inputs: { sessionId: "sessionId", recordingFile: "recordingFile" }, ngImport: i0__namespace, template: "\n <mat-card>\n <mat-card-title>Recording file ID: {{recordingFile?.recordingFileId}}</mat-card-title>\n <mat-card-content>\n <table>\n <tr>\n <td>Itemcode:</td>\n <td>{{recordingFile?.recording?.itemcode}}</td>\n </tr>\n <tr *ngIf=\"recordingFile?.date\">\n <td>Date:</td>\n <td>{{recordingFile?.date}}</td>\n </tr>\n <tr>\n <td>Prompt:</td>\n <td>{{recordingAsPlainText()}}</td>\n </tr>\n \n <tr *ngIf=\"sessionId\">\n <td>Session:</td>\n <td>{{sessionId}}</td>\n </tr>\n </table>\n </mat-card-content>\n </mat-card>\n ", isInline: true, components: [{ type: i1__namespace$4.MatCard, selector: "mat-card", exportAs: ["matCard"] }], directives: [{ type: i1__namespace$4.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { type: i1__namespace$4.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
8919
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: RecordingFileMetaComponent, decorators: [{
9357
+ RecordingFileMetaComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: RecordingFileMetaComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
9358
+ RecordingFileMetaComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: RecordingFileMetaComponent, selector: "app-recording-file-meta", inputs: { sessionId: "sessionId", recordingFile: "recordingFile" }, ngImport: i0__namespace, template: "\n <mat-card>\n <mat-card-title>Recording file ID: {{recordingFile?.recordingFileId}}</mat-card-title>\n <mat-card-content>\n <table>\n <tr>\n <td>Itemcode:</td>\n <td>{{recordingFile?.recording?.itemcode}}</td>\n </tr>\n <tr *ngIf=\"recordingFile?.date\">\n <td>Date:</td>\n <td>{{recordingFile?.date}}</td>\n </tr>\n <tr>\n <td>Prompt:</td>\n <td>{{recordingAsPlainText()}}</td>\n </tr>\n \n <tr *ngIf=\"sessionId\">\n <td>Session:</td>\n <td>{{sessionId}}</td>\n </tr>\n </table>\n </mat-card-content>\n </mat-card>\n ", isInline: true, components: [{ type: i1__namespace$4.MatCard, selector: "mat-card", exportAs: ["matCard"] }], directives: [{ type: i1__namespace$4.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { type: i1__namespace$4.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
9359
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: RecordingFileMetaComponent, decorators: [{
8920
9360
  type: i0.Component,
8921
9361
  args: [{
8922
9362
  selector: 'app-recording-file-meta',
@@ -8947,9 +9387,9 @@
8947
9387
  };
8948
9388
  return RecordingFileNaviComponent;
8949
9389
  }());
8950
- RecordingFileNaviComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: RecordingFileNaviComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
8951
- RecordingFileNaviComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: RecordingFileNaviComponent, selector: "app-recording-file-navi", inputs: { firstAction: "firstAction", prevAction: "prevAction", nextAction: "nextAction", lastAction: "lastAction", items: "items", itemPos: "itemPos", selectVersion: "selectVersion", versions: "versions", version: "version", naviInfoLoading: "naviInfoLoading" }, ngImport: i0__namespace, template: "\n <div #controlPanel style=\"display:flex;flex-direction: row;\">\n <div #navi style=\"flex: 0;display:flex;flex-direction: row;flex-wrap: nowrap\">\n <fieldset>\n <legend>Versions</legend>\n <mat-progress-spinner *ngIf=\"naviInfoLoading\" mode=\"indeterminate\" [diameter]=\"15\"></mat-progress-spinner>\n <select *ngIf=\"!naviInfoLoading\" [disabled]=\"versions==null || versions.length==1\" (change)=\"selectVersionChange($event)\">\n <option *ngFor=\"let v of versions; let i = index\" [selected]=\"v===version\" value=\"{{v}}\">{{v}}<span *ngIf=\"i==0\"> (latest)</span></option>\n </select>\n </fieldset>\n <fieldset>\n <legend>Navigate</legend>\n <mat-progress-spinner *ngIf=\"naviInfoLoading\" mode=\"indeterminate\" [diameter]=\"15\"></mat-progress-spinner>\n <div *ngIf=\"!naviInfoLoading\" style=\"flex: 0;display:flex;flex-direction: row;flex-wrap: nowrap\">\n <button (click)=\"firstAction?.perform()\" [disabled]=\"!firstAction || firstAction?.disabled\" matTooltip=\"First recording file\">\n <mat-icon>first_page</mat-icon>\n </button>\n <button (click)=\"prevAction?.perform()\" [disabled]=\"!prevAction || prevAction?.disabled\" matTooltip=\"Previous recording file\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button (click)=\"nextAction?.perform()\" [disabled]=\"!nextAction || nextAction?.disabled\" matTooltip=\"Next recording file\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n <button (click)=\"lastAction?.perform()\" [disabled]=\"!lastAction || lastAction?.disabled\" matTooltip=\"Last recording file\">\n <mat-icon>last_page</mat-icon>\n </button>\n </div>\n <p *ngIf=\"items && itemPos!==null && itemPos!==undefined\">Item {{itemPos+1}} of {{items}}</p>\n <p>(List ordered by date)</p>\n </fieldset>\n </div>\n </div>\n ", isInline: true, styles: [":host {\n flex: 0;\n\n }"], components: [{ type: i1__namespace$2.MatProgressSpinner, selector: "mat-progress-spinner", inputs: ["color", "mode", "diameter", "strokeWidth", "value"], exportAs: ["matProgressSpinner"] }, { type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3__namespace.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
8952
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: RecordingFileNaviComponent, decorators: [{
9390
+ RecordingFileNaviComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: RecordingFileNaviComponent, deps: [], target: i0__namespace.ɵɵFactoryTarget.Component });
9391
+ RecordingFileNaviComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: RecordingFileNaviComponent, selector: "app-recording-file-navi", inputs: { firstAction: "firstAction", prevAction: "prevAction", nextAction: "nextAction", lastAction: "lastAction", items: "items", itemPos: "itemPos", selectVersion: "selectVersion", versions: "versions", version: "version", naviInfoLoading: "naviInfoLoading" }, ngImport: i0__namespace, template: "\n <div #controlPanel style=\"display:flex;flex-direction: row;\">\n <div #navi style=\"flex: 0;display:flex;flex-direction: row;flex-wrap: nowrap\">\n <fieldset>\n <legend>Versions</legend>\n <mat-progress-spinner *ngIf=\"naviInfoLoading\" mode=\"indeterminate\" [diameter]=\"15\"></mat-progress-spinner>\n <select *ngIf=\"!naviInfoLoading\" [disabled]=\"versions==null || versions.length==1\" (change)=\"selectVersionChange($event)\">\n <option *ngFor=\"let v of versions; let i = index\" [selected]=\"v===version\" value=\"{{v}}\">{{v}}<span *ngIf=\"i==0\"> (latest)</span></option>\n </select>\n </fieldset>\n <fieldset>\n <legend>Navigate</legend>\n <mat-progress-spinner *ngIf=\"naviInfoLoading\" mode=\"indeterminate\" [diameter]=\"15\"></mat-progress-spinner>\n <div *ngIf=\"!naviInfoLoading\" style=\"flex: 0;display:flex;flex-direction: row;flex-wrap: nowrap\">\n <button (click)=\"firstAction?.perform()\" [disabled]=\"!firstAction || firstAction?.disabled\" matTooltip=\"First recording file\">\n <mat-icon>first_page</mat-icon>\n </button>\n <button (click)=\"prevAction?.perform()\" [disabled]=\"!prevAction || prevAction?.disabled\" matTooltip=\"Previous recording file\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button (click)=\"nextAction?.perform()\" [disabled]=\"!nextAction || nextAction?.disabled\" matTooltip=\"Next recording file\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n <button (click)=\"lastAction?.perform()\" [disabled]=\"!lastAction || lastAction?.disabled\" matTooltip=\"Last recording file\">\n <mat-icon>last_page</mat-icon>\n </button>\n </div>\n <p *ngIf=\"items && itemPos!==null && itemPos!==undefined\">Item {{itemPos+1}} of {{items}}</p>\n <p>(List ordered by date)</p>\n </fieldset>\n </div>\n </div>\n ", isInline: true, styles: [":host {\n flex: 0;\n\n }"], components: [{ type: i1__namespace$2.MatProgressSpinner, selector: "mat-progress-spinner", inputs: ["color", "mode", "diameter", "strokeWidth", "value"], exportAs: ["matProgressSpinner"] }, { type: i2__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3__namespace.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
9392
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: RecordingFileNaviComponent, decorators: [{
8953
9393
  type: i0.Component,
8954
9394
  args: [{
8955
9395
  selector: 'app-recording-file-navi',
@@ -9308,9 +9748,9 @@
9308
9748
  };
9309
9749
  return RecordingFileViewComponent;
9310
9750
  }(AudioDisplayPlayer));
9311
- RecordingFileViewComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: RecordingFileViewComponent, deps: [{ token: RecordingFileService }, { token: RecordingService }, { token: SessionService }, { token: i1__namespace$1.Router }, { token: i1__namespace$1.ActivatedRoute }, { token: i0__namespace.ChangeDetectorRef }, { token: i0__namespace.ElementRef }, { token: i1__namespace$3.MatDialog }], target: i0__namespace.ɵɵFactoryTarget.Component });
9312
- RecordingFileViewComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: RecordingFileViewComponent, selector: "app-audiodisplayplayer", viewQueries: [{ propertyName: "ac", first: true, predicate: AudioDisplayScrollPane, descendants: true }], usesInheritance: true, ngImport: i0__namespace, template: "\n\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\n <div class=\"ctrlview\">\n <app-recording-file-meta [sessionId]=\"sessionId\" [recordingFile]=\"recordingFile\"></app-recording-file-meta>\n\n <audio-display-control [audioClip]=\"audioClip\"\n [playStartAction]=\"playStartAction\"\n [playSelectionAction]=\"playSelectionAction\"\n [playStopAction]=\"playStopAction\"\n [autoPlayOnSelectToggleAction]=\"ap?.autoPlayOnSelectToggleAction\"\n [zoomInAction]=\"zoomInAction\"\n [zoomOutAction]=\"zoomOutAction\"\n [zoomSelectedAction]=\"zoomSelectedAction\"\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control>\n <app-recording-file-navi [items]=\"availRecFiles?.length\" [itemPos]=\"posInList\" [version]=\"recordingFile?recordingFile.version:null\" [versions]=\"versions\" [firstAction]=\"firstAction\" [prevAction]=\"prevAction\" [nextAction]=\"nextAction\" [lastAction]=\"lastAction\" [selectVersion]=\"toVersionAction\" [naviInfoLoading]=\"naviInfoLoading\"></app-recording-file-navi>\n </div>\n ", isInline: true, styles: [":host {\n flex: 2;\n display: flex;\n flex-direction: column;\n min-height:0;\n overflow: hidden;\n padding: 20px;\n z-index: 5;\n box-sizing: border-box;\n background-color: white;\n }", "\n .ctrlview{\n display: flex;\n flex-direction: row;\n\n }\n ", "\n audio-display-control{\n\n flex: 3;\n }\n "], components: [{ type: AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: ["audioClip"], outputs: ["zoomInAction", "zoomOutAction", "zoomSelectedAction", "zoomFitToPanelAction"] }, { type: RecordingFileMetaComponent, selector: "app-recording-file-meta", inputs: ["sessionId", "recordingFile"] }, { type: AudioDisplayControl, selector: "audio-display-control", inputs: ["audioClip", "playStartAction", "playSelectionAction", "playStopAction", "zoomInAction", "zoomOutAction", "zoomFitToPanelAction", "zoomSelectedAction", "autoPlayOnSelectToggleAction"] }, { type: RecordingFileNaviComponent, selector: "app-recording-file-navi", inputs: ["firstAction", "prevAction", "nextAction", "lastAction", "items", "itemPos", "selectVersion", "versions", "version", "naviInfoLoading"] }] });
9313
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: RecordingFileViewComponent, decorators: [{
9751
+ RecordingFileViewComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: RecordingFileViewComponent, deps: [{ token: RecordingFileService }, { token: RecordingService }, { token: SessionService }, { token: i1__namespace$1.Router }, { token: i1__namespace$1.ActivatedRoute }, { token: i0__namespace.ChangeDetectorRef }, { token: i0__namespace.ElementRef }, { token: i1__namespace$3.MatDialog }], target: i0__namespace.ɵɵFactoryTarget.Component });
9752
+ RecordingFileViewComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: RecordingFileViewComponent, selector: "app-audiodisplayplayer", viewQueries: [{ propertyName: "ac", first: true, predicate: AudioDisplayScrollPane, descendants: true }], usesInheritance: true, ngImport: i0__namespace, template: "\n\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\n <div class=\"ctrlview\">\n <app-recording-file-meta [sessionId]=\"sessionId\" [recordingFile]=\"recordingFile\"></app-recording-file-meta>\n\n <audio-display-control [audioClip]=\"audioClip\"\n [playStartAction]=\"playStartAction\"\n [playSelectionAction]=\"playSelectionAction\"\n [playStopAction]=\"playStopAction\"\n [autoPlayOnSelectToggleAction]=\"ap?.autoPlayOnSelectToggleAction\"\n [zoomInAction]=\"zoomInAction\"\n [zoomOutAction]=\"zoomOutAction\"\n [zoomSelectedAction]=\"zoomSelectedAction\"\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control>\n <app-recording-file-navi [items]=\"availRecFiles?.length\" [itemPos]=\"posInList\" [version]=\"recordingFile?recordingFile.version:null\" [versions]=\"versions\" [firstAction]=\"firstAction\" [prevAction]=\"prevAction\" [nextAction]=\"nextAction\" [lastAction]=\"lastAction\" [selectVersion]=\"toVersionAction\" [naviInfoLoading]=\"naviInfoLoading\"></app-recording-file-navi>\n </div>\n ", isInline: true, styles: [":host {\n flex: 2;\n display: flex;\n flex-direction: column;\n min-height:0;\n overflow: hidden;\n padding: 20px;\n z-index: 5;\n box-sizing: border-box;\n background-color: white;\n }", "\n .ctrlview{\n display: flex;\n flex-direction: row;\n\n }\n ", "\n audio-display-control{\n\n flex: 3;\n }\n "], components: [{ type: AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: ["audioClip"], outputs: ["zoomInAction", "zoomOutAction", "zoomSelectedAction", "zoomFitToPanelAction"] }, { type: RecordingFileMetaComponent, selector: "app-recording-file-meta", inputs: ["sessionId", "recordingFile"] }, { type: AudioDisplayControl, selector: "audio-display-control", inputs: ["audioClip", "playStartAction", "playSelectionAction", "playStopAction", "zoomInAction", "zoomOutAction", "zoomFitToPanelAction", "zoomSelectedAction", "autoPlayOnSelectToggleAction"] }, { type: RecordingFileNaviComponent, selector: "app-recording-file-navi", inputs: ["firstAction", "prevAction", "nextAction", "lastAction", "items", "itemPos", "selectVersion", "versions", "version", "naviInfoLoading"] }] });
9753
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: RecordingFileViewComponent, decorators: [{
9314
9754
  type: i0.Component,
9315
9755
  args: [{
9316
9756
  selector: 'app-audiodisplayplayer',
@@ -9404,9 +9844,9 @@
9404
9844
  };
9405
9845
  return RecordingFileUI;
9406
9846
  }(RecordingFileViewComponent));
9407
- RecordingFileUI.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: RecordingFileUI, deps: [{ token: RecordingFileService }, { token: RecordingService }, { token: SessionService }, { token: i1__namespace$1.Router }, { token: i1__namespace$1.ActivatedRoute }, { token: i0__namespace.ChangeDetectorRef }, { token: i0__namespace.ElementRef }, { token: i1__namespace$3.MatDialog }, { token: i6__namespace$1.MatSnackBar }], target: i0__namespace.ɵɵFactoryTarget.Component });
9408
- RecordingFileUI.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: RecordingFileUI, selector: "app-audiodisplayplayer", usesInheritance: true, ngImport: i0__namespace, template: "\n <h1>Recording file editing</h1>\n <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>\n\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\n <div class=\"ctrlview\">\n <app-recording-file-meta [sessionId]=\"sessionId\" [recordingFile]=\"recordingFile\"></app-recording-file-meta>\n <audio-display-control [audioClip]=\"audioClip\"\n [playStartAction]=\"playStartAction\"\n [playSelectionAction]=\"playSelectionAction\"\n [playStopAction]=\"playStopAction\"\n [autoPlayOnSelectToggleAction]=\"ap?.autoPlayOnSelectToggleAction\"\n [zoomInAction]=\"zoomInAction\"\n [zoomOutAction]=\"zoomOutAction\"\n [zoomSelectedAction]=\"zoomSelectedAction\"\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control>\n <app-recording-file-navi [items]=\"availRecFiles?.length\" [itemPos]=\"posInList\" [version]=\"recordingFile?recordingFile.version:null\" [versions]=\"versions\" [firstAction]=\"firstAction\" [prevAction]=\"prevAction\" [nextAction]=\"nextAction\" [lastAction]=\"lastAction\" [selectVersion]=\"toVersionAction\" [naviInfoLoading]=\"naviInfoLoading\"></app-recording-file-navi>\n </div>\n\n <button mat-raised-button color=\"accent\" (click)=\"applySelection()\" [disabled]=\"editSaved\">{{this.applyButtonText()}}</button>\n ", isInline: true, styles: [":host {\n flex: 2;\n display: flex;\n flex-direction: column;\n min-height:0;\n overflow: hidden;\n padding: 20px;\n z-index: 5;\n box-sizing: border-box;\n background-color: white;\n }", "\n .ctrlview{\n display: flex;\n flex-direction: row;\n }\n ", "\n audio-display-control{\n\n flex: 3;\n }\n "], components: [{ type: AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: ["audioClip"], outputs: ["zoomInAction", "zoomOutAction", "zoomSelectedAction", "zoomFitToPanelAction"] }, { type: RecordingFileMetaComponent, selector: "app-recording-file-meta", inputs: ["sessionId", "recordingFile"] }, { type: AudioDisplayControl, selector: "audio-display-control", inputs: ["audioClip", "playStartAction", "playSelectionAction", "playStopAction", "zoomInAction", "zoomOutAction", "zoomFitToPanelAction", "zoomSelectedAction", "autoPlayOnSelectToggleAction"] }, { type: RecordingFileNaviComponent, selector: "app-recording-file-navi", inputs: ["firstAction", "prevAction", "nextAction", "lastAction", "items", "itemPos", "selectVersion", "versions", "version", "naviInfoLoading"] }, { type: i3__namespace$1.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"] }] });
9409
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: RecordingFileUI, decorators: [{
9847
+ RecordingFileUI.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: RecordingFileUI, deps: [{ token: RecordingFileService }, { token: RecordingService }, { token: SessionService }, { token: i1__namespace$1.Router }, { token: i1__namespace$1.ActivatedRoute }, { token: i0__namespace.ChangeDetectorRef }, { token: i0__namespace.ElementRef }, { token: i1__namespace$3.MatDialog }, { token: i6__namespace$1.MatSnackBar }], target: i0__namespace.ɵɵFactoryTarget.Component });
9848
+ RecordingFileUI.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.10", type: RecordingFileUI, selector: "app-audiodisplayplayer", usesInheritance: true, ngImport: i0__namespace, template: "\n <h1>Recording file editing</h1>\n <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>\n\n <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>\n <div class=\"ctrlview\">\n <app-recording-file-meta [sessionId]=\"sessionId\" [recordingFile]=\"recordingFile\"></app-recording-file-meta>\n <audio-display-control [audioClip]=\"audioClip\"\n [playStartAction]=\"playStartAction\"\n [playSelectionAction]=\"playSelectionAction\"\n [playStopAction]=\"playStopAction\"\n [autoPlayOnSelectToggleAction]=\"ap?.autoPlayOnSelectToggleAction\"\n [zoomInAction]=\"zoomInAction\"\n [zoomOutAction]=\"zoomOutAction\"\n [zoomSelectedAction]=\"zoomSelectedAction\"\n [zoomFitToPanelAction]=\"zoomFitToPanelAction\"></audio-display-control>\n <app-recording-file-navi [items]=\"availRecFiles?.length\" [itemPos]=\"posInList\" [version]=\"recordingFile?recordingFile.version:null\" [versions]=\"versions\" [firstAction]=\"firstAction\" [prevAction]=\"prevAction\" [nextAction]=\"nextAction\" [lastAction]=\"lastAction\" [selectVersion]=\"toVersionAction\" [naviInfoLoading]=\"naviInfoLoading\"></app-recording-file-navi>\n </div>\n\n <button mat-raised-button color=\"accent\" (click)=\"applySelection()\" [disabled]=\"editSaved\">{{this.applyButtonText()}}</button>\n ", isInline: true, styles: [":host {\n flex: 2;\n display: flex;\n flex-direction: column;\n min-height:0;\n overflow: hidden;\n padding: 20px;\n z-index: 5;\n box-sizing: border-box;\n background-color: white;\n }", "\n .ctrlview{\n display: flex;\n flex-direction: row;\n }\n ", "\n audio-display-control{\n\n flex: 3;\n }\n "], components: [{ type: AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: ["audioClip"], outputs: ["zoomInAction", "zoomOutAction", "zoomSelectedAction", "zoomFitToPanelAction"] }, { type: RecordingFileMetaComponent, selector: "app-recording-file-meta", inputs: ["sessionId", "recordingFile"] }, { type: AudioDisplayControl, selector: "audio-display-control", inputs: ["audioClip", "playStartAction", "playSelectionAction", "playStopAction", "zoomInAction", "zoomOutAction", "zoomFitToPanelAction", "zoomSelectedAction", "autoPlayOnSelectToggleAction"] }, { type: RecordingFileNaviComponent, selector: "app-recording-file-navi", inputs: ["firstAction", "prevAction", "nextAction", "lastAction", "items", "itemPos", "selectVersion", "versions", "version", "naviInfoLoading"] }, { type: i3__namespace$1.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"] }] });
9849
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: RecordingFileUI, decorators: [{
9410
9850
  type: i0.Component,
9411
9851
  args: [{
9412
9852
  selector: 'app-audiodisplayplayer',
@@ -9447,11 +9887,11 @@
9447
9887
  };
9448
9888
  return SpeechrecorderngModule;
9449
9889
  }());
9450
- SpeechrecorderngModule.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SpeechrecorderngModule, deps: [], target: i0__namespace.ɵɵFactoryTarget.NgModule });
9451
- SpeechrecorderngModule.ɵmod = i0__namespace.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SpeechrecorderngModule, declarations: [AudioSignal, Sonagram, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar, Progress, SimpleTrafficLight, Recinstructions, Prompter, PromptContainer, PromptingContainer, Prompting, StatusDisplay,
9890
+ SpeechrecorderngModule.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SpeechrecorderngModule, deps: [], target: i0__namespace.ɵɵFactoryTarget.NgModule });
9891
+ SpeechrecorderngModule.ɵmod = i0__namespace.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SpeechrecorderngModule, declarations: [AudioSignal, Sonagram, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar, Progress, SimpleTrafficLight, Recinstructions, Prompter, PromptContainer, PromptingContainer, Prompting, StatusDisplay,
9452
9892
  ProgressDisplay, LevelBarDisplay, UploadStatus, TransportPanel, ControlPanel, WarningBar, SessionManager, MessageDialog, SessionFinishedDialog, SpeechrecorderngComponent, RecordingFileViewComponent, RecordingFileUI, ScrollIntoViewDirective, RecordingFileNaviComponent, RecordingFileMetaComponent], imports: [i1__namespace$1.RouterModule, flexLayout.FlexLayoutModule, i4.CommonModule, i2.MatIconModule, i3$1.MatButtonModule, i1$3.MatDialogModule, i7.MatProgressBarModule, i1$2.MatProgressSpinnerModule, i3.MatTooltipModule, i1.HttpClientModule, i2$1.MatCheckboxModule, i1$4.MatCardModule, divider.MatDividerModule, gridList.MatGridListModule, table.MatTableModule, input.MatInputModule, select.MatSelectModule, i6$1.MatSnackBarModule], exports: [MessageDialog, SpeechrecorderngComponent, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar] });
9453
- SpeechrecorderngModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SpeechrecorderngModule, providers: [SessionService, ProjectService, ScriptService, RecordingService, RecordingFileService, SpeechRecorderUploader], imports: [[i1$1.RouterModule.forChild(SPR_ROUTES), flexLayout.FlexLayoutModule, i4.CommonModule, i2.MatIconModule, i3$1.MatButtonModule, i1$3.MatDialogModule, i7.MatProgressBarModule, i1$2.MatProgressSpinnerModule, i3.MatTooltipModule, i1.HttpClientModule, i2$1.MatCheckboxModule, i1$4.MatCardModule, divider.MatDividerModule, gridList.MatGridListModule, table.MatTableModule, input.MatInputModule, select.MatSelectModule, i6$1.MatSnackBarModule]] });
9454
- i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0__namespace, type: SpeechrecorderngModule, decorators: [{
9893
+ SpeechrecorderngModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SpeechrecorderngModule, providers: [SessionService, ProjectService, ScriptService, RecordingService, RecordingFileService, SpeechRecorderUploader], imports: [[i1$1.RouterModule.forChild(SPR_ROUTES), flexLayout.FlexLayoutModule, i4.CommonModule, i2.MatIconModule, i3$1.MatButtonModule, i1$3.MatDialogModule, i7.MatProgressBarModule, i1$2.MatProgressSpinnerModule, i3.MatTooltipModule, i1.HttpClientModule, i2$1.MatCheckboxModule, i1$4.MatCardModule, divider.MatDividerModule, gridList.MatGridListModule, table.MatTableModule, input.MatInputModule, select.MatSelectModule, i6$1.MatSnackBarModule]] });
9894
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0__namespace, type: SpeechrecorderngModule, decorators: [{
9455
9895
  type: i0.NgModule,
9456
9896
  args: [{
9457
9897
  declarations: [AudioSignal, Sonagram, ScrollPaneHorizontal, AudioClipUIContainer, AudioDisplayScrollPane, AudioDisplay, AudioDisplayPlayer, AudioDisplayControl, LevelBar, Progress, SimpleTrafficLight, Recinstructions, Prompter, PromptContainer, PromptingContainer, Prompting, StatusDisplay,
@@ -9465,7 +9905,7 @@
9465
9905
  }]
9466
9906
  }] });
9467
9907
 
9468
- var VERSION = '2.18.10';
9908
+ var VERSION = '2.19.0';
9469
9909
 
9470
9910
  /*
9471
9911
  * Public API Surface of speechrecorderng