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,17 +1,17 @@
1
- export class AudioFormat {
2
- constructor(sampleRate, channelCount) {
3
- this.sampleRate = sampleRate;
4
- this.channelCount = channelCount;
5
- }
6
- }
7
- export class PCMAudioFormat extends AudioFormat {
8
- constructor(sampleRate, channelCount, sampleSize, sampleSizeInBits) {
9
- super(sampleRate, channelCount);
10
- this.sampleSize = sampleSize;
11
- this.sampleSizeInBits = sampleSizeInBits;
12
- }
13
- toString() {
14
- return 'Audio format: PCM,' + this.sampleRate + ' Hz,' + this.channelCount + ' channels, ' + this.sampleSizeInBits + ' bits';
15
- }
16
- }
1
+ export class AudioFormat {
2
+ constructor(sampleRate, channelCount) {
3
+ this.sampleRate = sampleRate;
4
+ this.channelCount = channelCount;
5
+ }
6
+ }
7
+ export class PCMAudioFormat extends AudioFormat {
8
+ constructor(sampleRate, channelCount, sampleSize, sampleSizeInBits) {
9
+ super(sampleRate, channelCount);
10
+ this.sampleSize = sampleSize;
11
+ this.sampleSizeInBits = sampleSizeInBits;
12
+ }
13
+ toString() {
14
+ return 'Audio format: PCM,' + this.sampleRate + ' Hz,' + this.channelCount + ' channels, ' + this.sampleSizeInBits + ' bits';
15
+ }
16
+ }
17
17
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL2Zvcm1hdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDSSxNQUFNLE9BQU8sV0FBVztJQUdwQixZQUFZLFVBQWtCLEVBQUUsWUFBb0I7UUFDaEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDckMsQ0FBQztDQUNKO0FBRUQsTUFBTSxPQUFPLGNBQWUsU0FBUSxXQUFXO0lBRzNDLFlBQVksVUFBa0IsRUFBRSxZQUFvQixFQUFFLFVBQWtCLEVBQUUsZ0JBQXdCO1FBQzlGLEtBQUssQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzdDLENBQUM7SUFFRCxRQUFRO1FBQ0osT0FBTyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO0lBQ2pJLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIlxyXG4gICAgZXhwb3J0IGNsYXNzIEF1ZGlvRm9ybWF0IHtcclxuICAgICAgICBzYW1wbGVSYXRlOiBudW1iZXI7XHJcbiAgICAgICAgY2hhbm5lbENvdW50OiBudW1iZXI7XHJcbiAgICAgICAgY29uc3RydWN0b3Ioc2FtcGxlUmF0ZTogbnVtYmVyLCBjaGFubmVsQ291bnQ6IG51bWJlcikge1xyXG4gICAgICAgICAgICB0aGlzLnNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIFBDTUF1ZGlvRm9ybWF0IGV4dGVuZHMgQXVkaW9Gb3JtYXQge1xyXG4gICAgICAgIHNhbXBsZVNpemU6IG51bWJlcjtcclxuICAgICAgICBzYW1wbGVTaXplSW5CaXRzOiBudW1iZXI7XHJcbiAgICAgICAgY29uc3RydWN0b3Ioc2FtcGxlUmF0ZTogbnVtYmVyLCBjaGFubmVsQ291bnQ6IG51bWJlciwgc2FtcGxlU2l6ZTogbnVtYmVyLCBzYW1wbGVTaXplSW5CaXRzOiBudW1iZXIpIHtcclxuICAgICAgICAgICAgc3VwZXIoc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTtcclxuICAgICAgICAgICAgdGhpcy5zYW1wbGVTaXplID0gc2FtcGxlU2l6ZTtcclxuICAgICAgICAgICAgdGhpcy5zYW1wbGVTaXplSW5CaXRzID0gc2FtcGxlU2l6ZUluQml0cztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgICAgICAgIHJldHVybiAnQXVkaW8gZm9ybWF0OiBQQ00sJyArIHRoaXMuc2FtcGxlUmF0ZSArICcgSHosJyArIHRoaXMuY2hhbm5lbENvdW50ICsgJyBjaGFubmVscywgJyArIHRoaXMuc2FtcGxlU2l6ZUluQml0cyArICcgYml0cyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuIl19
@@ -0,0 +1,6 @@
1
+ export class WavFileFormat {
2
+ static { this.RIFF_KEY = 'RIFF'; }
3
+ static { this.WAV_KEY = 'WAVE'; }
4
+ static { this.PCM = 0x0001; }
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F2Zm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL2ltcGwvd2F2Zm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVFLE1BQU0sT0FBTyxhQUFhO2FBQ04sYUFBUSxHQUFVLE1BQU0sQ0FBQzthQUN6QixZQUFPLEdBQVUsTUFBTSxDQUFDO2FBQ3hCLFFBQUcsR0FBVyxNQUFNLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuXHJcbiAgZXhwb3J0IGNsYXNzIFdhdkZpbGVGb3JtYXQge1xyXG4gICAgICBzdGF0aWMgcmVhZG9ubHkgUklGRl9LRVk6c3RyaW5nID0gJ1JJRkYnO1xyXG4gICAgICBzdGF0aWMgcmVhZG9ubHkgV0FWX0tFWTpzdHJpbmcgPSAnV0FWRSc7XHJcbiAgICAgIHN0YXRpYyByZWFkb25seSBQQ006bnVtYmVyID0gIDB4MDAwMTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiJdfQ==
@@ -1,134 +1,134 @@
1
- import { WavFileFormat } from './wavformat';
2
- import { PCMAudioFormat } from '../format';
3
- import { BinaryByteReader } from '../../io/BinaryReader';
4
- export class WavReader {
5
- constructor(data) {
6
- this.format = null;
7
- this.totalLength = 0;
8
- this.dataChunkLength = null;
9
- this.br = new BinaryByteReader(data);
10
- }
11
- readHeader() {
12
- const rh = this.br.readAscii(4);
13
- if (rh !== WavFileFormat.RIFF_KEY) {
14
- const errMsg = "Expected RIFF header, not: " + rh;
15
- throw new Error(errMsg);
16
- }
17
- const cl = this.br.readUint32LE();
18
- if (this.br.pos + cl !== this.br.length()) {
19
- throw new Error("Wrong chunksize in RIFF header: " + cl + " (expected: " + (this.br.length() - this.br.pos) + " )");
20
- }
21
- this.totalLength = cl;
22
- const rt = this.br.readAscii(4);
23
- if (rt !== WavFileFormat.WAV_KEY) {
24
- const errMsg = "Expected " + WavFileFormat.WAV_KEY + " not: " + rt;
25
- throw new Error(errMsg);
26
- }
27
- }
28
- readFormat() {
29
- this.br.pos = 0;
30
- this.readHeader();
31
- const s = this.navigateToChunk('fmt ');
32
- if (!s) {
33
- let errMsg = "WAV file does not contain a fmt chunk";
34
- throw new Error(errMsg);
35
- }
36
- this.format = this.parseFmtChunk();
37
- return this.format;
38
- }
39
- _frameLength() {
40
- let fl = null;
41
- if (this.format && this.dataChunkLength != null) {
42
- fl = this.dataChunkLength / this.format.channelCount / this.format.sampleSize;
43
- }
44
- return fl;
45
- }
46
- frameLength() {
47
- let fl = this._frameLength();
48
- if (fl === null) {
49
- this.readFormat();
50
- this.dataChunkLength = this.navigateToChunk('data');
51
- fl = this._frameLength();
52
- }
53
- return fl;
54
- }
55
- // Not tested yet!!!
56
- read() {
57
- this.br.pos = 0;
58
- let ab = null;
59
- this.readHeader();
60
- let s = this.navigateToChunk('fmt ');
61
- if (!s) {
62
- let errMsg = "WAV file does not contain a fmt chunk";
63
- throw new Error(errMsg);
64
- }
65
- this.format = this.parseFmtChunk();
66
- this.dataChunkLength = this.navigateToChunk('data');
67
- let chsArr = this.readData();
68
- let sr = this.format?.sampleRate;
69
- let nChs = this.format?.channelCount;
70
- if (sr && chsArr && nChs && nChs > 0 && nChs == chsArr?.length) {
71
- ab = new AudioBuffer({
72
- length: chsArr[0].length,
73
- numberOfChannels: this.format?.channelCount,
74
- sampleRate: sr
75
- });
76
- for (let ch = 0; ch < nChs; ch++) {
77
- ab.copyToChannel(chsArr[ch], ch);
78
- }
79
- }
80
- return ab;
81
- }
82
- navigateToChunk(chunkString) {
83
- // position after RIFF header
84
- // TODO assumes no other chunks except 'data'
85
- this.br.pos = 12;
86
- let chkStr = null;
87
- let chkLen = -1;
88
- while (!this.br.eof()) {
89
- chkStr = this.br.readAscii(4);
90
- chkLen = this.br.readUint32LE();
91
- if (chunkString === chkStr) {
92
- return chkLen;
93
- }
94
- this.br.pos += chkLen;
95
- }
96
- return chkLen;
97
- }
98
- parseFmtChunk() {
99
- let pcmAf = null;
100
- const fmt = this.br.readUint16LE();
101
- if (fmt === WavFileFormat.PCM) {
102
- const channels = this.br.readUint16LE();
103
- const sampleRate = this.br.readUint32LE();
104
- // skip bandwidth
105
- this.br.skip(4);
106
- // frame size
107
- const frameSize = this.br.readUint16LE();
108
- // sample size in bits (PCM format only)
109
- const sampleSizeInBits = this.br.readUint16LE();
110
- pcmAf = new PCMAudioFormat(sampleRate, channels, frameSize / channels, sampleSizeInBits);
111
- }
112
- return pcmAf;
113
- }
114
- readData() {
115
- let chsArr = null;
116
- if (this.format) {
117
- chsArr = new Array(this.format.channelCount);
118
- const sampleCount = this.totalLength / this.format.channelCount / this.format.sampleSize;
119
- for (let ch = 0; ch < this.format.channelCount; ch++) {
120
- chsArr[ch] = new Float32Array(sampleCount);
121
- }
122
- if (this.format.sampleSize == 2) {
123
- for (let i = 0; i < this.totalLength / 2; i++) {
124
- for (let ch = 0; ch < this.format.channelCount; ch++) {
125
- const s16Ampl = this.br.readInt16LE();
126
- chsArr[ch][i] = s16Ampl / 32768;
127
- }
128
- }
129
- }
130
- }
131
- return chsArr;
132
- }
133
- }
1
+ import { WavFileFormat } from './wavformat';
2
+ import { PCMAudioFormat } from '../format';
3
+ import { BinaryByteReader } from '../../io/BinaryReader';
4
+ export class WavReader {
5
+ constructor(data) {
6
+ this.format = null;
7
+ this.totalLength = 0;
8
+ this.dataChunkLength = null;
9
+ this.br = new BinaryByteReader(data);
10
+ }
11
+ readHeader() {
12
+ const rh = this.br.readAscii(4);
13
+ if (rh !== WavFileFormat.RIFF_KEY) {
14
+ const errMsg = "Expected RIFF header, not: " + rh;
15
+ throw new Error(errMsg);
16
+ }
17
+ const cl = this.br.readUint32LE();
18
+ if (this.br.pos + cl !== this.br.length()) {
19
+ throw new Error("Wrong chunksize in RIFF header: " + cl + " (expected: " + (this.br.length() - this.br.pos) + " )");
20
+ }
21
+ this.totalLength = cl;
22
+ const rt = this.br.readAscii(4);
23
+ if (rt !== WavFileFormat.WAV_KEY) {
24
+ const errMsg = "Expected " + WavFileFormat.WAV_KEY + " not: " + rt;
25
+ throw new Error(errMsg);
26
+ }
27
+ }
28
+ readFormat() {
29
+ this.br.pos = 0;
30
+ this.readHeader();
31
+ const s = this.navigateToChunk('fmt ');
32
+ if (!s) {
33
+ let errMsg = "WAV file does not contain a fmt chunk";
34
+ throw new Error(errMsg);
35
+ }
36
+ this.format = this.parseFmtChunk();
37
+ return this.format;
38
+ }
39
+ _frameLength() {
40
+ let fl = null;
41
+ if (this.format && this.dataChunkLength != null) {
42
+ fl = this.dataChunkLength / this.format.channelCount / this.format.sampleSize;
43
+ }
44
+ return fl;
45
+ }
46
+ frameLength() {
47
+ let fl = this._frameLength();
48
+ if (fl === null) {
49
+ this.readFormat();
50
+ this.dataChunkLength = this.navigateToChunk('data');
51
+ fl = this._frameLength();
52
+ }
53
+ return fl;
54
+ }
55
+ // Not tested yet!!!
56
+ read() {
57
+ this.br.pos = 0;
58
+ let ab = null;
59
+ this.readHeader();
60
+ let s = this.navigateToChunk('fmt ');
61
+ if (!s) {
62
+ let errMsg = "WAV file does not contain a fmt chunk";
63
+ throw new Error(errMsg);
64
+ }
65
+ this.format = this.parseFmtChunk();
66
+ this.dataChunkLength = this.navigateToChunk('data');
67
+ let chsArr = this.readData();
68
+ let sr = this.format?.sampleRate;
69
+ let nChs = this.format?.channelCount;
70
+ if (sr && chsArr && nChs && nChs > 0 && nChs == chsArr?.length) {
71
+ ab = new AudioBuffer({
72
+ length: chsArr[0].length,
73
+ numberOfChannels: this.format?.channelCount,
74
+ sampleRate: sr
75
+ });
76
+ for (let ch = 0; ch < nChs; ch++) {
77
+ ab.copyToChannel(chsArr[ch], ch);
78
+ }
79
+ }
80
+ return ab;
81
+ }
82
+ navigateToChunk(chunkString) {
83
+ // position after RIFF header
84
+ // TODO assumes no other chunks except 'data'
85
+ this.br.pos = 12;
86
+ let chkStr = null;
87
+ let chkLen = -1;
88
+ while (!this.br.eof()) {
89
+ chkStr = this.br.readAscii(4);
90
+ chkLen = this.br.readUint32LE();
91
+ if (chunkString === chkStr) {
92
+ return chkLen;
93
+ }
94
+ this.br.pos += chkLen;
95
+ }
96
+ return chkLen;
97
+ }
98
+ parseFmtChunk() {
99
+ let pcmAf = null;
100
+ const fmt = this.br.readUint16LE();
101
+ if (fmt === WavFileFormat.PCM) {
102
+ const channels = this.br.readUint16LE();
103
+ const sampleRate = this.br.readUint32LE();
104
+ // skip bandwidth
105
+ this.br.skip(4);
106
+ // frame size
107
+ const frameSize = this.br.readUint16LE();
108
+ // sample size in bits (PCM format only)
109
+ const sampleSizeInBits = this.br.readUint16LE();
110
+ pcmAf = new PCMAudioFormat(sampleRate, channels, frameSize / channels, sampleSizeInBits);
111
+ }
112
+ return pcmAf;
113
+ }
114
+ readData() {
115
+ let chsArr = null;
116
+ if (this.format) {
117
+ chsArr = new Array(this.format.channelCount);
118
+ const sampleCount = this.totalLength / this.format.channelCount / this.format.sampleSize;
119
+ for (let ch = 0; ch < this.format.channelCount; ch++) {
120
+ chsArr[ch] = new Float32Array(sampleCount);
121
+ }
122
+ if (this.format.sampleSize == 2) {
123
+ for (let i = 0; i < this.totalLength / 2; i++) {
124
+ for (let ch = 0; ch < this.format.channelCount; ch++) {
125
+ const s16Ampl = this.br.readInt16LE();
126
+ chsArr[ch][i] = s16Ampl / 32768;
127
+ }
128
+ }
129
+ }
130
+ }
131
+ return chsArr;
132
+ }
133
+ }
134
134
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F2cmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL2ltcGwvd2F2cmVhZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUVwRCxNQUFNLE9BQU8sU0FBUztJQU9sQixZQUFZLElBQWdCO1FBSnBCLFdBQU0sR0FBdUIsSUFBSSxDQUFDO1FBQ2xDLGdCQUFXLEdBQVEsQ0FBQyxDQUFDO1FBQ3JCLG9CQUFlLEdBQWEsSUFBSSxDQUFDO1FBR3JDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU8sVUFBVTtRQUNkLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksRUFBRSxLQUFLLGFBQWEsQ0FBQyxRQUFRLEVBQUU7WUFDL0IsTUFBTSxNQUFNLEdBQUMsNkJBQTZCLEdBQUUsRUFBRSxDQUFDO1lBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0I7UUFDRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsR0FBQyxFQUFFLEdBQUMsY0FBYyxHQUFDLENBQUMsSUFBSSxDQUFDLEVB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LElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsRUFBRTtnQkFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUM3QyxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUU7d0JBQ3BELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ3RDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsS0FBSyxDQUFDO3FCQUNqQztpQkFDRjthQUNGO1NBQ0Y7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXYXZGaWxlRm9ybWF0IH0gZnJvbSAnLi93YXZmb3JtYXQnXHJcbmltcG9ydCB7IFBDTUF1ZGlvRm9ybWF0IH0gZnJvbSAnLi4vZm9ybWF0J1xyXG5pbXBvcnQgeyBCaW5hcnlCeXRlUmVhZGVyIH0gZnJvbSAnLi4vLi4vaW8vQmluYXJ5UmVhZGVyJ1xyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBXYXZSZWFkZXIge1xyXG5cclxuICAgICAgICBwcml2YXRlIGJyOkJpbmFyeUJ5dGVSZWFkZXI7XHJcbiAgICAgICAgcHJpdmF0ZSBmb3JtYXQ6UENNQXVkaW9Gb3JtYXQgfCBudWxsPW51bGw7XHJcbiAgICAgICAgcHJpdmF0ZSB0b3RhbExlbmd0aDpudW1iZXI9MDtcclxuICAgICAgICBwcml2YXRlIGRhdGFDaHVua0xlbmd0aDpudW1iZXJ8bnVsbD1udWxsO1xyXG5cclxuICAgICAgICBjb25zdHJ1Y3RvcihkYXRhOkFycmF5QnVmZmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnIgPSBuZXcgQmluYXJ5Qnl0ZVJlYWRlcihkYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgcmVhZEhlYWRlcigpe1xyXG4gICAgICAgICAgICBjb25zdCByaCA9IHRoaXMuYnIucmVhZEFzY2lpKDQpO1xyXG4gICAgICAgICAgICBpZiAocmggIT09IFdhdkZpbGVGb3JtYXQuUklGRl9LRVkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVyck1zZz1cIkV4cGVjdGVkIFJJRkYgaGVhZGVyLCBub3Q6IFwiKyByaDtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGNsID0gdGhpcy5ici5yZWFkVWludDMyTEUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYnIucG9zICsgY2wgIT09IHRoaXMuYnIubGVuZ3RoKCkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldyb25nIGNodW5rc2l6ZSBpbiBSSUZGIGhlYWRlcjogXCIrY2wrXCIgKGV4cGVjdGVkOiBcIisodGhpcy5ici5sZW5ndGgoKSAtIHRoaXMuYnIucG9zKSsgXCIgKVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnRvdGFsTGVuZ3RoID0gY2w7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBydCA9IHRoaXMuYnIucmVhZEFzY2lpKDQpO1xyXG4gICAgICAgICAgICBpZiAocnQgIT09IFdhdkZpbGVGb3JtYXQuV0FWX0tFWSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnPVwiRXhwZWN0ZWQgXCIrV2F2RmlsZUZvcm1hdC5XQVZfS0VZK1wiIG5vdDogXCIrIHJ0O1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlYWRGb3JtYXQoKTpQQ01BdWRpb0Zvcm1hdHxudWxse1xyXG4gICAgICAgICAgICB0aGlzLmJyLnBvcz0wO1xyXG4gICAgICAgICAgICB0aGlzLnJlYWRIZWFkZXIoKTtcclxuICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLm5hdmlnYXRlVG9DaHVuaygnZm10ICcpO1xyXG4gICAgICAgICAgaWYgKCFzKSB7XHJcbiAgICAgICAgICAgIGxldCBlcnJNc2c9XCJXQVYgZmlsZSBkb2VzIG5vdCBjb250YWluIGEgZm10IGNodW5rXCI7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmZvcm1hdCA9IHRoaXMucGFyc2VGbXRDaHVuaygpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcml2YXRlIF9mcmFtZUxlbmd0aCgpOm51bWJlcnxudWxse1xyXG4gICAgICAgICAgbGV0IGZsOm51bWJlcnxudWxsPW51bGw7XHJcbiAgICAgICAgICBpZih0aGlzLmZvcm1hdCAmJiB0aGlzLmRhdGFDaHVua0xlbmd0aCE9bnVsbCkge1xyXG4gICAgICAgICAgICBmbCA9IHRoaXMuZGF0YUNodW5rTGVuZ3RoIC8gdGhpcy5mb3JtYXQuY2hhbm5lbENvdW50IC8gdGhpcy5mb3JtYXQuc2FtcGxlU2l6ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBmbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZyYW1lTGVuZ3RoKCk6bnVtYmVyfG51bGwge1xyXG4gICAgICAgICAgbGV0IGZsOm51bWJlcnxudWxsPXRoaXMuX2ZyYW1lTGVuZ3RoKCk7XHJcbiAgICAgICAgICBpZihmbD09PW51bGwpe1xyXG4gICAgICAgICAgICB0aGlzLnJlYWRGb3JtYXQoKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhQ2h1bmtMZW5ndGg9dGhpcy5uYXZpZ2F0ZVRvQ2h1bmsoJ2RhdGEnKTtcclxuICAgICAgICAgICAgZmw9dGhpcy5fZnJhbWVMZW5ndGgoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBmbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE5vdCB0ZXN0ZWQgeWV0ISEhXHJcbiAgICAgICAgcmVhZCgpOkF1ZGlvQnVmZmVyIHwgbnVsbHtcclxuICAgICAgICAgICAgdGhpcy5ici5wb3M9MDtcclxuICAgICAgICAgICAgbGV0IGFiOkF1ZGlvQnVmZmVyfG51bGw9bnVsbDtcclxuICAgICAgICAgICAgdGhpcy5yZWFkSGVhZGVyKCk7XHJcbiAgICAgICAgICAgIGxldCBzID0gdGhpcy5uYXZpZ2F0ZVRvQ2h1bmsoJ2ZtdCAnKTtcclxuICAgICAgICAgICAgaWYgKCFzKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZXJyTXNnPVwiV0FWIGZpbGUgZG9lcyBub3QgY29udGFpbiBhIGZtdCBjaHVua1wiO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5mb3JtYXQgPSB0aGlzLnBhcnNlRm10Q2h1bmsoKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhQ2h1bmtMZW5ndGggPSB0aGlzLm5hdmlnYXRlVG9DaHVuaygnZGF0YScpO1xyXG4gICAgICAgICAgICBsZXQgY2hzQXJyID0gdGhpcy5yZWFkRGF0YSgpO1xyXG4gICAgICAgICAgICBsZXQgc3I9dGhpcy5mb3JtYXQ/LnNhbXBsZVJhdGU7XHJcbiAgICAgICAgICAgIGxldCBuQ2hzPXRoaXMuZm9ybWF0Py5jaGFubmVsQ291bnQ7XHJcbiAgICAgICAgICAgIGlmKHNyICYmIGNoc0FyciAmJiBuQ2hzICYmIG5DaHM+MCAmJiBuQ2hzPT1jaHNBcnI/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgYWIgPSBuZXcgQXVkaW9CdWZmZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aDogY2hzQXJyWzBdLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkNoYW5uZWxzOiB0aGlzLmZvcm1hdD8uY2hhbm5lbENvdW50LFxyXG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGU6IHNyXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgY2g9MDtjaDxuQ2hzO2NoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBhYi5jb3B5VG9DaGFubmVsKGNoc0FycltjaF0sIGNoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYWI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcml2YXRlIG5hdmlnYXRlVG9DaHVuayhjaHVua1N0cmluZzpzdHJpbmcpOm51bWJlciB7XHJcbiAgICAgICAgICAgIC8vIHBvc2l0aW9uIGFmdGVyIFJJRkYgaGVhZGVyXHJcbiAgICAgICAgICAvLyBUT0RPIGFzc3VtZXMgbm8gb3RoZXIgY2h1bmtzIGV4Y2VwdCAnZGF0YSdcclxuICAgICAgICAgICAgdGhpcy5ici5wb3MgPSAxMjtcclxuICAgICAgICAgICAgbGV0IGNoa1N0ciA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBjaGtMZW4gPSAtMTtcclxuICAgICAgICAgICAgd2hpbGUgKCF0aGlzLmJyLmVvZigpKSB7XHJcbiAgICAgICAgICAgICAgICBjaGtTdHIgPSB0aGlzLmJyLnJlYWRBc2NpaSg0KTtcclxuICAgICAgICAgICAgICAgIGNoa0xlbiA9IHRoaXMuYnIucmVhZFVpbnQzMkxFKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2h1bmtTdHJpbmcgPT09IGNoa1N0cikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGtMZW47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJyLnBvcyArPSBjaGtMZW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNoa0xlbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgcGFyc2VGbXRDaHVuaygpOlBDTUF1ZGlvRm9ybWF0IHwgbnVsbCB7XHJcbiAgICAgICAgICAgIGxldCBwY21BZjpQQ01BdWRpb0Zvcm1hdHxudWxsPW51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGZtdCA9IHRoaXMuYnIucmVhZFVpbnQxNkxFKCk7XHJcbiAgICAgICAgICAgIGlmIChmbXQgPT09IFdhdkZpbGVGb3JtYXQuUENNKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVscyA9IHRoaXMuYnIucmVhZFVpbnQxNkxFKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzYW1wbGVSYXRlID0gdGhpcy5ici5yZWFkVWludDMyTEUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBza2lwIGJhbmR3aWR0aFxyXG4gICAgICAgICAgICAgICAgdGhpcy5ici5za2lwKDQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGZyYW1lIHNpemVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lU2l6ZSA9IHRoaXMuYnIucmVhZFVpbnQxNkxFKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gc2FtcGxlIHNpemUgaW4gYml0cyAoUENNIGZvcm1hdCBvbmx5KVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2FtcGxlU2l6ZUluQml0cyA9IHRoaXMuYnIucmVhZFVpbnQxNkxFKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgcGNtQWY9bmV3IFBDTUF1ZGlvRm9ybWF0KHNhbXBsZVJhdGUsIGNoYW5uZWxzLCBmcmFtZVNpemUgLyBjaGFubmVscywgc2FtcGxlU2l6ZUluQml0cyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHBjbUFmO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkRGF0YSgpOkFycmF5PEZsb2F0MzJBcnJheT4gfCBudWxse1xyXG4gICAgICAgICAgICBsZXQgY2hzQXJyPW51bGw7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuZm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgY2hzQXJyID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4odGhpcy5mb3JtYXQuY2hhbm5lbENvdW50KTtcclxuICAgICAgICAgICAgICBjb25zdCBzYW1wbGVDb3VudCA9IHRoaXMudG90YWxMZW5ndGggLyB0aGlzLmZvcm1hdC5jaGFubmVsQ291bnQgLyB0aGlzLmZvcm1hdC5zYW1wbGVTaXplO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCB0aGlzLmZvcm1hdC5jaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgIGNoc0FycltjaF0gPSBuZXcgRmxvYXQzMkFycmF5KHNhbXBsZUNvdW50KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWF0LnNhbXBsZVNpemUgPT0gMikge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRvdGFsTGVuZ3RoIC8gMjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCB0aGlzLmZvcm1hdC5jaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzMTZBbXBsID0gdGhpcy5ici5yZWFkSW50MTZMRSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoc0FycltjaF1baV0gPSBzMTZBbXBsIC8gMzI3Njg7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNoc0FycjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4iXX0=
@@ -0,0 +1,105 @@
1
+ import { WavFileFormat } from './wavformat';
2
+ import { BinaryByteWriter } from '../../io/BinaryWriter';
3
+ import { WorkerHelper } from "../../utils/utils";
4
+ export class WavWriter {
5
+ static { this.DEFAULT_SAMPLE_SIZE_BYTES = 2; }
6
+ constructor() {
7
+ this.workerURL = null;
8
+ this.bw = new BinaryByteWriter();
9
+ }
10
+ /*
11
+ * Method used as worker code.
12
+ */
13
+ workerFunction() {
14
+ self.onmessage = function (msg) {
15
+ const valView = new DataView(msg.data.buf, msg.data.bufPos);
16
+ let bufPos = 0;
17
+ let hDynIntRange = 1 << (msg.data.sampleSizeInBits - 1);
18
+ for (let s = 0; s < msg.data.frameLength; s++) {
19
+ // interleaved channel data
20
+ for (let ch = 0; ch < msg.data.chs; ch++) {
21
+ let srcPos = (ch * msg.data.frameLength) + s;
22
+ let valFlt = msg.data.audioData[srcPos];
23
+ let valInt = Math.round(valFlt * hDynIntRange);
24
+ valView.setInt16(bufPos, valInt, true);
25
+ bufPos += 2;
26
+ }
27
+ }
28
+ postMessage({ buf: msg.data.buf }, [msg.data.buf]);
29
+ //self.close()
30
+ };
31
+ }
32
+ writeFmtChunk(audioBuffer) {
33
+ this.bw.writeUint16(WavFileFormat.PCM, true);
34
+ let frameSize = WavWriter.DEFAULT_SAMPLE_SIZE_BYTES * audioBuffer.numberOfChannels; // fixed 16-bit for now
35
+ this.bw.writeUint16(audioBuffer.numberOfChannels, true);
36
+ this.bw.writeUint32(audioBuffer.sampleRate, true);
37
+ // dwAvgBytesPerSec
38
+ this.bw.writeUint32(frameSize * audioBuffer.sampleRate, true);
39
+ this.bw.writeUint16(frameSize, true);
40
+ // sample size in bits (PCM format only)
41
+ this.bw.writeUint16(WavWriter.DEFAULT_SAMPLE_SIZE_BYTES * 8, true);
42
+ }
43
+ writeDataChunk(audioBuffer) {
44
+ let chData0 = audioBuffer.getChannelData(0);
45
+ let dataLen = chData0.length;
46
+ let hDynIntRange = 1 << ((WavWriter.DEFAULT_SAMPLE_SIZE_BYTES * 8) - 1);
47
+ for (let s = 0; s < dataLen; s++) {
48
+ // interleaved channel data
49
+ for (let ch = 0; ch < audioBuffer.numberOfChannels; ch++) {
50
+ let chData = audioBuffer.getChannelData(ch);
51
+ let valFlt = chData[s];
52
+ let valInt = Math.round(valFlt * hDynIntRange);
53
+ this.bw.writeInt16(valInt, true);
54
+ }
55
+ }
56
+ }
57
+ writeChunkHeader(name, chkLen) {
58
+ this.bw.writeAscii(name);
59
+ this.bw.writeUint32(chkLen, true);
60
+ }
61
+ writeAsync(audioBuffer, callback) {
62
+ let dataChkByteLen = this.writeHeader(audioBuffer);
63
+ if (!this.workerURL) {
64
+ this.workerURL = WorkerHelper.buildWorkerBlobURL(this.workerFunction);
65
+ }
66
+ let wo = new Worker(this.workerURL);
67
+ let chs = audioBuffer.numberOfChannels;
68
+ let frameLength = audioBuffer.getChannelData(0).length;
69
+ let ad = new Float32Array(chs * frameLength);
70
+ for (let ch = 0; ch < chs; ch++) {
71
+ ad.set(audioBuffer.getChannelData(ch), ch * frameLength);
72
+ }
73
+ // ensureCapacity blocks !!!
74
+ this.bw.ensureCapacity(dataChkByteLen);
75
+ wo.onmessage = (me) => {
76
+ callback(me.data.buf);
77
+ wo.terminate();
78
+ };
79
+ //TODO Fixed sample size of 16 bits
80
+ wo.postMessage({ sampleSizeInBits: 16, chs: chs, frameLength: frameLength, audioData: ad, buf: this.bw.buf, bufPos: this.bw.pos }, [ad.buffer, this.bw.buf]);
81
+ }
82
+ write(audioBuffer) {
83
+ this.writeHeader(audioBuffer);
84
+ this.writeDataChunk(audioBuffer);
85
+ return this.bw.finish();
86
+ }
87
+ writeHeader(audioBuffer) {
88
+ this.bw.writeAscii(WavFileFormat.RIFF_KEY);
89
+ let dataChkByteLen = 0;
90
+ //const dataChkByteLen=audioBuffer.getChannelData(0).length*WavWriter.DEFAULT_SAMPLE_SIZE_BYTES*audioBuffer.numberOfChannels;
91
+ const abChs = audioBuffer.numberOfChannels;
92
+ if (abChs > 0) {
93
+ const abCh0 = audioBuffer.getChannelData(0);
94
+ dataChkByteLen = abCh0.length * WavWriter.DEFAULT_SAMPLE_SIZE_BYTES * abChs;
95
+ }
96
+ const wavChunkByteLen = (4 + 4) * 3 + 16 + dataChkByteLen;
97
+ this.bw.writeUint32(wavChunkByteLen, true); // must be set to file length-8 later
98
+ this.bw.writeAscii(WavFileFormat.WAV_KEY);
99
+ this.writeChunkHeader('fmt ', 16);
100
+ this.writeFmtChunk(audioBuffer);
101
+ this.writeChunkHeader('data', dataChkByteLen);
102
+ return dataChkByteLen;
103
+ }
104
+ }
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F2d3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL2ltcGwvd2F2d3JpdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDeEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBSTVDLE1BQU0sT0FBTyxTQUFTO2FBRUosOEJBQXlCLEdBQVUsQ0FBQyxBQUFYLENBQVk7SUFHckQ7UUFEUSxjQUFTLEdBQWMsSUFBSSxDQUFDO1FBRWxDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsR0FBZ0I7WUFFekMsTUFBTSxPQUFPLEdBQUcsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUUzRCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixJQUFJLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3hELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDN0MsMkJBQTJCO2dCQUUzQixLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVB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Q0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBQyxjQUFjLENBQUMsQ0FBQztRQUM3QyxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2F2RmlsZUZvcm1hdCB9IGZyb20gJy4vd2F2Zm9ybWF0J1xyXG5pbXBvcnQgeyBCaW5hcnlCeXRlV3JpdGVyIH0gZnJvbSAnLi4vLi4vaW8vQmluYXJ5V3JpdGVyJ1xyXG5pbXBvcnQge1dvcmtlckhlbHBlcn0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XHJcbmRlY2xhcmUgZnVuY3Rpb24gcG9zdE1lc3NhZ2UgKG1lc3NhZ2U6YW55LCB0cmFuc2ZlcjpBcnJheTxhbnk+KTp2b2lkO1xyXG5cclxuXHJcbiAgIGV4cG9ydCBjbGFzcyBXYXZXcml0ZXIge1xyXG5cclxuICAgICBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9TQU1QTEVfU0laRV9CWVRFUzpudW1iZXIgPSAyO1xyXG4gICAgIHByaXZhdGUgYnc6QmluYXJ5Qnl0ZVdyaXRlcjtcclxuICAgICBwcml2YXRlIHdvcmtlclVSTDogc3RyaW5nfG51bGw9bnVsbDtcclxuICAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgIHRoaXMuYncgPSBuZXcgQmluYXJ5Qnl0ZVdyaXRlcigpO1xyXG4gICAgIH1cclxuXHJcbiAgICAgLypcclxuICAgICAgKiAgTWV0aG9kIHVzZWQgYXMgd29ya2VyIGNvZGUuXHJcbiAgICAgICovXHJcbiAgICAgd29ya2VyRnVuY3Rpb24oKSB7XHJcbiAgICAgICBzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChtc2c6TWVzc2FnZUV2ZW50KSB7XHJcblxyXG4gICAgICAgICBjb25zdCB2YWxWaWV3ID0gbmV3IERhdGFWaWV3KG1zZy5kYXRhLmJ1Zixtc2cuZGF0YS5idWZQb3MpO1xyXG5cclxuICAgICAgICAgbGV0IGJ1ZlBvcyA9IDA7XHJcbiAgICAgICAgIGxldCBoRHluSW50UmFuZ2UgPSAxIDw8IChtc2cuZGF0YS5zYW1wbGVTaXplSW5CaXRzIC0gMSk7XHJcbiAgICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgbXNnLmRhdGEuZnJhbWVMZW5ndGg7IHMrKykge1xyXG4gICAgICAgICAgIC8vIGludGVybGVhdmVkIGNoYW5uZWwgZGF0YVxyXG5cclxuICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgbXNnLmRhdGEuY2hzOyBjaCsrKSB7XHJcbiAgICAgICAgICAgICBsZXQgc3JjUG9zPShjaCptc2cuZGF0YS5mcmFtZUxlbmd0aCkrcztcclxuICAgICAgICAgICAgIGxldCB2YWxGbHQgPSBtc2cuZGF0YS5hdWRpb0RhdGFbc3JjUG9zXTtcclxuICAgICAgICAgICAgIGxldCB2YWxJbnQgPSBNYXRoLnJvdW5kKHZhbEZsdCAqIGhEeW5JbnRSYW5nZSk7XHJcbiAgICAgICAgICAgICB2YWxWaWV3LnNldEludDE2KGJ1ZlBvcywgdmFsSW50LCB0cnVlKTtcclxuICAgICAgICAgICAgIGJ1ZlBvcys9MjtcclxuICAgICAgICAgICB9XHJcbiAgICAgICAgIH1cclxuICAgICAgICAgcG9zdE1lc3NhZ2Uoe2J1Zjptc2cuZGF0YS5idWZ9LCBbbXNnLmRhdGEuYnVmXSk7XHJcbiAgICAgICAgIC8vc2VsZi5jbG9zZSgpXHJcbiAgICAgICB9XHJcbiAgICAgfVxyXG5cclxuXHJcbiAgICAgd3JpdGVGbXRDaHVuayhhdWRpb0J1ZmZlcjpBdWRpb0J1ZmZlcil7XHJcblxyXG4gICAgICAgdGhpcy5idy53cml0ZVVpbnQxNihXYXZGaWxlRm9ybWF0LlBDTSx0cnVlKTtcclxuICAgICAgIGxldCBmcmFtZVNpemU9V2F2V3JpdGVyLkRFRkFVTFRfU0FNUExFX1NJWkVfQllURVMqYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVsczsgLy8gZml4ZWQgMTYtYml0IGZvciBub3dcclxuICAgICAgIHRoaXMuYncud3JpdGVVaW50MTYoYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscyx0cnVlKTtcclxuICAgICAgIHRoaXMuYncud3JpdGVVaW50MzIoYXVkaW9CdWZmZXIuc2FtcGxlUmF0ZSx0cnVlKTtcclxuICAgICAgICAgLy8gZHdBdmdCeXRlc1BlclNlY1xyXG4gICAgICAgdGhpcy5idy53cml0ZVVpbnQzMihmcmFtZVNpemUqYXVkaW9CdWZmZXIuc2FtcGxlUmF0ZSx0cnVlKTtcclxuICAgICAgIHRoaXMuYncud3JpdGVVaW50MTYoZnJhbWVTaXplLHRydWUpO1xyXG4gICAgICAgLy8gc2FtcGxlIHNpemUgaW4gYml0cyAoUENNIGZvcm1hdCBvbmx5KVxyXG4gICAgICAgdGhpcy5idy53cml0ZVVpbnQxNihXYXZXcml0ZXIuREVGQVVMVF9TQU1QTEVfU0laRV9CWVRFUyo4LHRydWUpO1xyXG4gICAgIH1cclxuXHJcbiAgICAgd3JpdGVEYXRhQ2h1bmsoYXVkaW9CdWZmZXI6QXVkaW9CdWZmZXIpe1xyXG5cclxuICAgICAgIGxldCBjaERhdGEwPWF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKDApO1xyXG4gICAgICAgbGV0IGRhdGFMZW49Y2hEYXRhMC5sZW5ndGg7XHJcbiAgICAgICAgbGV0IGhEeW5JbnRSYW5nZT0xIDw8ICgoV2F2V3JpdGVyLkRFRkFVTFRfU0FNUExFX1NJWkVfQllURVMqOCktMSk7XHJcbiAgICAgICBmb3IobGV0IHM9MDtzPGRhdGFMZW47cysrKSB7XHJcbiAgICAgICAgIC8vIGludGVybGVhdmVkIGNoYW5uZWwgZGF0YVxyXG4gICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVsczsgY2grKykge1xyXG4gICAgICAgICAgIGxldCBjaERhdGEgPSBhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YShjaCk7XHJcbiAgICAgICAgICAgbGV0IHZhbEZsdD1jaERhdGFbc107XHJcbiAgICAgICAgICAgbGV0IHZhbEludD1NYXRoLnJvdW5kKHZhbEZsdCpoRHluSW50UmFuZ2UpO1xyXG4gICAgICAgICAgIHRoaXMuYncud3JpdGVJbnQxNih2YWxJbnQsdHJ1ZSk7XHJcbiAgICAgICAgIH1cclxuICAgICAgIH1cclxuXHJcbiAgICAgfVxyXG5cclxuICAgICB3cml0ZUNodW5rSGVhZGVyKG5hbWU6c3RyaW5nLGNoa0xlbjpudW1iZXIpe1xyXG4gICAgICAgdGhpcy5idy53cml0ZUFzY2lpKG5hbWUpO1xyXG4gICAgICAgdGhpcy5idy53cml0ZVVpbnQzMihjaGtMZW4sdHJ1ZSk7XHJcbiAgICAgfVxyXG5cclxuICAgICB3cml0ZUFzeW5jKGF1ZGlvQnVmZmVyOkF1ZGlvQnVmZmVyLGNhbGxiYWNrOiAod2F2RmlsZURhdGE6VWludDhBcnJheSk9PiBhbnkpe1xyXG5cclxuICAgICAgIGxldCBkYXRhQ2hrQnl0ZUxlbj10aGlzLndyaXRlSGVhZGVyKGF1ZGlvQnVmZmVyKTtcclxuICAgICAgIGlmICghdGhpcy53b3JrZXJVUkwpIHtcclxuICAgICAgICAgdGhpcy53b3JrZXJVUkwgPSBXb3JrZXJIZWxwZXIuYnVpbGRXb3JrZXJCbG9iVVJMKHRoaXMud29ya2VyRnVuY3Rpb24pXHJcbiAgICAgICAgfVxyXG4gICAgICAgbGV0IHdvID0gbmV3IFdvcmtlcih0aGlzLndvcmtlclVSTCk7XHJcblxyXG4gICAgICAgbGV0IGNocyA9IGF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHM7XHJcblxyXG4gICAgICAgbGV0IGZyYW1lTGVuZ3RoID0gYXVkaW9CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoMCkubGVuZ3RoO1xyXG4gICAgICAgbGV0IGFkID0gbmV3IEZsb2F0MzJBcnJheShjaHMgKiBmcmFtZUxlbmd0aCk7XHJcbiAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hzOyBjaCsrKSB7XHJcbiAgICAgICAgIGFkLnNldChhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YShjaCksIGNoICogZnJhbWVMZW5ndGgpO1xyXG4gICAgICAgfVxyXG4gICAgICAgICAvLyBlbnN1cmVDYXBhY2l0eSBibG9ja3MgISEhXHJcbiAgICAgICB0aGlzLmJ3LmVuc3VyZUNhcGFjaXR5KGRhdGFDaGtCeXRlTGVuKTtcclxuICAgICAgIHdvLm9ubWVzc2FnZSA9IChtZSkgPT4ge1xyXG4gICAgICAgICBjYWxsYmFjayhtZS5kYXRhLmJ1Zik7XHJcbiAgICAgICAgIHdvLnRlcm1pbmF0ZSgpO1xyXG4gICAgICAgfVxyXG4gICAgICAgLy9UT0RPIEZpeGVkIHNhbXBsZSBzaXplIG9mIDE2IGJpdHNcclxuICAgICAgIHdvLnBvc3RNZXNzYWdlKHtzYW1wbGVTaXplSW5CaXRzOjE2LCBjaHM6IGNocywgZnJhbWVMZW5ndGg6IGZyYW1lTGVuZ3RoLCBhdWRpb0RhdGE6IGFkLGJ1Zjp0aGlzLmJ3LmJ1ZixidWZQb3M6dGhpcy5idy5wb3N9LCBbYWQuYnVmZmVyLHRoaXMuYncuYnVmXSk7XHJcblxyXG4gICAgIH1cclxuXHJcbiAgICAgd3JpdGUoYXVkaW9CdWZmZXI6QXVkaW9CdWZmZXIpOlVpbnQ4QXJyYXl7XHJcbiAgICAgICB0aGlzLndyaXRlSGVhZGVyKGF1ZGlvQnVmZmVyKTtcclxuICAgICAgIHRoaXMud3JpdGVEYXRhQ2h1bmsoYXVkaW9CdWZmZXIpO1xyXG4gICAgICAgcmV0dXJuIHRoaXMuYncuZmluaXNoKCk7XHJcbiAgICAgfVxyXG5cclxuXHJcbiAgICAgIHdyaXRlSGVhZGVyKGF1ZGlvQnVmZmVyOkF1ZGlvQnVmZmVyKTpudW1iZXJ7XHJcbiAgICAgICAgdGhpcy5idy53cml0ZUFzY2lpKFdhdkZpbGVGb3JtYXQuUklGRl9LRVkpO1xyXG4gICAgICAgIGxldCBkYXRhQ2hrQnl0ZUxlbj0wO1xyXG4gICAgICAgIC8vY29uc3QgZGF0YUNoa0J5dGVMZW49YXVkaW9CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoMCkubGVuZ3RoKldhdldyaXRlci5ERUZBVUxUX1NBTVBMRV9TSVpFX0JZVEVTKmF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHM7XHJcbiAgICAgICAgY29uc3QgYWJDaHM9YXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscztcclxuICAgICAgICBpZihhYkNocz4wKXtcclxuICAgICAgICAgIGNvbnN0IGFiQ2gwPWF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKDApO1xyXG4gICAgICAgICAgZGF0YUNoa0J5dGVMZW49YWJDaDAubGVuZ3RoKldhdldyaXRlci5ERUZBVUxUX1NBTVBMRV9TSVpFX0JZVEVTKmFiQ2hzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB3YXZDaHVua0J5dGVMZW49KDQrNCkqMysxNitkYXRhQ2hrQnl0ZUxlbjtcclxuICAgICAgICB0aGlzLmJ3LndyaXRlVWludDMyKHdhdkNodW5rQnl0ZUxlbix0cnVlKTsgLy8gbXVzdCBiZSBzZXQgdG8gZmlsZSBsZW5ndGgtOCBsYXRlclxyXG4gICAgICAgIHRoaXMuYncud3JpdGVBc2NpaShXYXZGaWxlRm9ybWF0LldBVl9LRVkpO1xyXG4gICAgICAgIHRoaXMud3JpdGVDaHVua0hlYWRlcignZm10ICcsMTYpO1xyXG4gICAgICAgIHRoaXMud3JpdGVGbXRDaHVuayhhdWRpb0J1ZmZlcik7XHJcbiAgICAgICAgdGhpcy53cml0ZUNodW5rSGVhZGVyKCdkYXRhJyxkYXRhQ2hrQnl0ZUxlbik7XHJcbiAgICAgICAgcmV0dXJuIGRhdGFDaGtCeXRlTGVuO1xyXG4gICAgICB9XHJcblxyXG4gICB9XHJcblxyXG5cclxuXHJcbiJdfQ==