speechrecorderng 3.6.0 → 3.8.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 (220) hide show
  1. package/esm2022/lib/action/action.mjs +73 -0
  2. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer.mjs +163 -163
  3. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_input_stream.mjs +85 -85
  4. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_random_access_stream.mjs +15 -15
  5. package/esm2022/lib/audio/audio_data_holder.mjs +264 -0
  6. package/{esm2020 → esm2022}/lib/audio/audio_display.mjs +93 -93
  7. package/{esm2020 → esm2022}/lib/audio/audio_player.mjs +213 -213
  8. package/esm2022/lib/audio/capture/capture.mjs +855 -0
  9. package/esm2022/lib/audio/context.mjs +79 -0
  10. package/{esm2020 → esm2022}/lib/audio/dsp/level_measure.mjs +515 -515
  11. package/{esm2020 → esm2022}/lib/audio/format.mjs +16 -16
  12. package/esm2022/lib/audio/impl/wavformat.mjs +6 -0
  13. package/{esm2020 → esm2022}/lib/audio/impl/wavreader.mjs +133 -133
  14. package/esm2022/lib/audio/impl/wavwriter.mjs +105 -0
  15. package/esm2022/lib/audio/inddb_audio_buffer.mjs +508 -0
  16. package/{esm2020 → esm2022}/lib/audio/io/stream.mjs +58 -58
  17. package/esm2022/lib/audio/net_audio_buffer.mjs +293 -0
  18. package/{esm2020 → esm2022}/lib/audio/persistor.mjs +80 -80
  19. package/{esm2020 → esm2022}/lib/audio/playback/array_audio_buffer_source_node.mjs +125 -125
  20. package/esm2022/lib/audio/playback/audio_source_node.mjs +18 -0
  21. package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  22. package/{esm2020 → esm2022}/lib/audio/playback/inddb_audio_buffer_source_node.mjs +166 -166
  23. package/{esm2020 → esm2022}/lib/audio/playback/net_audio_buffer_source_node.mjs +217 -217
  24. package/esm2022/lib/audio/playback/player.mjs +402 -0
  25. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +347 -0
  26. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_control.mjs +65 -65
  27. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_scroll_pane.mjs +139 -139
  28. package/{esm2020 → esm2022}/lib/audio/ui/audiosignal.mjs +524 -524
  29. package/{esm2020 → esm2022}/lib/audio/ui/common.mjs +18 -18
  30. package/esm2022/lib/audio/ui/container.mjs +414 -0
  31. package/{esm2020 → esm2022}/lib/audio/ui/livelevel.mjs +352 -352
  32. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +11 -0
  33. package/esm2022/lib/audio/ui/sonagram.mjs +900 -0
  34. package/esm2022/lib/db/inddb.mjs +120 -0
  35. package/esm2022/lib/dsp/utils.mjs +48 -0
  36. package/{esm2020 → esm2022}/lib/io/BinaryReader.mjs +84 -84
  37. package/esm2022/lib/io/BinaryWriter.mjs +74 -0
  38. package/{esm2020 → esm2022}/lib/io/stream.mjs +258 -258
  39. package/{esm2020 → esm2022}/lib/math/2d/geometry.mjs +27 -27
  40. package/esm2022/lib/math/complex.mjs +58 -0
  41. package/{esm2020 → esm2022}/lib/math/dft.mjs +195 -195
  42. package/{esm2020 → esm2022}/lib/media/utils.mjs +13 -13
  43. package/esm2022/lib/net/uploader.mjs +367 -0
  44. package/{esm2020 → esm2022}/lib/recorder_component.mjs +64 -64
  45. package/esm2022/lib/speechrecorder/project/project.mjs +49 -0
  46. package/esm2022/lib/speechrecorder/project/project.service.mjs +64 -0
  47. package/{esm2020 → esm2022}/lib/speechrecorder/recording.mjs +123 -123
  48. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +218 -0
  49. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +1014 -0
  50. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.mjs +114 -114
  51. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.service.mjs +47 -47
  52. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +1179 -0
  53. package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +668 -0
  54. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +416 -0
  55. package/{esm2020 → esm2022}/lib/speechrecorder/session/item.mjs +29 -29
  56. package/{esm2020 → esm2022}/lib/speechrecorder/session/progress.mjs +69 -69
  57. package/{esm2020 → esm2022}/lib/speechrecorder/session/prompting.mjs +571 -571
  58. package/{esm2020 → esm2022}/lib/speechrecorder/session/recorder_combi_pane.mjs +65 -65
  59. package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +195 -0
  60. package/{esm2020 → esm2022}/lib/speechrecorder/session/recording_list.mjs +103 -103
  61. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +63 -63
  62. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +51 -51
  63. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +104 -104
  64. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +381 -381
  65. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file.mjs +67 -67
  66. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +288 -0
  67. package/{esm2020 → esm2022}/lib/speechrecorder/session/session.mjs +1 -1
  68. package/esm2022/lib/speechrecorder/session/session.service.mjs +69 -0
  69. package/{esm2020 → esm2022}/lib/speechrecorder/session/session_finished_dialog.mjs +29 -29
  70. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +1386 -0
  71. package/{esm2020 → esm2022}/lib/speechrecorder/session/warning_bar.mjs +28 -28
  72. package/{esm2020 → esm2022}/lib/speechrecorder/spruploader.mjs +22 -22
  73. package/{esm2020 → esm2022}/lib/speechrecorder/startstopsignal/startstopsignal.mjs +1 -1
  74. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +57 -0
  75. package/{esm2020 → esm2022}/lib/speechrecorderng.component.mjs +388 -388
  76. package/{esm2020 → esm2022}/lib/speechrecorderng.module.mjs +100 -100
  77. package/{esm2020 → esm2022}/lib/spr.config.mjs +26 -26
  78. package/{esm2020 → esm2022}/lib/spr.module.version.mjs +2 -2
  79. package/{esm2020 → esm2022}/lib/ui/canvas_layer_comp.mjs +38 -38
  80. package/{esm2020 → esm2022}/lib/ui/message_dialog.mjs +30 -30
  81. package/esm2022/lib/ui/recordingitem_display.mjs +253 -0
  82. package/{esm2020 → esm2022}/lib/ui/responsive_component.mjs +24 -24
  83. package/{esm2020 → esm2022}/lib/utils/scrollIntoViewToBottom.mjs +23 -23
  84. package/esm2022/lib/utils/ua-parser.mjs +190 -0
  85. package/esm2022/lib/utils/utils.mjs +105 -0
  86. package/esm2022/lib/utils/wake_lock.mjs +114 -0
  87. package/{esm2020 → esm2022}/lib/utils/wake_lock_media.mjs +1 -1
  88. package/{esm2020 → esm2022}/public-api.mjs +33 -33
  89. package/{esm2020 → esm2022}/speechrecorderng.mjs +4 -4
  90. package/{fesm2020 → fesm2022}/speechrecorderng.mjs +16518 -16454
  91. package/fesm2022/speechrecorderng.mjs.map +1 -0
  92. package/index.d.ts +5 -5
  93. package/lib/action/action.d.ts +27 -27
  94. package/lib/audio/array_audio_buffer.d.ts +31 -31
  95. package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -14
  96. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -9
  97. package/lib/audio/audio_data_holder.d.ts +84 -84
  98. package/lib/audio/audio_display.d.ts +36 -36
  99. package/lib/audio/audio_player.d.ts +47 -47
  100. package/lib/audio/capture/capture.d.ts +67 -67
  101. package/lib/audio/context.d.ts +6 -6
  102. package/lib/audio/dsp/level_measure.d.ts +60 -60
  103. package/lib/audio/format.d.ts +11 -11
  104. package/lib/audio/impl/wavformat.d.ts +5 -5
  105. package/lib/audio/impl/wavreader.d.ts +16 -16
  106. package/lib/audio/impl/wavwriter.d.ts +13 -13
  107. package/lib/audio/inddb_audio_buffer.d.ts +68 -68
  108. package/lib/audio/io/stream.d.ts +28 -28
  109. package/lib/audio/net_audio_buffer.d.ts +57 -57
  110. package/lib/audio/persistor.d.ts +29 -29
  111. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +18 -18
  112. package/lib/audio/playback/audio_source_node.d.ts +10 -10
  113. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -4
  114. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -21
  115. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -27
  116. package/lib/audio/playback/player.d.ts +65 -65
  117. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +68 -68
  118. package/lib/audio/ui/audio_display_control.d.ts +25 -25
  119. package/lib/audio/ui/audio_display_scroll_pane.d.ts +26 -26
  120. package/lib/audio/ui/audiosignal.d.ts +30 -30
  121. package/lib/audio/ui/common.d.ts +11 -11
  122. package/lib/audio/ui/container.d.ts +63 -63
  123. package/lib/audio/ui/livelevel.d.ts +60 -60
  124. package/lib/audio/ui/scroll_pane_horizontal.d.ts +5 -5
  125. package/lib/audio/ui/sonagram.d.ts +37 -37
  126. package/lib/db/inddb.d.ts +21 -21
  127. package/lib/dsp/utils.d.ts +19 -19
  128. package/lib/io/BinaryReader.d.ts +18 -18
  129. package/lib/io/BinaryWriter.d.ts +15 -15
  130. package/lib/io/stream.d.ts +59 -59
  131. package/lib/math/2d/geometry.d.ts +18 -18
  132. package/lib/math/complex.d.ts +17 -17
  133. package/lib/math/dft.d.ts +22 -22
  134. package/lib/media/utils.d.ts +3 -3
  135. package/lib/net/uploader.d.ts +81 -81
  136. package/lib/recorder_component.d.ts +16 -16
  137. package/lib/speechrecorder/project/project.d.ts +59 -59
  138. package/lib/speechrecorder/project/project.service.d.ts +21 -21
  139. package/lib/speechrecorder/recording.d.ts +51 -51
  140. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -27
  141. package/lib/speechrecorder/recordings/recordings.service.d.ts +48 -48
  142. package/lib/speechrecorder/script/script.d.ts +80 -79
  143. package/lib/speechrecorder/script/script.service.d.ts +16 -16
  144. package/lib/speechrecorder/session/audiorecorder.d.ts +122 -122
  145. package/lib/speechrecorder/session/basicrecorder.d.ts +139 -139
  146. package/lib/speechrecorder/session/controlpanel.d.ts +109 -107
  147. package/lib/speechrecorder/session/item.d.ts +12 -12
  148. package/lib/speechrecorder/session/progress.d.ts +17 -17
  149. package/lib/speechrecorder/session/prompting.d.ts +121 -121
  150. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +32 -32
  151. package/lib/speechrecorder/session/recording_file_cache.d.ts +33 -33
  152. package/lib/speechrecorder/session/recording_list.d.ts +24 -24
  153. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +15 -15
  154. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +20 -20
  155. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +31 -31
  156. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +55 -55
  157. package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +7 -7
  158. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +24 -24
  159. package/lib/speechrecorder/session/session.d.ts +15 -15
  160. package/lib/speechrecorder/session/session.service.d.ts +20 -20
  161. package/lib/speechrecorder/session/session_finished_dialog.d.ts +10 -10
  162. package/lib/speechrecorder/session/sessionmanager.d.ts +129 -123
  163. package/lib/speechrecorder/session/warning_bar.d.ts +8 -8
  164. package/lib/speechrecorder/spruploader.d.ts +11 -11
  165. package/lib/speechrecorder/startstopsignal/startstopsignal.d.ts +10 -10
  166. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +11 -11
  167. package/lib/speechrecorderng.component.d.ts +61 -61
  168. package/lib/speechrecorderng.module.d.ts +56 -56
  169. package/lib/spr.config.d.ts +17 -17
  170. package/lib/spr.module.version.d.ts +1 -1
  171. package/lib/ui/canvas_layer_comp.d.ts +13 -13
  172. package/lib/ui/message_dialog.d.ts +10 -10
  173. package/lib/ui/recordingitem_display.d.ts +84 -84
  174. package/lib/ui/responsive_component.d.ts +9 -9
  175. package/lib/utils/scrollIntoViewToBottom.d.ts +9 -9
  176. package/lib/utils/ua-parser.d.ts +43 -43
  177. package/lib/utils/utils.d.ts +19 -19
  178. package/lib/utils/wake_lock.d.ts +23 -23
  179. package/lib/utils/wake_lock_media.d.ts +1 -1
  180. package/package.json +17 -23
  181. package/public-api.d.ts +33 -33
  182. package/esm2020/lib/action/action.mjs +0 -73
  183. package/esm2020/lib/audio/audio_data_holder.mjs +0 -264
  184. package/esm2020/lib/audio/capture/capture.mjs +0 -855
  185. package/esm2020/lib/audio/context.mjs +0 -79
  186. package/esm2020/lib/audio/impl/wavformat.mjs +0 -6
  187. package/esm2020/lib/audio/impl/wavwriter.mjs +0 -105
  188. package/esm2020/lib/audio/inddb_audio_buffer.mjs +0 -508
  189. package/esm2020/lib/audio/net_audio_buffer.mjs +0 -293
  190. package/esm2020/lib/audio/playback/audio_source_node.mjs +0 -18
  191. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
  192. package/esm2020/lib/audio/playback/player.mjs +0 -402
  193. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
  194. package/esm2020/lib/audio/ui/container.mjs +0 -414
  195. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
  196. package/esm2020/lib/audio/ui/sonagram.mjs +0 -900
  197. package/esm2020/lib/db/inddb.mjs +0 -120
  198. package/esm2020/lib/dsp/utils.mjs +0 -48
  199. package/esm2020/lib/io/BinaryWriter.mjs +0 -74
  200. package/esm2020/lib/math/complex.mjs +0 -58
  201. package/esm2020/lib/net/uploader.mjs +0 -367
  202. package/esm2020/lib/speechrecorder/project/project.mjs +0 -49
  203. package/esm2020/lib/speechrecorder/project/project.service.mjs +0 -64
  204. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -216
  205. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
  206. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
  207. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +0 -666
  208. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +0 -409
  209. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
  210. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
  211. package/esm2020/lib/speechrecorder/session/session.service.mjs +0 -69
  212. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +0 -1333
  213. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
  214. package/esm2020/lib/ui/recordingitem_display.mjs +0 -253
  215. package/esm2020/lib/utils/ua-parser.mjs +0 -190
  216. package/esm2020/lib/utils/utils.mjs +0 -105
  217. package/esm2020/lib/utils/wake_lock.mjs +0 -114
  218. package/fesm2015/speechrecorderng.mjs +0 -17708
  219. package/fesm2015/speechrecorderng.mjs.map +0 -1
  220. package/fesm2020/speechrecorderng.mjs.map +0 -1
@@ -1,293 +0,0 @@
1
- import { Observable } from "rxjs";
2
- import { BasicAudioSource } from "./audio_data_holder";
3
- import { HttpErrorResponse } from "@angular/common/http";
4
- export class NetAudioBuffer extends BasicAudioSource {
5
- constructor(_recFileService, _baseUrl, _channelCount, _sampleRate, _chunkFrameLen, _frameLen, _uuid = null, _orgFetchChunkFrameLen = _chunkFrameLen) {
6
- super();
7
- this._recFileService = _recFileService;
8
- this._baseUrl = _baseUrl;
9
- this._channelCount = _channelCount;
10
- this._sampleRate = _sampleRate;
11
- this._chunkFrameLen = _chunkFrameLen;
12
- this._frameLen = _frameLen;
13
- this._uuid = _uuid;
14
- this._orgFetchChunkFrameLen = _orgFetchChunkFrameLen;
15
- this._chunkCount = 0;
16
- this._sealed = false;
17
- }
18
- get orgFetchChunkFrameLen() {
19
- return this._orgFetchChunkFrameLen;
20
- }
21
- get recFileService() {
22
- return this._recFileService;
23
- }
24
- get baseUrl() {
25
- return this._baseUrl;
26
- }
27
- get chunkFrameLen() {
28
- return this._chunkFrameLen;
29
- }
30
- get uuid() {
31
- return this._uuid;
32
- }
33
- get channelCount() {
34
- return this._channelCount;
35
- }
36
- sealed() {
37
- return this._sealed;
38
- }
39
- seal() {
40
- this._sealed = true;
41
- }
42
- get sampleRate() {
43
- return this._sampleRate;
44
- }
45
- get frameLen() {
46
- return this._frameLen;
47
- }
48
- get chunkCount() {
49
- return this._chunkCount;
50
- }
51
- releaseAudioData() {
52
- return new Observable((subscriber) => {
53
- // nothing to remove
54
- subscriber.next();
55
- subscriber.complete();
56
- });
57
- }
58
- toString() {
59
- return "Indexed db audio buffer. Channels: " + this.channelCount + ", sample rate: " + this.sampleRate + ", chunk frame length: " + this._chunkFrameLen + ", number of chunks: " + this.chunkCount + ", frame length: " + this.frameLen + ", sealed: " + this.sealed();
60
- }
61
- static fromChunkAudioBuffer(recordingsService, baseUrl, ab, frameLen, orgFetchChunkFrameLen = ab.length) {
62
- let nab = new NetAudioBuffer(recordingsService, baseUrl, ab.numberOfChannels, ab.sampleRate, ab.length, frameLen, null, orgFetchChunkFrameLen);
63
- nab.ready();
64
- return nab;
65
- }
66
- asyncAudioInputStream() {
67
- return new NetAudioInputStream(this);
68
- }
69
- audioInputStream() {
70
- return null;
71
- }
72
- get duration() {
73
- return this._frameLen / this._sampleRate;
74
- }
75
- get numberOfChannels() {
76
- return this._channelCount;
77
- }
78
- sampleCounts() {
79
- return this._channelCount * this._frameLen;
80
- }
81
- randomAccessAudioStream() {
82
- return new NetRandomAccessAudioStream(this);
83
- }
84
- }
85
- // export class NetAudioChunk{
86
- //
87
- // get orgSampleRate(): number {
88
- // return this._orgSampleRate;
89
- // }
90
- //
91
- // get orgFrameLen(): number {
92
- // return this._orgFrameLen;
93
- // }
94
- // constructor(private _decodedBuffers:Float32Array[],private _orgSampleRate:number,private _orgFrameLen:number) {
95
- // }
96
- // }
97
- export class NetRandomAccessAudioStream {
98
- constructor(_netAb) {
99
- this._netAb = _netAb;
100
- this._currCi = 0;
101
- this._ccCache = null;
102
- }
103
- chunk(baseUrl, ci, cb, errCb) {
104
- let startFrame = ci * this._netAb.orgFetchChunkFrameLen;
105
- this._netAb.recFileService.chunkAudioRequest(baseUrl, startFrame, this._netAb.orgFetchChunkFrameLen).subscribe({
106
- next: (chDl) => {
107
- if (chDl) {
108
- const ab = chDl.decodedAudioBuffer;
109
- const ccChs = ab.numberOfChannels;
110
- let arrBuf = new Array();
111
- for (let ch = 0; ch < ccChs; ch++) {
112
- arrBuf.push(ab.getChannelData(ch));
113
- }
114
- cb(arrBuf, chDl.orgFrameLength);
115
- }
116
- else {
117
- cb(null, null);
118
- }
119
- },
120
- complete: () => { },
121
- error: (errEv) => {
122
- //NetRandomAccessAudioStream._runningRequests--;
123
- if (errEv instanceof HttpErrorResponse) {
124
- if (errEv.status === 404) {
125
- cb(null, null);
126
- }
127
- else {
128
- console.error("Net audio buffer chunk audio request Http error event: " + errEv.status + ", " + errEv.name + ", " + errEv.message);
129
- errCb(new Error(errEv.toString()));
130
- }
131
- }
132
- else {
133
- console.error("Net audio buffer chunk audio request error event: " + errEv.message);
134
- errCb(new Error(errEv.toString()));
135
- }
136
- }
137
- });
138
- }
139
- _fillBufs(ccBufs, orgFrameLen, trgState, srcState) {
140
- let ccBufsChs = ccBufs.length;
141
- if (ccBufsChs > 0) {
142
- let ccBuf0 = ccBufs[0];
143
- let ccBufsLen = ccBuf0.length;
144
- //console.debug('IndexedDbAudioBuffer::fillBufs framePos: '+framePos+', srcFramePos: '+srcFramePos+', ccBufsLen: '+ccBufsLen);
145
- if (trgState.framePos >= srcState.srcFramePos + ccBufsLen) {
146
- // target frame position is ahead, seek to next source buffer
147
- //console.debug('IndexedDbAudioBuffer::fillBufs seek to next inddb buffer');
148
- this._ccCache = null;
149
- srcState.ci++;
150
- srcState.ccPos = 0;
151
- if (orgFrameLen === null) {
152
- srcState.orgSrcFramePos += ccBufsLen;
153
- }
154
- else {
155
- srcState.orgSrcFramePos += orgFrameLen;
156
- }
157
- srcState.srcFramePos += ccBufsLen;
158
- }
159
- else {
160
- // Assuming target frame pos is inside current source buffer
161
- srcState.ccPos = trgState.framePos - srcState.srcFramePos;
162
- let ccAvail = ccBufsLen - srcState.ccPos;
163
- let toCopy = ccBufsLen;
164
- if (toCopy > ccAvail) {
165
- toCopy = ccAvail;
166
- }
167
- if (toCopy > trgState.frameLen) {
168
- toCopy = trgState.frameLen;
169
- }
170
- for (let ch = 0; ch < ccBufsChs; ch++) {
171
- for (let si = 0; si < toCopy; si++) {
172
- trgState.trgBufs[ch][trgState.filled + si] = ccBufs[ch][srcState.ccPos + si];
173
- }
174
- }
175
- trgState.filled += toCopy;
176
- trgState.frameLen -= toCopy;
177
- trgState.framePos += toCopy;
178
- srcState.ccPos += toCopy;
179
- if (srcState.ccPos >= ccBufsLen) {
180
- // Invalidate cache
181
- this._ccCache = null;
182
- srcState.ci++;
183
- this._currCi = srcState.ci;
184
- srcState.ccPos = 0;
185
- if (orgFrameLen === null) {
186
- srcState.orgSrcFramePos += ccBufsLen;
187
- }
188
- else {
189
- srcState.orgSrcFramePos += orgFrameLen;
190
- }
191
- srcState.srcFramePos += ccBufsLen;
192
- }
193
- }
194
- }
195
- }
196
- fillBufs(baseUrl, orgFrameLen, trgState, srcState, cb, cbEnd, cbErr) {
197
- //console.debug('IndexedDbAudioBuffer::fillBufs: framePos:'+framePos+', frameLen: '+frameLen+', filled: '+filled+', srcFramePos: '+srcFramePos+',ci: '+ci+', ccPos: '+ccPos);
198
- if (this._ccCache) {
199
- this._fillBufs(this._ccCache, orgFrameLen, trgState, srcState);
200
- //console.debug('IndexedDbAudioBuffer::fillBufs frameLen: '+frameLen);
201
- if (trgState.frameLen === 0) {
202
- //console.debug('IndexedDbAudioBuffer::fillBufs (framelen==0) call: cbend '+filled);
203
- cbEnd(trgState.filled);
204
- }
205
- else {
206
- this.fillBufs(baseUrl, orgFrameLen, trgState, srcState, cb, cbEnd, cbErr);
207
- }
208
- }
209
- else {
210
- this.chunk(baseUrl, srcState.ci, (ccBufs, orgFrameLength) => {
211
- if (ccBufs) {
212
- this._currCi = srcState.ci;
213
- this._ccCache = ccBufs;
214
- this._fillBufs(ccBufs, orgFrameLength, trgState, srcState);
215
- //console.debug('IndexedDbAudioBuffer::fillBufs frameLen: '+frameLen);
216
- if (trgState.frameLen === 0) {
217
- //console.debug('IndexedDbAudioBuffer::fillBufs (framelen==0) call: cbend '+filled);
218
- cbEnd(trgState.filled);
219
- }
220
- else {
221
- this.fillBufs(baseUrl, orgFrameLen, trgState, srcState, cb, cbEnd, cbErr);
222
- }
223
- }
224
- else {
225
- //console.debug('IndexedDbAudioBuffer::fillBufs (chunk not found) call: cbend '+filled);
226
- cbEnd(trgState.filled);
227
- }
228
- }, (err) => {
229
- cbErr(err);
230
- });
231
- }
232
- }
233
- framesObs(framePos, frameLen, bufs) {
234
- return new Observable((subscriber) => {
235
- // Positioning
236
- let newCi = Math.floor(framePos / this._netAb.chunkFrameLen);
237
- if (newCi !== this._currCi) {
238
- this._currCi = newCi;
239
- this._ccCache = null;
240
- }
241
- let srcFramePos = newCi * this._netAb.chunkFrameLen;
242
- let trgState = { framePos: framePos, frameLen: frameLen, trgBufs: bufs, filled: 0 };
243
- let srcState = { orgSrcFramePos: 0, srcFramePos: srcFramePos, ci: newCi, ccPos: 0, ccFilled: 0 };
244
- this.fillBufs(this._netAb.baseUrl, this._netAb.orgFetchChunkFrameLen, trgState, srcState, (val) => { }, (filled) => {
245
- subscriber.next(filled);
246
- subscriber.complete();
247
- }, err => {
248
- subscriber.error(err);
249
- });
250
- });
251
- }
252
- close() {
253
- this._currCi = 0;
254
- this._ccCache = null;
255
- }
256
- }
257
- export class NetAudioInputStream {
258
- constructor(netAb) {
259
- this.netAb = netAb;
260
- this.framePos = 0;
261
- this.netAbStr = new NetRandomAccessAudioStream(netAb);
262
- }
263
- close() {
264
- this.netAbStr.close();
265
- }
266
- readObs(buffers) {
267
- return new Observable(subscr => {
268
- if (buffers && buffers.length > 0) {
269
- let fl = buffers[0].length;
270
- this.netAbStr.framesObs(this.framePos, fl, buffers).subscribe({
271
- next: (read) => {
272
- this.framePos += read;
273
- subscr.next(read);
274
- },
275
- complete: () => {
276
- subscr.complete();
277
- },
278
- error: (err) => {
279
- subscr.error(err);
280
- }
281
- });
282
- }
283
- else {
284
- subscr.next(0);
285
- subscr.complete();
286
- }
287
- });
288
- }
289
- skipFrames(n) {
290
- this.framePos += n;
291
- }
292
- }
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0X2F1ZGlvX2J1ZmZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9uZXRfYXVkaW9fYnVmZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFaEMsT0FBTyxFQUFjLGdCQUFnQixFQUEwQixNQUFNLHFCQUFxQixDQUFDO0FBQzNGLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBSXZELE1BQU0sT0FBTyxjQUFlLFNBQVEsZ0JBQWdCO0lBc0JsRCxZQUNvQixlQUFxQyxFQUNyQyxRQUFlLEVBQ2YsYUFBcUIsRUFDckIsV0FBbUIsRUFDbkIsY0FBcUIsRUFDckIsU0FBZ0IsRUFDaEIsUUFBa0IsSUFBSSxFQUN0Qix5QkFBdUIsY0FBYztRQUN2RCxLQUFLLEVBQUUsQ0FBQztRQVJVLG9CQUFlLEdBQWYsZUFBZSxDQUFzQjtRQUNyQyxhQUFRLEdBQVIsUUFBUSxDQUFPO1FBQ2Ysa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDckIsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDbkIsbUJBQWMsR0FBZCxjQUFjLENBQU87UUFDckIsY0FBUyxHQUFULFNBQVMsQ0FBTztRQUNoQixVQUFLLEdBQUwsS0FBSyxDQUFpQjtRQUN0QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQWU7UUFYakQsZ0JBQVcsR0FBQyxDQUFDLENBQUM7UUFDZCxZQUFPLEdBQUMsS0FBSyxDQUFDO0lBYXRCLENBQUM7SUEvQkQsSUFBSSxxQkFBcUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztJQUNELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFD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Q0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELE9BQU8sQ0FBQyxPQUE0QjtRQUNsQyxPQUFPLElBQUksVUFBVSxDQUFTLE1BQU0sQ0FBQSxFQUFFO1lBQ3BDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNqQyxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQzVELElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO3dCQUNiLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDO3dCQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNwQixDQUFDO29CQUNELFFBQVEsRUFBRSxHQUFHLEVBQUU7d0JBQ2IsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNwQixDQUFDO29CQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3BCLENBQUM7aUJBQ0YsQ0FBQyxDQUFBO2FBQ0g7aUJBQUk7Z0JBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDZixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDbkI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsQ0FBUztRQUNsQixJQUFJLENBQUMsUUFBUSxJQUFFLENBQUMsQ0FBQztJQUNuQixDQUFDO0NBR0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09ic2VydmFibGV9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7QXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSwgRmxvYXQzMkFycmF5SW5wdXRTdHJlYW19IGZyb20gXCIuLi9pby9zdHJlYW1cIjtcclxuaW1wb3J0IHtBdWRpb1NvdXJjZSwgQmFzaWNBdWRpb1NvdXJjZSwgUmFuZG9tQWNjZXNzQXVkaW9TdHJlYW19IGZyb20gXCIuL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcbmltcG9ydCB7SHR0cEVycm9yUmVzcG9uc2V9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQge0Jhc2ljUmVjb3JkaW5nU2VydmljZX0gZnJvbSBcIi4uL3NwZWVjaHJlY29yZGVyL3JlY29yZGluZ3MvYmFzaWNfcmVjb3JkaW5nLnNlcnZpY2VcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTmV0QXVkaW9CdWZmZXIgZXh0ZW5kcyBCYXNpY0F1ZGlvU291cmNlIGltcGxlbWVudHMgQXVkaW9Tb3VyY2V7XHJcblxyXG4gIGdldCBvcmdGZXRjaENodW5rRnJhbWVMZW4oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9vcmdGZXRjaENodW5rRnJhbWVMZW47XHJcbiAgfVxyXG4gIGdldCByZWNGaWxlU2VydmljZSgpOiBCYXNpY1JlY29yZGluZ1NlcnZpY2Uge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY0ZpbGVTZXJ2aWNlO1xyXG4gIH1cclxuICBnZXQgYmFzZVVybCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Jhc2VVcmw7XHJcbiAgfVxyXG4gIGdldCBjaHVua0ZyYW1lTGVuKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2h1bmtGcmFtZUxlbjtcclxuICB9XHJcblxyXG4gIGdldCB1dWlkKCk6IHN0cmluZ3xudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl91dWlkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2h1bmtDb3VudD0wO1xyXG4gIHByaXZhdGUgX3NlYWxlZD1mYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfcmVjRmlsZVNlcnZpY2U6QmFzaWNSZWNvcmRpbmdTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX2Jhc2VVcmw6c3RyaW5nLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NoYW5uZWxDb3VudDogbnVtYmVyLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX3NhbXBsZVJhdGU6IG51bWJlcixcclxuICAgICAgICAgICAgICBwcml2YXRlIF9jaHVua0ZyYW1lTGVuOm51bWJlcixcclxuICAgICAgICAgICAgICBwcml2YXRlIF9mcmFtZUxlbjpudW1iZXIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdXVpZDpzdHJpbmd8bnVsbD1udWxsLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX29yZ0ZldGNoQ2h1bmtGcmFtZUxlbj1fY2h1bmtGcmFtZUxlbikge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXQgY2hhbm5lbENvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hhbm5lbENvdW50O1xyXG4gIH1cclxuXHJcbiAgc2VhbGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlYWxlZDtcclxuICB9XHJcblxyXG4gIHNlYWwoKTp2b2lke1xyXG4gICAgdGhpcy5fc2VhbGVkPXRydWU7XHJcbiAgfVxyXG5cclxuICBnZXQgc2FtcGxlUmF0ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NhbXBsZVJhdGU7XHJcbiAgfVxyXG5cclxuICBnZXQgZnJhbWVMZW4oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9mcmFtZUxlbjtcclxuICB9XHJcblxyXG4gIGdldCBjaHVua0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2h1bmtDb3VudDtcclxuICB9XHJcblxyXG4gIHJlbGVhc2VBdWRpb0RhdGEoKTpPYnNlcnZhYmxlPHZvaWQ+e1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHZvaWQ+KChzdWJzY3JpYmVyKT0+e1xyXG4gICAgICAgIC8vIG5vdGhpbmcgdG8gcmVtb3ZlXHJcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XHJcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOnN0cmluZ3tcclxuICAgIHJldHVybiBcIkluZGV4ZWQgZGIgYXVkaW8gYnVmZmVyLiBDaGFubmVsczogXCIrdGhpcy5jaGFubmVsQ291bnQrXCIsIHNhbXBsZSByYXRlOiBcIit0aGlzLnNhbXBsZVJhdGUrXCIsIGNodW5rIGZyYW1lIGxlbmd0aDogXCIrdGhpcy5fY2h1bmtGcmFtZUxlbitcIiwgbnVtYmVyIG9mIGNodW5rczogXCIrdGhpcy5jaHVua0NvdW50K1wiLCBmcmFtZSBsZW5ndGg6IFwiK3RoaXMuZnJhbWVMZW4rXCIsIHNlYWxlZDogXCIrdGhpcy5zZWFsZWQoKTtcclxuICB9XHJcblxyXG4gICAgc3RhdGljIGZyb21DaHVua0F1ZGlvQnVmZmVyKHJlY29yZGluZ3NTZXJ2aWNlOkJhc2ljUmVjb3JkaW5nU2VydmljZSxiYXNlVXJsOnN0cmluZyxhYjogQXVkaW9CdWZmZXIsZnJhbWVMZW46bnVtYmVyLG9yZ0ZldGNoQ2h1bmtGcmFtZUxlbjpudW1iZXI9YWIubGVuZ3RoKTpOZXRBdWRpb0J1ZmZlciB7XHJcbiAgICAgIGxldCBuYWI9bmV3IE5ldEF1ZGlvQnVmZmVyKHJlY29yZGluZ3NTZXJ2aWNlLGJhc2VVcmwsYWIubnVtYmVyT2ZDaGFubmVscyxhYi5zYW1wbGVSYXRlLGFiLmxlbmd0aCxmcmFtZUxlbixudWxsLG9yZ0ZldGNoQ2h1bmtGcmFtZUxlbik7XHJcbiAgICAgIG5hYi5yZWFkeSgpO1xyXG4gICAgICByZXR1cm4gbmFiO1xyXG4gIH1cclxuXHJcbiAgYXN5bmNBdWRpb0lucHV0U3RyZWFtKCk6IEFzeW5jRmxvYXQzMkFycmF5SW5wdXRTdHJlYW0gfCBudWxsIHtcclxuICAgIHJldHVybiBuZXcgTmV0QXVkaW9JbnB1dFN0cmVhbSh0aGlzKTtcclxuICB9XHJcblxyXG4gIGF1ZGlvSW5wdXRTdHJlYW0oKTogRmxvYXQzMkFycmF5SW5wdXRTdHJlYW0gfCBudWxsIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGR1cmF0aW9uKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZnJhbWVMZW4vdGhpcy5fc2FtcGxlUmF0ZTtcclxuICB9XHJcblxyXG4gIGdldCBudW1iZXJPZkNoYW5uZWxzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hhbm5lbENvdW50O1xyXG4gIH1cclxuXHJcbiAgc2FtcGxlQ291bnRzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hhbm5lbENvdW50KnRoaXMuX2ZyYW1lTGVuO1xyXG4gIH1cclxuXHJcbiAgcmFuZG9tQWNjZXNzQXVkaW9TdHJlYW0oKTogUmFuZG9tQWNjZXNzQXVkaW9TdHJlYW0ge1xyXG4gICAgcmV0dXJuIG5ldyBOZXRSYW5kb21BY2Nlc3NBdWRpb1N0cmVhbSh0aGlzKTtcclxuICB9XHJcbn1cclxuXHJcbi8vIGV4cG9ydCBjbGFzcyBOZXRBdWRpb0NodW5re1xyXG4vL1xyXG4vLyAgIGdldCBvcmdTYW1wbGVSYXRlKCk6IG51bWJlciB7XHJcbi8vICAgICByZXR1cm4gdGhpcy5fb3JnU2FtcGxlUmF0ZTtcclxuLy8gICB9XHJcbi8vXHJcbi8vICAgZ2V0IG9yZ0ZyYW1lTGVuKCk6IG51bWJlciB7XHJcbi8vICAgICByZXR1cm4gdGhpcy5fb3JnRnJhbWVMZW47XHJcbi8vICAgfVxyXG4vLyAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RlY29kZWRCdWZmZXJzOkZsb2F0MzJBcnJheVtdLHByaXZhdGUgX29yZ1NhbXBsZVJhdGU6bnVtYmVyLHByaXZhdGUgX29yZ0ZyYW1lTGVuOm51bWJlcikge1xyXG4vLyAgIH1cclxuLy8gfVxyXG5cclxuZXhwb3J0IGNsYXNzIE5ldFJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtIGltcGxlbWVudHMgUmFuZG9tQWNjZXNzQXVkaW9TdHJlYW17XHJcblxyXG4gIHByaXZhdGUgX2N1cnJDaT0wO1xyXG4gIHByaXZhdGUgX2NjQ2FjaGU6RmxvYXQzMkFycmF5W118bnVsbD1udWxsO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9uZXRBYjpOZXRBdWRpb0J1ZmZlcikge31cclxuXHJcbiAgcHJpdmF0ZSBjaHVuayhiYXNlVXJsOnN0cmluZyxjaTpudW1iZXIsY2I6KGJ1ZnM6QXJyYXk8RmxvYXQzMkFycmF5PnxudWxsLG9yZ0ZyYW1lTGVuZ3RoOm51bWJlcnxudWxsKT0+dm9pZCxlcnJDYjooZXJyOkVycm9yKT0+dm9pZCl7XHJcblxyXG4gICAgbGV0IHN0YXJ0RnJhbWU9Y2kqdGhpcy5fbmV0QWIub3JnRmV0Y2hDaHVua0ZyYW1lTGVuO1xyXG5cclxuICAgIHRoaXMuX25ldEFiLnJlY0ZpbGVTZXJ2aWNlLmNodW5rQXVkaW9SZXF1ZXN0KGJhc2VVcmwsc3RhcnRGcmFtZSx0aGlzLl9uZXRBYi5vcmdGZXRjaENodW5rRnJhbWVMZW4pLnN1YnNjcmliZShcclxuICAgICAge1xyXG5cclxuICAgICAgICBuZXh0OiAoY2hEbCk9PntcclxuICAgICAgICAgIGlmKGNoRGwpe1xyXG4gICAgICAgICAgICBjb25zdCBhYj1jaERsLmRlY29kZWRBdWRpb0J1ZmZlcjtcclxuICAgICAgICAgICAgY29uc3QgY2NDaHM9YWIubnVtYmVyT2ZDaGFubmVscztcclxuICAgICAgICAgICAgbGV0IGFyckJ1Zj1uZXcgQXJyYXk8RmxvYXQzMkFycmF5PigpO1xyXG4gICAgICAgICAgICBmb3IobGV0IGNoPTA7Y2g8Y2NDaHM7Y2grKyl7XHJcbiAgICAgICAgICAgICAgYXJyQnVmLnB1c2goYWIuZ2V0Q2hhbm5lbERhdGEoY2gpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYihhcnJCdWYsY2hEbC5vcmdGcmFtZUxlbmd0aCk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgY2IobnVsbCxudWxsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKT0+e30sXHJcbiAgICAgICAgZXJyb3I6KGVyckV2KT0+e1xyXG4gICAgICAgICAgLy9OZXRSYW5kb21BY2Nlc3NBdWRpb1N0cmVhbS5fcnVubmluZ1JlcXVlc3RzLS07XHJcbiAgICAgICAgICBpZihlcnJFdiBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKXtcclxuICAgICAgICAgICBpZihlcnJFdi5zdGF0dXM9PT00MDQpe1xyXG4gICAgICAgICAgICAgY2IobnVsbCxudWxsKTtcclxuICAgICAgICAgICB9IGVsc2V7XHJcbiAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTmV0IGF1ZGlvIGJ1ZmZlciBjaHVuayBhdWRpbyByZXF1ZXN0IEh0dHAgZXJyb3IgZXZlbnQ6IFwiK2VyckV2LnN0YXR1cytcIiwgXCIrZXJyRXYubmFtZStcIiwgXCIrZXJyRXYubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICBlcnJDYihuZXcgRXJyb3IoZXJyRXYudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5ldCBhdWRpbyBidWZmZXIgY2h1bmsgYXVkaW8gcmVxdWVzdCBlcnJvciBldmVudDogXCIrZXJyRXYubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGVyckNiKG5ldyBFcnJvcihlcnJFdi50b1N0cmluZygpKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZmlsbEJ1ZnMoY2NCdWZzOkZsb2F0MzJBcnJheVtdLG9yZ0ZyYW1lTGVuOm51bWJlcnxudWxsLHRyZ1N0YXRlOntmcmFtZVBvczpudW1iZXIsZnJhbWVMZW46bnVtYmVyLHRyZ0J1ZnM6RmxvYXQzMkFycmF5W10sZmlsbGVkOm51bWJlcn0sc3JjU3RhdGU6e29yZ1NyY0ZyYW1lUG9zOm51bWJlcixzcmNGcmFtZVBvczpudW1iZXIsY2k6bnVtYmVyLGNjUG9zOm51bWJlcn0pe1xyXG4gICAgbGV0IGNjQnVmc0Nocz1jY0J1ZnMubGVuZ3RoO1xyXG4gICAgaWYoY2NCdWZzQ2hzPjApIHtcclxuICAgICAgbGV0IGNjQnVmMCA9IGNjQnVmc1swXTtcclxuICAgICAgbGV0IGNjQnVmc0xlbiA9IGNjQnVmMC5sZW5ndGg7XHJcblxyXG4gICAgICAvL2NvbnNvbGUuZGVidWcoJ0luZGV4ZWREYkF1ZGlvQnVmZmVyOjpmaWxsQnVmcyBmcmFtZVBvczogJytmcmFtZVBvcysnLCBzcmNGcmFtZVBvczogJytzcmNGcmFtZVBvcysnLCBjY0J1ZnNMZW46ICcrY2NCdWZzTGVuKTtcclxuICAgICAgaWYgKHRyZ1N0YXRlLmZyYW1lUG9zID49IHNyY1N0YXRlLnNyY0ZyYW1lUG9zICsgY2NCdWZzTGVuKSB7XHJcbiAgICAgICAgLy8gdGFyZ2V0IGZyYW1lIHBvc2l0aW9uIGlzIGFoZWFkLCBzZWVrIHRvIG5leHQgc291cmNlIGJ1ZmZlclxyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZygnSW5kZXhlZERiQXVkaW9CdWZmZXI6OmZpbGxCdWZzIHNlZWsgdG8gbmV4dCBpbmRkYiBidWZmZXInKTtcclxuICAgICAgICB0aGlzLl9jY0NhY2hlPW51bGw7XHJcbiAgICAgICAgc3JjU3RhdGUuY2krKztcclxuICAgICAgICBzcmNTdGF0ZS5jY1Bvcz0wO1xyXG4gICAgICAgIGlmKG9yZ0ZyYW1lTGVuPT09bnVsbCl7XHJcbiAgICAgICAgICBzcmNTdGF0ZS5vcmdTcmNGcmFtZVBvcys9Y2NCdWZzTGVuO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgc3JjU3RhdGUub3JnU3JjRnJhbWVQb3MrPW9yZ0ZyYW1lTGVuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzcmNTdGF0ZS5zcmNGcmFtZVBvcys9Y2NCdWZzTGVuO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIEFzc3VtaW5nIHRhcmdldCBmcmFtZSBwb3MgaXMgaW5zaWRlIGN1cnJlbnQgc291cmNlIGJ1ZmZlclxyXG4gICAgICAgIHNyY1N0YXRlLmNjUG9zPXRyZ1N0YXRlLmZyYW1lUG9zLXNyY1N0YXRlLnNyY0ZyYW1lUG9zO1xyXG4gICAgICAgIGxldCBjY0F2YWlsID0gY2NCdWZzTGVuIC0gc3JjU3RhdGUuY2NQb3M7XHJcbiAgICAgICAgbGV0IHRvQ29weSA9IGNjQnVmc0xlbjtcclxuXHJcbiAgICAgICAgaWYgKHRvQ29weSA+IGNjQXZhaWwpIHtcclxuICAgICAgICAgIHRvQ29weSA9IGNjQXZhaWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0b0NvcHkgPiB0cmdTdGF0ZS5mcmFtZUxlbikge1xyXG4gICAgICAgICAgdG9Db3B5ID0gdHJnU3RhdGUuZnJhbWVMZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjY0J1ZnNDaHM7IGNoKyspIHtcclxuICAgICAgICAgIGZvciAobGV0IHNpID0gMDsgc2kgPCB0b0NvcHk7IHNpKyspIHtcclxuICAgICAgICAgICAgdHJnU3RhdGUudHJnQnVmc1tjaF1bdHJnU3RhdGUuZmlsbGVkK3NpXSA9IGNjQnVmc1tjaF1bc3JjU3RhdGUuY2NQb3Mrc2ldO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0cmdTdGF0ZS5maWxsZWQgKz0gdG9Db3B5O1xyXG4gICAgICAgIHRyZ1N0YXRlLmZyYW1lTGVuIC09IHRvQ29weTtcclxuICAgICAgICB0cmdTdGF0ZS5mcmFtZVBvcyArPSB0b0NvcHk7XHJcbiAgICAgICAgc3JjU3RhdGUuY2NQb3MgKz0gdG9Db3B5O1xyXG4gICAgICAgIGlmIChzcmNTdGF0ZS5jY1BvcyA+PSBjY0J1ZnNMZW4pIHtcclxuICAgICAgICAgIC8vIEludmFsaWRhdGUgY2FjaGVcclxuICAgICAgICAgIHRoaXMuX2NjQ2FjaGU9bnVsbDtcclxuICAgICAgICAgIHNyY1N0YXRlLmNpKys7XHJcbiAgICAgICAgICB0aGlzLl9jdXJyQ2k9c3JjU3RhdGUuY2k7XHJcbiAgICAgICAgICBzcmNTdGF0ZS5jY1BvcyA9IDA7XHJcbiAgICAgICAgICBpZihvcmdGcmFtZUxlbj09PW51bGwpe1xyXG4gICAgICAgICAgICBzcmNTdGF0ZS5vcmdTcmNGcmFtZVBvcys9Y2NCdWZzTGVuO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHNyY1N0YXRlLm9yZ1NyY0ZyYW1lUG9zKz1vcmdGcmFtZUxlbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHNyY1N0YXRlLnNyY0ZyYW1lUG9zKz1jY0J1ZnNMZW47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWxsQnVmcyhiYXNlVXJsOnN0cmluZyxvcmdGcmFtZUxlbjpudW1iZXJ8bnVsbCx0cmdTdGF0ZTp7ZnJhbWVQb3M6bnVtYmVyLGZyYW1lTGVuOm51bWJlcix0cmdCdWZzOkZsb2F0MzJBcnJheVtdLGZpbGxlZDpudW1iZXJ9LHNyY1N0YXRlOntvcmdTcmNGcmFtZVBvczpudW1iZXIsc3JjRnJhbWVQb3M6bnVtYmVyLGNpOm51bWJlcixjY1BvczpudW1iZXIsY2NGaWxsZWQ6bnVtYmVyfSxjYjooZmlsbGVkOm51bWJlcik9PnZvaWQsY2JFbmQ6KGZpbGxlZDpudW1iZXIpPT52b2lkLGNiRXJyOihlcnI6RXJyb3IpPT52b2lkKXtcclxuICAgIC8vY29uc29sZS5kZWJ1ZygnSW5kZXhlZERiQXVkaW9CdWZmZXI6OmZpbGxCdWZzOiBmcmFtZVBvczonK2ZyYW1lUG9zKycsIGZyYW1lTGVuOiAnK2ZyYW1lTGVuKycsIGZpbGxlZDogJytmaWxsZWQrJywgc3JjRnJhbWVQb3M6ICcrc3JjRnJhbWVQb3MrJyxjaTogJytjaSsnLCBjY1BvczogJytjY1Bvcyk7XHJcbiAgICBpZih0aGlzLl9jY0NhY2hlKXtcclxuICAgICAgdGhpcy5fZmlsbEJ1ZnModGhpcy5fY2NDYWNoZSxvcmdGcmFtZUxlbix0cmdTdGF0ZSxzcmNTdGF0ZSk7XHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZygnSW5kZXhlZERiQXVkaW9CdWZmZXI6OmZpbGxCdWZzIGZyYW1lTGVuOiAnK2ZyYW1lTGVuKTtcclxuICAgICAgaWYodHJnU3RhdGUuZnJhbWVMZW49PT0wKXtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoJ0luZGV4ZWREYkF1ZGlvQnVmZmVyOjpmaWxsQnVmcyAoZnJhbWVsZW49PTApIGNhbGw6IGNiZW5kICcrZmlsbGVkKTtcclxuICAgICAgICBjYkVuZCh0cmdTdGF0ZS5maWxsZWQpO1xyXG4gICAgICB9ZWxzZSB7XHJcbiAgICAgICAgdGhpcy5maWxsQnVmcyhiYXNlVXJsLCBvcmdGcmFtZUxlbix0cmdTdGF0ZSwgc3JjU3RhdGUsIGNiLCBjYkVuZCwgY2JFcnIpO1xyXG4gICAgICB9XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIHRoaXMuY2h1bmsoYmFzZVVybCwgc3JjU3RhdGUuY2ksIChjY0J1ZnMsb3JnRnJhbWVMZW5ndGgpID0+IHtcclxuICAgICAgICBpZiAoY2NCdWZzKSB7XHJcbiAgICAgICAgICB0aGlzLl9jdXJyQ2kgPSBzcmNTdGF0ZS5jaTtcclxuICAgICAgICAgIHRoaXMuX2NjQ2FjaGUgPSBjY0J1ZnM7XHJcblxyXG4gICAgICAgICAgdGhpcy5fZmlsbEJ1ZnMoY2NCdWZzLCBvcmdGcmFtZUxlbmd0aCx0cmdTdGF0ZSwgc3JjU3RhdGUpO1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdJbmRleGVkRGJBdWRpb0J1ZmZlcjo6ZmlsbEJ1ZnMgZnJhbWVMZW46ICcrZnJhbWVMZW4pO1xyXG4gICAgICAgICAgaWYgKHRyZ1N0YXRlLmZyYW1lTGVuID09PSAwKSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZygnSW5kZXhlZERiQXVkaW9CdWZmZXI6OmZpbGxCdWZzIChmcmFtZWxlbj09MCkgY2FsbDogY2JlbmQgJytmaWxsZWQpO1xyXG4gICAgICAgICAgICBjYkVuZCh0cmdTdGF0ZS5maWxsZWQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5maWxsQnVmcyhiYXNlVXJsLG9yZ0ZyYW1lTGVuLHRyZ1N0YXRlLCBzcmNTdGF0ZSwgY2IsIGNiRW5kLCBjYkVycik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZygnSW5kZXhlZERiQXVkaW9CdWZmZXI6OmZpbGxCdWZzIChjaHVuayBub3QgZm91bmQpIGNhbGw6IGNiZW5kICcrZmlsbGVkKTtcclxuICAgICAgICAgIGNiRW5kKHRyZ1N0YXRlLmZpbGxlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAoZXJyKSA9PiB7XHJcbiAgICAgICAgY2JFcnIoZXJyKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZnJhbWVzT2JzKGZyYW1lUG9zOm51bWJlcixmcmFtZUxlbjpudW1iZXIsYnVmczpGbG9hdDMyQXJyYXlbXSk6T2JzZXJ2YWJsZTxudW1iZXI+e1xyXG5cclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxudW1iZXI+KChzdWJzY3JpYmVyKT0+e1xyXG4gICAgICAvLyBQb3NpdGlvbmluZ1xyXG4gICAgICBsZXQgbmV3Q2k9TWF0aC5mbG9vcihmcmFtZVBvcy90aGlzLl9uZXRBYi5jaHVua0ZyYW1lTGVuKTtcclxuICAgICAgaWYobmV3Q2khPT10aGlzLl9jdXJyQ2kpe1xyXG4gICAgICAgIHRoaXMuX2N1cnJDaT1uZXdDaTtcclxuICAgICAgICB0aGlzLl9jY0NhY2hlPW51bGw7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHNyY0ZyYW1lUG9zPW5ld0NpKnRoaXMuX25ldEFiLmNodW5rRnJhbWVMZW47XHJcbiAgICAgIGxldCB0cmdTdGF0ZT17ZnJhbWVQb3M6ZnJhbWVQb3MsZnJhbWVMZW46ZnJhbWVMZW4sdHJnQnVmczpidWZzLGZpbGxlZDowfTtcclxuICAgICAgbGV0IHNyY1N0YXRlPXtvcmdTcmNGcmFtZVBvczowLHNyY0ZyYW1lUG9zOnNyY0ZyYW1lUG9zLGNpOm5ld0NpLGNjUG9zOjAsY2NGaWxsZWQ6MH07XHJcbiAgICAgIHRoaXMuZmlsbEJ1ZnModGhpcy5fbmV0QWIuYmFzZVVybCx0aGlzLl9uZXRBYi5vcmdGZXRjaENodW5rRnJhbWVMZW4sdHJnU3RhdGUsc3JjU3RhdGUsKHZhbCk9Pnt9LChmaWxsZWQ6bnVtYmVyKT0+e1xyXG4gICAgICAgIHN1YnNjcmliZXIubmV4dChmaWxsZWQpO1xyXG4gICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgfSxlcnIgPT4ge1xyXG4gICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTtcclxuICAgICAgfSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jdXJyQ2k9MDtcclxuICAgIHRoaXMuX2NjQ2FjaGU9bnVsbDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOZXRBdWRpb0lucHV0U3RyZWFtIGltcGxlbWVudHMgQXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbXtcclxuXHJcbiAgcHJpdmF0ZSBmcmFtZVBvczpudW1iZXI9MDtcclxuICBwcml2YXRlIG5ldEFiU3RyOk5ldFJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmV0QWI6TmV0QXVkaW9CdWZmZXIpIHtcclxuICAgICAgdGhpcy5uZXRBYlN0cj1uZXcgTmV0UmFuZG9tQWNjZXNzQXVkaW9TdHJlYW0obmV0QWIpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLm5ldEFiU3RyLmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuICByZWFkT2JzKGJ1ZmZlcnM6IEFycmF5PEZsb2F0MzJBcnJheT4pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPG51bWJlcj4oc3Vic2NyPT4ge1xyXG4gICAgICBpZiAoYnVmZmVycyAmJiBidWZmZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgZmwgPSBidWZmZXJzWzBdLmxlbmd0aDtcclxuICAgICAgICB0aGlzLm5ldEFiU3RyLmZyYW1lc09icyh0aGlzLmZyYW1lUG9zLCBmbCwgYnVmZmVycykuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChyZWFkKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWVQb3MgKz0gcmVhZDtcclxuICAgICAgICAgICAgc3Vic2NyLm5leHQocmVhZCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgc3Vic2NyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgc3Vic2NyLmVycm9yKGVycik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgc3Vic2NyLm5leHQoMCk7XHJcbiAgICAgICAgc3Vic2NyLmNvbXBsZXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2tpcEZyYW1lcyhuOiBudW1iZXIpOnZvaWQge1xyXG4gICAgdGhpcy5mcmFtZVBvcys9bjtcclxuICB9XHJcblxyXG5cclxufVxyXG4iXX0=
@@ -1,18 +0,0 @@
1
- export class AudioSourceNode extends AudioWorkletNode {
2
- constructor() {
3
- super(...arguments);
4
- this._playStartTime = null;
5
- this.onended = null;
6
- }
7
- get playPositionTime() {
8
- let ppt = null;
9
- if (this._playStartTime !== null) {
10
- ppt = this.context.currentTime - this._playStartTime;
11
- }
12
- return ppt;
13
- }
14
- }
15
- AudioSourceNode.DEFAULT_BUFFER_FILL_SECONDS = 10;
16
- AudioSourceNode.DEFAULT_STREAM_READ_FRAME_LEN = 1024;
17
- AudioSourceNode.QUANTUM_FRAME_LEN = 128;
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9fc291cmNlX25vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvYXVkaW8vcGxheWJhY2svYXVkaW9fc291cmNlX25vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFnQixlQUFnQixTQUFRLGdCQUFnQjtJQUE5RDs7UUFJWSxtQkFBYyxHQUFhLElBQUksQ0FBQztRQVcxQyxZQUFPLEdBQXdCLElBQUksQ0FBQztJQUN0QyxDQUFDO0lBUkMsSUFBSSxnQkFBZ0I7UUFDbEIsSUFBSSxHQUFHLEdBQUMsSUFBSSxDQUFDO1FBQ2IsSUFBRyxJQUFJLENBQUMsY0FBYyxLQUFHLElBQUksRUFBRTtZQUM3QixHQUFHLEdBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztTQUNyRDtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7QUFiZSwyQ0FBMkIsR0FBRyxFQUFFLENBQUM7QUFDakMsNkNBQTZCLEdBQUMsSUFBSSxDQUFDO0FBQ25DLGlDQUFpQixHQUFHLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdWRpb1NvdXJjZU5vZGUgZXh0ZW5kcyBBdWRpb1dvcmtsZXROb2RlIHtcclxuICBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9CVUZGRVJfRklMTF9TRUNPTkRTID0gMTA7XHJcbiAgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfU1RSRUFNX1JFQURfRlJBTUVfTEVOPTEwMjQ7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFFVQU5UVU1fRlJBTUVfTEVOID0gMTI4O1xyXG4gIHByb3RlY3RlZCBfcGxheVN0YXJ0VGltZTpudW1iZXJ8bnVsbD1udWxsO1xyXG4gIHB1YmxpYyBhYnN0cmFjdCBzdGFydCh3aGVuPzogbnVtYmVyIHwgdW5kZWZpbmVkLG9mZnNldD86IG51bWJlciB8IHVuZGVmaW5lZCxkdXJhdGlvbj86IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQ7XHJcbiAgcHVibGljIGFic3RyYWN0IHN0b3AoKTp2b2lkO1xyXG5cclxuICBnZXQgcGxheVBvc2l0aW9uVGltZSgpOm51bWJlcnxudWxsIHtcclxuICAgIGxldCBwcHQ9bnVsbDtcclxuICAgIGlmKHRoaXMuX3BsYXlTdGFydFRpbWUhPT1udWxsKSB7XHJcbiAgICAgIHBwdD0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lIC0gdGhpcy5fcGxheVN0YXJ0VGltZTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcHQ7XHJcbiAgfVxyXG4gIG9uZW5kZWQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG59XHJcbiJdfQ==
@@ -1,167 +0,0 @@
1
- // Code from audio_source_worklet.js as string constant to be loaded as module
2
- // Changes in audio_source_worklet.js must be copied and pasted to this string constant
3
- const aswpStr = "\n" +
4
- "// Important note: Changes in audio_source_worklet.js must be copied and pasted to the string constant aswpStr in audio_source_worklet_module_loader.ts\n" +
5
- "\n" +
6
- "\n" +
7
- "class AudioSourceProcessor extends AudioWorkletProcessor{\n" +
8
- "\n" +
9
- " filledFrames=0;\n" +
10
- " audioBuffers=new Array();\n" +
11
- " currentAudioBuffer=null;\n" +
12
- " currentAudioBufferFramePos=0;\n" +
13
- " currentAudioBufferAvail=0;\n" +
14
- " running=false;\n" +
15
- " stalled=false;\n" +
16
- " stopped=false;\n" +
17
- " endOfStream=false;\n" +
18
- " ended=false;\n" +
19
- "\n" +
20
- " constructor() {\n" +
21
- " super({numberOfInputs:0,numberOfOutputs:1});\n" +
22
- " this.port.onmessage=(msgEv)=>{\n" +
23
- " // received audio playback data from application\n" +
24
- " //console.debug(\"Audio source worklet msg: Received.\");\n" +
25
- "\n" +
26
- " if(msgEv.data.cmd){\n" +
27
- " if('data'===msgEv.data.cmd) {\n" +
28
- " let chs = msgEv.data.chs;\n" +
29
- "\n" +
30
- " let audioData = new Array(chs);\n" +
31
- " for (let ch = 0; ch < chs; ch++) {\n" +
32
- " audioData[ch] = new Float32Array(msgEv.data.audioData[ch]);\n" +
33
- " }\n" +
34
- " let msgChBufLen=audioData[0].length;\n" +
35
- " this.audioBuffers.push(audioData);\n" +
36
- " this.filledFrames += msgChBufLen;\n" +
37
- " //console.debug(\"Audio source worklet msg: Filled \" + this.filledFrames+ \" in \"+this.audioBuffers.length+\" buffers.\");\n" +
38
- "\n" +
39
- " }else if('start'===msgEv.data.cmd){\n" +
40
- " this.running=true;\n" +
41
- " }else if('stop'===msgEv.data.cmd){\n" +
42
- " //console.debug(\"Stop...\");\n" +
43
- " this.running=false;\n" +
44
- " this.stopped=true;\n" +
45
- " // clear buffers\n" +
46
- " this.filledFrames=0;\n" +
47
- " while(this.audioBuffers.length > 0) {\n" +
48
- " this.audioBuffers.pop();\n" +
49
- " }\n" +
50
- " this.currentAudioBuffer=new Float32Array(0);\n" +
51
- " }else if('endOfStream'===msgEv.data.cmd){\n" +
52
- " this.endOfStream=true;\n" +
53
- " }else if('continue'===msgEv.data.cmd){\n" +
54
- " console.debug(\"Continue after stalled...\");\n" +
55
- " this.stalled=false;\n" +
56
- " this.port.postMessage({eventType: 'resumed'});\n" +
57
- " }\n" +
58
- " }\n" +
59
- " }\n" +
60
- " }\n" +
61
- "\n" +
62
- " process(\n" +
63
- " inputs,\n" +
64
- " outputs,\n" +
65
- " parameters\n" +
66
- " ){\n" +
67
- " //console.debug(\"Audio source worklet: process \"+outputs.length+ \" output buffers.\");\n" +
68
- " // copy ring buffer data to outputs\n" +
69
- " if(!this.running || this.stalled){\n" +
70
- " if(this.endOfStream) {\n" +
71
- " this.ended = true;\n" +
72
- " this.port.postMessage({eventType: 'ended'});\n" +
73
- " }\n" +
74
- " return !this.ended && !this.stopped;\n" +
75
- " }\n" +
76
- "\n" +
77
- " let output=outputs[0];\n" +
78
- " let chs=output.length;\n" +
79
- " //console.debug(\"Audio source worklet: Output channels: \"+chs);\n" +
80
- " if(chs>0) {\n" +
81
- "\n" +
82
- " let outCh0 = output[0];\n" +
83
- " let outChLen = outCh0.length;\n" +
84
- "\n" +
85
- " if(!this.currentAudioBuffer){\n" +
86
- " // get first buffer\n" +
87
- " let nxtBuff=this.audioBuffers.shift();\n" +
88
- " if(nxtBuff) {\n" +
89
- " this.currentAudioBuffer = nxtBuff;\n" +
90
- " this.currentAudioBufferFramePos=0;\n" +
91
- " this.currentAudioBufferAvail=this.currentAudioBuffer[0].length;\n" +
92
- " }else{\n" +
93
- " return true;\n" +
94
- " }\n" +
95
- " }\n" +
96
- "\n" +
97
- " let copied=0;\n" +
98
- " do{\n" +
99
- " if(this.currentAudioBufferAvail===0){\n" +
100
- " let nxtBuff=this.audioBuffers.shift();\n" +
101
- " if(nxtBuff){\n" +
102
- " this.currentAudioBuffer=nxtBuff;\n" +
103
- " this.currentAudioBufferFramePos=0;\n" +
104
- " this.currentAudioBufferAvail=this.currentAudioBuffer[0].length;\n" +
105
- " //console.debug(\"Next buffer with \"+this.currentAudioBufferAvail+ \" frames\");\n" +
106
- " this.port.postMessage({eventType:'bufferNotification',filledFrames:this.filledFrames});\n" +
107
- " }else{\n" +
108
- " if(this.endOfStream) {\n" +
109
- " this.ended = true;\n" +
110
- " this.port.postMessage({eventType: 'ended'});\n" +
111
- " //console.debug(\"Stream ended\");\n" +
112
- " }else{\n" +
113
- " if(!this.stalled) {\n" +
114
- " this.stalled = true;\n" +
115
- " this.port.postMessage({eventType: 'stalled'});\n" +
116
- " }\n" +
117
- " }\n" +
118
- " break;\n" +
119
- " }\n" +
120
- " }\n" +
121
- " //console.debug(\"outChLen: \"+outChLen+\", copied: \"+copied+\", current avail: \"+this.currentAudioBufferAvail);\n" +
122
- " let toCopy=outChLen-copied;\n" +
123
- " if(toCopy>this.currentAudioBufferAvail){\n" +
124
- " toCopy=this.currentAudioBufferAvail;\n" +
125
- " }\n" +
126
- " //console.debug(\"Copy \"+toCopy+\" frames...\");\n" +
127
- " for(let ch=0;ch<chs;ch++) {\n" +
128
- " let outCh=output[ch];\n" +
129
- " for (let i = 0; i < toCopy; i++) {\n" +
130
- " outCh[copied+i]=this.currentAudioBuffer[ch][this.currentAudioBufferFramePos+i];\n" +
131
- " }\n" +
132
- " }\n" +
133
- " copied+=toCopy;\n" +
134
- " this.currentAudioBufferFramePos+=toCopy;\n" +
135
- " this.currentAudioBufferAvail-=toCopy;\n" +
136
- "\n" +
137
- " }while(copied<outChLen);\n" +
138
- " this.filledFrames-=copied;\n" +
139
- " //console.debug(\"Copied \"+copied+\" frames.\");\n" +
140
- " }\n" +
141
- " return !this.ended;\n" +
142
- " }\n" +
143
- "}\n" +
144
- "\n" +
145
- "registerProcessor('audio-source-worklet',AudioSourceProcessor);\n";
146
- export class AudioSourceWorkletModuleLoader {
147
- static loadModule(context) {
148
- return new Promise((resolve, reject) => {
149
- if (AudioSourceWorkletModuleLoader.moduleLoaded) {
150
- resolve.call(self);
151
- }
152
- else {
153
- const audioWorkletModuleBlob = new Blob([aswpStr], { type: 'text/javascript' });
154
- const audioWorkletModuleBlobUrl = window.URL.createObjectURL(audioWorkletModuleBlob);
155
- context.audioWorklet.addModule(audioWorkletModuleBlobUrl).then(() => {
156
- AudioSourceWorkletModuleLoader.moduleLoaded = true;
157
- resolve.call(self);
158
- }).catch((reason) => {
159
- console.error(reason);
160
- reject.call(reason);
161
- });
162
- }
163
- });
164
- }
165
- }
166
- AudioSourceWorkletModuleLoader.moduleLoaded = false;
167
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9fc291cmNlX3dvcmtsZXRfbW9kdWxlX2xvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9wbGF5YmFjay9hdWRpb19zb3VyY2Vfd29ya2xldF9tb2R1bGVfbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDhFQUE4RTtBQUM5RSx1RkFBdUY7QUFFdkYsTUFBTSxPQUFPLEdBQUcsSUFBSTtJQUNsQiwySkFBMko7SUFDM0osSUFBSTtJQUNKLElBQUk7SUFDSiw2REFBNkQ7SUFDN0QsSUFBSTtJQUNKLHVCQUF1QjtJQUN2QixpQ0FBaUM7SUFDakMsZ0NBQWdDO0lBQ2hDLHFDQUFxQztJQUNyQyxrQ0FBa0M7SUFDbEMsc0JBQXNCO0lBQ3RCLHNCQUFzQjtJQUN0QixzQkFBc0I7SUFDdEIsMEJBQTBCO0lBQzFCLG9CQUFvQjtJQUNwQixJQUFJO0lBQ0osdUJBQXVCO0lBQ3ZCLHdEQUF3RDtJQUN4RCwwQ0FBMEM7SUFDMUMsOERBQThEO0lBQzlELHVFQUF1RTtJQUN2RSxJQUFJO0lBQ0osaUNBQWlDO0lBQ2pDLDZDQUE2QztJQUM3QywyQ0FBMkM7SUFDM0MsSUFBSTtJQUNKLGlEQUFpRDtJQUNqRCxvREFBb0Q7SUFDcEQsK0VBQStFO0lBQy9FLG1CQUFtQjtJQUNuQixzREFBc0Q7SUFDdEQsb0RBQW9EO0lBQ3BELG1EQUFtRDtJQUNuRCw4SUFBOEk7SUFDOUksSUFBSTtJQUNKLG1EQUFtRDtJQUNuRCxvQ0FBb0M7SUFDcEMsa0RBQWtEO0lBQ2xELCtDQUErQztJQUMvQyxxQ0FBcUM7SUFDckMsb0NBQW9DO0lBQ3BDLGtDQUFrQztJQUNsQyxzQ0FBc0M7SUFDdEMsdURBQXVEO0lBQ3ZELDRDQUE0QztJQUM1QyxtQkFBbUI7SUFDbkIsOERBQThEO0lBQzlELHlEQUF5RDtJQUN6RCx3Q0FBd0M7SUFDeEMsc0RBQXNEO0lB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QUM7Z0JBQ3RCLENBQUMsQ0FBQyxDQUFDO2FBRUo7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBbkJjLDJDQUFZLEdBQUMsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29kZSBmcm9tIGF1ZGlvX3NvdXJjZV93b3JrbGV0LmpzIGFzIHN0cmluZyBjb25zdGFudCB0byBiZSBsb2FkZWQgYXMgbW9kdWxlXHJcbi8vIENoYW5nZXMgaW4gYXVkaW9fc291cmNlX3dvcmtsZXQuanMgbXVzdCBiZSBjb3BpZWQgYW5kIHBhc3RlZCB0byB0aGlzIHN0cmluZyBjb25zdGFudFxyXG5cclxuY29uc3QgYXN3cFN0ciA9IFwiXFxuXCIgK1xyXG4gIFwiLy8gSW1wb3J0YW50IG5vdGU6IENoYW5nZXMgaW4gYXVkaW9fc291cmNlX3dvcmtsZXQuanMgbXVzdCBiZSBjb3BpZWQgYW5kIHBhc3RlZCB0byB0aGUgc3RyaW5nIGNvbnN0YW50IGFzd3BTdHIgaW4gYXVkaW9fc291cmNlX3dvcmtsZXRfbW9kdWxlX2xvYWRlci50c1xcblwiICtcclxuICBcIlxcblwiICtcclxuICBcIlxcblwiICtcclxuICBcImNsYXNzIEF1ZGlvU291cmNlUHJvY2Vzc29yIGV4dGVuZHMgQXVkaW9Xb3JrbGV0UHJvY2Vzc29ye1xcblwiICtcclxuICBcIlxcblwiICtcclxuICBcIiAgICBmaWxsZWRGcmFtZXM9MDtcXG5cIiArXHJcbiAgXCIgICAgYXVkaW9CdWZmZXJzPW5ldyBBcnJheSgpO1xcblwiICtcclxuICBcIiAgICBjdXJyZW50QXVkaW9CdWZmZXI9bnVsbDtcXG5cIiArXHJcbiAgXCIgICAgY3VycmVudEF1ZGlvQnVmZmVyRnJhbWVQb3M9MDtcXG5cIiArXHJcbiAgXCIgICAgY3VycmVudEF1ZGlvQnVmZmVyQXZhaWw9MDtcXG5cIiArXHJcbiAgXCIgICAgcnVubmluZz1mYWxzZTtcXG5cIiArXHJcbiAgXCIgICAgc3RhbGxlZD1mYWxzZTtcXG5cIiArXHJcbiAgXCIgICAgc3RvcHBlZD1mYWxzZTtcXG5cIiArXHJcbiAgXCIgICAgZW5kT2ZTdHJlYW09ZmFsc2U7XFxuXCIgK1xyXG4gIFwiICAgIGVuZGVkPWZhbHNlO1xcblwiICtcclxuICBcIlxcblwiICtcclxuICBcIiAgICBjb25zdHJ1Y3RvcigpIHtcXG5cIiArXHJcbiAgXCIgICAgICAgIHN1cGVyKHtudW1iZXJPZklucHV0czowLG51bWJlck9mT3V0cHV0czoxfSk7XFxuXCIgK1xyXG4gIFwiICAgICAgICB0aGlzLnBvcnQub25tZXNzYWdlPShtc2dFdik9PntcXG5cIiArXHJcbiAgXCIgICAgICAgICAgLy8gcmVjZWl2ZWQgYXVkaW8gcGxheWJhY2sgZGF0YSBmcm9tIGFwcGxpY2F0aW9uXFxuXCIgK1xyXG4gIFwiICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcXFwiQXVkaW8gc291cmNlIHdvcmtsZXQgbXNnOiBSZWNlaXZlZC5cXFwiKTtcXG5cIiArXHJcbiAgXCJcXG5cIiArXHJcbiAgXCIgICAgICAgICAgaWYobXNnRXYuZGF0YS5jbWQpe1xcblwiICtcclxuICBcIiAgICAgICAgICAgIGlmKCdkYXRhJz09PW1zZ0V2LmRhdGEuY21kKSB7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICBsZXQgY2hzID0gbXNnRXYuZGF0YS5jaHM7XFxuXCIgK1xyXG4gIFwiXFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICBsZXQgYXVkaW9EYXRhID0gbmV3IEFycmF5KGNocyk7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hzOyBjaCsrKSB7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICAgIGF1ZGlvRGF0YVtjaF0gPSBuZXcgRmxvYXQzMkFycmF5KG1zZ0V2LmRhdGEuYXVkaW9EYXRhW2NoXSk7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICB9XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICBsZXQgbXNnQ2hCdWZMZW49YXVkaW9EYXRhWzBdLmxlbmd0aDtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgIHRoaXMuYXVkaW9CdWZmZXJzLnB1c2goYXVkaW9EYXRhKTtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgIHRoaXMuZmlsbGVkRnJhbWVzICs9IG1zZ0NoQnVmTGVuO1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFxcXCJBdWRpbyBzb3VyY2Ugd29ya2xldCBtc2c6IEZpbGxlZCBcXFwiICsgdGhpcy5maWxsZWRGcmFtZXMrIFxcXCIgaW4gXFxcIit0aGlzLmF1ZGlvQnVmZmVycy5sZW5ndGgrXFxcIiBidWZmZXJzLlxcXCIpO1xcblwiICtcclxuICBcIlxcblwiICtcclxuICBcIiAgICAgICAgICAgIH1lbHNlIGlmKCdzdGFydCc9PT1tc2dFdi5kYXRhLmNtZCl7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICB0aGlzLnJ1bm5pbmc9dHJ1ZTtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICB9ZWxzZSBpZignc3RvcCc9PT1tc2dFdi5kYXRhLmNtZCl7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXFxcIlN0b3AuLi5cXFwiKTtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgIHRoaXMucnVubmluZz1mYWxzZTtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgIHRoaXMuc3RvcHBlZD10cnVlO1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgLy8gY2xlYXIgYnVmZmVyc1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgdGhpcy5maWxsZWRGcmFtZXM9MDtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgIHdoaWxlKHRoaXMuYXVkaW9CdWZmZXJzLmxlbmd0aCA+IDApIHtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgICAgdGhpcy5hdWRpb0J1ZmZlcnMucG9wKCk7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICB9XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRBdWRpb0J1ZmZlcj1uZXcgRmxvYXQzMkFycmF5KDApO1xcblwiICtcclxuICBcIiAgICAgICAgICAgIH1lbHNlIGlmKCdlbmRPZlN0cmVhbSc9PT1tc2dFdi5kYXRhLmNtZCl7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICB0aGlzLmVuZE9mU3RyZWFtPXRydWU7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgfWVsc2UgaWYoJ2NvbnRpbnVlJz09PW1zZ0V2LmRhdGEuY21kKXtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXFxcIkNvbnRpbnVlIGFmdGVyIHN0YWxsZWQuLi5cXFwiKTtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgIHRoaXMuc3RhbGxlZD1mYWxzZTtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgIHRoaXMucG9ydC5wb3N0TWVzc2FnZSh7ZXZlbnRUeXBlOiAncmVzdW1lZCd9KTtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICB9XFxuXCIgK1xyXG4gIFwiICAgICAgICAgIH1cXG5cIiArXHJcbiAgXCIgICAgICAgIH1cXG5cIiArXHJcbiAgXCIgICAgfVxcblwiICtcclxuICBcIlxcblwiICtcclxuICBcIiBwcm9jZXNzKFxcblwiICtcclxuICBcIiAgICAgIGlucHV0cyxcXG5cIiArXHJcbiAgXCIgICAgICBvdXRwdXRzLFxcblwiICtcclxuICBcIiAgICAgIHBhcmFtZXRlcnNcXG5cIiArXHJcbiAgXCIgICl7XFxuXCIgK1xyXG4gIFwiICAgICAgLy9jb25zb2xlLmRlYnVnKFxcXCJBdWRpbyBzb3VyY2Ugd29ya2xldDogcHJvY2VzcyBcXFwiK291dHB1dHMubGVuZ3RoKyBcXFwiIG91dHB1dCBidWZmZXJzLlxcXCIpO1xcblwiICtcclxuICBcIiAgICAgIC8vIGNvcHkgcmluZyBidWZmZXIgZGF0YSB0byBvdXRwdXRzXFxuXCIgK1xyXG4gIFwiICAgICAgICBpZighdGhpcy5ydW5uaW5nIHx8IHRoaXMuc3RhbGxlZCl7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgaWYodGhpcy5lbmRPZlN0cmVhbSkge1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHtldmVudFR5cGU6ICdlbmRlZCd9KTtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICB9XFxuXCIgK1xyXG4gIFwiICAgICAgICAgIHJldHVybiAhdGhpcy5lbmRlZCAmJiAhdGhpcy5zdG9wcGVkO1xcblwiICtcclxuICBcIiAgICAgICAgfVxcblwiICtcclxuICBcIlxcblwiICtcclxuICBcIiAgICAgICAgbGV0IG91dHB1dD1vdXRwdXRzWzBdO1xcblwiICtcclxuICBcIiAgICAgICAgbGV0IGNocz1vdXRwdXQubGVuZ3RoO1xcblwiICtcclxuICBcIiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFxcXCJBdWRpbyBzb3VyY2Ugd29ya2xldDogT3V0cHV0IGNoYW5uZWxzOiBcXFwiK2Nocyk7XFxuXCIgK1xyXG4gIFwiICAgICAgICBpZihjaHM+MCkge1xcblwiICtcclxuICBcIlxcblwiICtcclxuICBcIiAgICAgICAgICBsZXQgb3V0Q2gwID0gb3V0cHV0WzBdO1xcblwiICtcclxuICBcIiAgICAgICAgICBsZXQgb3V0Q2hMZW4gPSBvdXRDaDAubGVuZ3RoO1xcblwiICtcclxuICBcIlxcblwiICtcclxuICBcIiAgICAgICAgICBpZighdGhpcy5jdXJyZW50QXVkaW9CdWZmZXIpe1xcblwiICtcclxuICBcIiAgICAgICAgICAgIC8vIGdldCBmaXJzdCBidWZmZXJcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICBsZXQgbnh0QnVmZj10aGlzLmF1ZGlvQnVmZmVycy5zaGlmdCgpO1xcblwiICtcclxuICBcIiAgICAgICAgICAgIGlmKG54dEJ1ZmYpIHtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgIHRoaXMuY3VycmVudEF1ZGlvQnVmZmVyID0gbnh0QnVmZjtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgIHRoaXMuY3VycmVudEF1ZGlvQnVmZmVyRnJhbWVQb3M9MDtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgIHRoaXMuY3VycmVudEF1ZGlvQnVmZmVyQXZhaWw9dGhpcy5jdXJyZW50QXVkaW9CdWZmZXJbMF0ubGVuZ3RoO1xcblwiICtcclxuICBcIiAgICAgICAgICAgIH1lbHNle1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgfVxcblwiICtcclxuICBcIiAgICAgICAgICB9XFxuXCIgK1xyXG4gIFwiXFxuXCIgK1xyXG4gIFwiICAgICAgICAgIGxldCBjb3BpZWQ9MDtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgZG97XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgaWYodGhpcy5jdXJyZW50QXVkaW9CdWZmZXJBdmFpbD09PTApe1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgbGV0IG54dEJ1ZmY9dGhpcy5hdWRpb0J1ZmZlcnMuc2hpZnQoKTtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgIGlmKG54dEJ1ZmYpe1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRBdWRpb0J1ZmZlcj1ueHRCdWZmO1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRBdWRpb0J1ZmZlckZyYW1lUG9zPTA7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEF1ZGlvQnVmZmVyQXZhaWw9dGhpcy5jdXJyZW50QXVkaW9CdWZmZXJbMF0ubGVuZ3RoO1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXFxcIk5leHQgYnVmZmVyIHdpdGggXFxcIit0aGlzLmN1cnJlbnRBdWRpb0J1ZmZlckF2YWlsKyBcXFwiIGZyYW1lc1xcXCIpO1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe2V2ZW50VHlwZTonYnVmZmVyTm90aWZpY2F0aW9uJyxmaWxsZWRGcmFtZXM6dGhpcy5maWxsZWRGcmFtZXN9KTtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgIH1lbHNle1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgICBpZih0aGlzLmVuZE9mU3RyZWFtKSB7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICAgICAgdGhpcy5lbmRlZCA9IHRydWU7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHtldmVudFR5cGU6ICdlbmRlZCd9KTtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXFxcIlN0cmVhbSBlbmRlZFxcXCIpO1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgICB9ZWxzZXtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgICAgICBpZighdGhpcy5zdGFsbGVkKSB7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWxsZWQgPSB0cnVlO1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHtldmVudFR5cGU6ICdzdGFsbGVkJ30pO1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgICAgIH1cXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgICAgfVxcblwiICtcclxuICBcIiAgICAgICAgICAgICAgICBicmVhaztcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgIH1cXG5cIiArXHJcbiAgXCIgICAgICAgICAgICB9XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFxcXCJvdXRDaExlbjogXFxcIitvdXRDaExlbitcXFwiLCBjb3BpZWQ6IFxcXCIrY29waWVkK1xcXCIsIGN1cnJlbnQgYXZhaWw6IFxcXCIrdGhpcy5jdXJyZW50QXVkaW9CdWZmZXJBdmFpbCk7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgbGV0IHRvQ29weT1vdXRDaExlbi1jb3BpZWQ7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgaWYodG9Db3B5PnRoaXMuY3VycmVudEF1ZGlvQnVmZmVyQXZhaWwpe1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgdG9Db3B5PXRoaXMuY3VycmVudEF1ZGlvQnVmZmVyQXZhaWw7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgfVxcblwiICtcclxuICBcIiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcXFwiQ29weSBcXFwiK3RvQ29weStcXFwiIGZyYW1lcy4uLlxcXCIpO1xcblwiICtcclxuICBcIiAgICAgICAgICAgIGZvcihsZXQgY2g9MDtjaDxjaHM7Y2grKykge1xcblwiICtcclxuICBcIiAgICAgICAgICAgICAgbGV0IG91dENoPW91dHB1dFtjaF07XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvQ29weTsgaSsrKSB7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgICAgIG91dENoW2NvcGllZCtpXT10aGlzLmN1cnJlbnRBdWRpb0J1ZmZlcltjaF1bdGhpcy5jdXJyZW50QXVkaW9CdWZmZXJGcmFtZVBvcytpXTtcXG5cIiArXHJcbiAgXCIgICAgICAgICAgICAgIH1cXG5cIiArXHJcbiAgXCIgICAgICAgICAgICB9XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgY29waWVkKz10b0NvcHk7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgICAgdGhpcy5jdXJyZW50QXVkaW9CdWZmZXJGcmFtZVBvcys9dG9Db3B5O1xcblwiICtcclxuICBcIiAgICAgICAgICAgIHRoaXMuY3VycmVudEF1ZGlvQnVmZmVyQXZhaWwtPXRvQ29weTtcXG5cIiArXHJcbiAgXCJcXG5cIiArXHJcbiAgXCIgICAgICAgICAgfXdoaWxlKGNvcGllZDxvdXRDaExlbik7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgIHRoaXMuZmlsbGVkRnJhbWVzLT1jb3BpZWQ7XFxuXCIgK1xyXG4gIFwiICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcXFwiQ29waWVkIFxcXCIrY29waWVkK1xcXCIgZnJhbWVzLlxcXCIpO1xcblwiICtcclxuICBcIiAgICAgICAgfVxcblwiICtcclxuICBcIiAgICAgcmV0dXJuICF0aGlzLmVuZGVkO1xcblwiICtcclxuICBcIiAgfVxcblwiICtcclxuICBcIn1cXG5cIiArXHJcbiAgXCJcXG5cIiArXHJcbiAgXCJyZWdpc3RlclByb2Nlc3NvcignYXVkaW8tc291cmNlLXdvcmtsZXQnLEF1ZGlvU291cmNlUHJvY2Vzc29yKTtcXG5cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBdWRpb1NvdXJjZVdvcmtsZXRNb2R1bGVMb2FkZXJ7XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIG1vZHVsZUxvYWRlZD1mYWxzZTtcclxuXHJcbiAgc3RhdGljIGxvYWRNb2R1bGUoY29udGV4dDogQXVkaW9Db250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAoQXVkaW9Tb3VyY2VXb3JrbGV0TW9kdWxlTG9hZGVyLm1vZHVsZUxvYWRlZCkge1xyXG4gICAgICAgIHJlc29sdmUuY2FsbChzZWxmKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBhdWRpb1dvcmtsZXRNb2R1bGVCbG9iID0gbmV3IEJsb2IoW2Fzd3BTdHJdLCB7dHlwZTogJ3RleHQvamF2YXNjcmlwdCd9KTtcclxuICAgICAgICBjb25zdCBhdWRpb1dvcmtsZXRNb2R1bGVCbG9iVXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYXVkaW9Xb3JrbGV0TW9kdWxlQmxvYik7XHJcbiAgICAgICAgY29udGV4dC5hdWRpb1dvcmtsZXQuYWRkTW9kdWxlKGF1ZGlvV29ya2xldE1vZHVsZUJsb2JVcmwpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgQXVkaW9Tb3VyY2VXb3JrbGV0TW9kdWxlTG9hZGVyLm1vZHVsZUxvYWRlZCA9IHRydWU7XHJcbiAgICAgICAgICByZXNvbHZlLmNhbGwoc2VsZik7XHJcbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihyZWFzb24pO1xyXG4gICAgICAgICAgcmVqZWN0LmNhbGwocmVhc29uKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=