@siteed/expo-audio-studio 2.18.6 โ†’ 3.0.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 (329) hide show
  1. package/README.md +13 -297
  2. package/index.d.ts +1 -0
  3. package/index.js +1 -0
  4. package/package.json +6 -135
  5. package/CHANGELOG.md +0 -501
  6. package/LICENSE +0 -21
  7. package/android/build.gradle +0 -129
  8. package/android/src/androidTest/assets/chorus.wav +0 -0
  9. package/android/src/androidTest/assets/jfk.wav +0 -0
  10. package/android/src/androidTest/assets/osr_us_000_0010_8k.wav +0 -0
  11. package/android/src/androidTest/assets/recorder_hello_world.wav +0 -0
  12. package/android/src/androidTest/java/net/siteed/audiostream/AudioProcessorInstrumentedTest.kt +0 -197
  13. package/android/src/androidTest/java/net/siteed/audiostream/AudioRecorderInstrumentedTest.kt +0 -541
  14. package/android/src/androidTest/java/net/siteed/audiostream/AudioRecorderPerformanceInstrumentedTest.kt +0 -234
  15. package/android/src/androidTest/java/net/siteed/audiostream/integration/AudioFocusStrategyIntegrationTest.kt +0 -332
  16. package/android/src/androidTest/java/net/siteed/audiostream/integration/BufferDurationIntegrationTest.kt +0 -324
  17. package/android/src/androidTest/java/net/siteed/audiostream/integration/CompressedOnlyOutputTest.kt +0 -253
  18. package/android/src/androidTest/java/net/siteed/audiostream/integration/DeviceDisconnectionFallbackTest.kt +0 -218
  19. package/android/src/androidTest/java/net/siteed/audiostream/integration/EventEmissionIntervalTest.kt +0 -120
  20. package/android/src/androidTest/java/net/siteed/audiostream/integration/M4aFormatTest.kt +0 -345
  21. package/android/src/androidTest/java/net/siteed/audiostream/integration/OutputControlIntegrationTest.kt +0 -340
  22. package/android/src/androidTest/java/net/siteed/audiostream/integration/PcmStreamingDurationTest.kt +0 -252
  23. package/android/src/androidTest/java/net/siteed/audiostream/integration/README.md +0 -95
  24. package/android/src/androidTest/java/net/siteed/audiostream/integration/run_integration_tests.sh +0 -43
  25. package/android/src/main/AndroidManifest.xml +0 -30
  26. package/android/src/main/java/net/siteed/audiostream/AudioAnalysisData.kt +0 -188
  27. package/android/src/main/java/net/siteed/audiostream/AudioDataEncoder.kt +0 -9
  28. package/android/src/main/java/net/siteed/audiostream/AudioDeviceManager.kt +0 -1741
  29. package/android/src/main/java/net/siteed/audiostream/AudioFileHandler.kt +0 -136
  30. package/android/src/main/java/net/siteed/audiostream/AudioFormatUtils.kt +0 -354
  31. package/android/src/main/java/net/siteed/audiostream/AudioNotificationsManager.kt +0 -439
  32. package/android/src/main/java/net/siteed/audiostream/AudioProcessor.kt +0 -2237
  33. package/android/src/main/java/net/siteed/audiostream/AudioRecorderManager.kt +0 -2141
  34. package/android/src/main/java/net/siteed/audiostream/AudioRecordingService.kt +0 -167
  35. package/android/src/main/java/net/siteed/audiostream/AudioTrimmer.kt +0 -1099
  36. package/android/src/main/java/net/siteed/audiostream/Constants.kt +0 -37
  37. package/android/src/main/java/net/siteed/audiostream/EventSender.kt +0 -7
  38. package/android/src/main/java/net/siteed/audiostream/ExpoAudioStreamModule.kt +0 -1113
  39. package/android/src/main/java/net/siteed/audiostream/FFT.kt +0 -99
  40. package/android/src/main/java/net/siteed/audiostream/Features.kt +0 -98
  41. package/android/src/main/java/net/siteed/audiostream/LogUtils.kt +0 -93
  42. package/android/src/main/java/net/siteed/audiostream/NotificationConfig.kt +0 -72
  43. package/android/src/main/java/net/siteed/audiostream/PermissionUtils.kt +0 -68
  44. package/android/src/main/java/net/siteed/audiostream/RecordingActionReceiver.kt +0 -59
  45. package/android/src/main/java/net/siteed/audiostream/RecordingConfig.kt +0 -257
  46. package/android/src/main/java/net/siteed/audiostream/WaveformConfig.kt +0 -19
  47. package/android/src/main/java/net/siteed/audiostream/WaveformRenderer.kt +0 -159
  48. package/android/src/main/res/drawable/ic_default_action_icon.xml +0 -16
  49. package/android/src/main/res/drawable/ic_microphone.xml +0 -13
  50. package/android/src/main/res/drawable/ic_pause.xml +0 -10
  51. package/android/src/main/res/drawable/ic_play.xml +0 -10
  52. package/android/src/main/res/drawable/ic_stop.xml +0 -10
  53. package/android/src/main/res/layout/notification_recording.xml +0 -37
  54. package/android/src/test/java/net/siteed/audiostream/AudioFileHandlerTest.kt +0 -279
  55. package/android/src/test/java/net/siteed/audiostream/AudioFocusStrategyTest.kt +0 -249
  56. package/android/src/test/java/net/siteed/audiostream/AudioFormatTest.kt +0 -151
  57. package/android/src/test/java/net/siteed/audiostream/AudioFormatUtilsTest.kt +0 -273
  58. package/android/src/test/java/net/siteed/audiostream/DeviceDisconnectionFallbackUnitTest.kt +0 -140
  59. package/android/src/test/resources/chorus.wav +0 -0
  60. package/android/src/test/resources/generate_test_audio.py +0 -94
  61. package/android/src/test/resources/jfk.wav +0 -0
  62. package/android/src/test/resources/osr_us_000_0010_8k.wav +0 -0
  63. package/android/src/test/resources/recorder_hello_world.wav +0 -0
  64. package/app.plugin.js +0 -3
  65. package/build/cjs/AudioAnalysis/AudioAnalysis.types.js +0 -4
  66. package/build/cjs/AudioAnalysis/AudioAnalysis.types.js.map +0 -1
  67. package/build/cjs/AudioAnalysis/extractAudioAnalysis.js +0 -210
  68. package/build/cjs/AudioAnalysis/extractAudioAnalysis.js.map +0 -1
  69. package/build/cjs/AudioAnalysis/extractAudioData.js +0 -21
  70. package/build/cjs/AudioAnalysis/extractAudioData.js.map +0 -1
  71. package/build/cjs/AudioAnalysis/extractMelSpectrogram.js +0 -92
  72. package/build/cjs/AudioAnalysis/extractMelSpectrogram.js.map +0 -1
  73. package/build/cjs/AudioAnalysis/extractPreview.js +0 -28
  74. package/build/cjs/AudioAnalysis/extractPreview.js.map +0 -1
  75. package/build/cjs/AudioAnalysis/extractWaveform.js +0 -18
  76. package/build/cjs/AudioAnalysis/extractWaveform.js.map +0 -1
  77. package/build/cjs/AudioDeviceManager.js +0 -689
  78. package/build/cjs/AudioDeviceManager.js.map +0 -1
  79. package/build/cjs/AudioRecorder.provider.js +0 -78
  80. package/build/cjs/AudioRecorder.provider.js.map +0 -1
  81. package/build/cjs/ExpoAudioStream.native.js +0 -8
  82. package/build/cjs/ExpoAudioStream.native.js.map +0 -1
  83. package/build/cjs/ExpoAudioStream.types.js +0 -11
  84. package/build/cjs/ExpoAudioStream.types.js.map +0 -1
  85. package/build/cjs/ExpoAudioStream.web.js +0 -708
  86. package/build/cjs/ExpoAudioStream.web.js.map +0 -1
  87. package/build/cjs/ExpoAudioStreamModule.js +0 -718
  88. package/build/cjs/ExpoAudioStreamModule.js.map +0 -1
  89. package/build/cjs/WebRecorder.web.js +0 -777
  90. package/build/cjs/WebRecorder.web.js.map +0 -1
  91. package/build/cjs/constants/platformLimitations.js +0 -99
  92. package/build/cjs/constants/platformLimitations.js.map +0 -1
  93. package/build/cjs/constants.js +0 -17
  94. package/build/cjs/constants.js.map +0 -1
  95. package/build/cjs/events.js +0 -29
  96. package/build/cjs/events.js.map +0 -1
  97. package/build/cjs/hooks/useAudioDevices.js +0 -179
  98. package/build/cjs/hooks/useAudioDevices.js.map +0 -1
  99. package/build/cjs/index.js +0 -58
  100. package/build/cjs/index.js.map +0 -1
  101. package/build/cjs/trimAudio.js +0 -76
  102. package/build/cjs/trimAudio.js.map +0 -1
  103. package/build/cjs/useAudioRecorder.js +0 -518
  104. package/build/cjs/useAudioRecorder.js.map +0 -1
  105. package/build/cjs/utils/BlobFix.js +0 -502
  106. package/build/cjs/utils/BlobFix.js.map +0 -1
  107. package/build/cjs/utils/audioProcessing.js +0 -136
  108. package/build/cjs/utils/audioProcessing.js.map +0 -1
  109. package/build/cjs/utils/cleanNativeOptions.js +0 -22
  110. package/build/cjs/utils/cleanNativeOptions.js.map +0 -1
  111. package/build/cjs/utils/concatenateBuffers.js +0 -25
  112. package/build/cjs/utils/concatenateBuffers.js.map +0 -1
  113. package/build/cjs/utils/convertPCMToFloat32.js +0 -124
  114. package/build/cjs/utils/convertPCMToFloat32.js.map +0 -1
  115. package/build/cjs/utils/crc32.js +0 -52
  116. package/build/cjs/utils/crc32.js.map +0 -1
  117. package/build/cjs/utils/encodingToBitDepth.js +0 -17
  118. package/build/cjs/utils/encodingToBitDepth.js.map +0 -1
  119. package/build/cjs/utils/getWavFileInfo.js +0 -96
  120. package/build/cjs/utils/getWavFileInfo.js.map +0 -1
  121. package/build/cjs/utils/writeWavHeader.js +0 -88
  122. package/build/cjs/utils/writeWavHeader.js.map +0 -1
  123. package/build/cjs/workers/InlineFeaturesExtractor.web.js +0 -859
  124. package/build/cjs/workers/InlineFeaturesExtractor.web.js.map +0 -1
  125. package/build/cjs/workers/inlineAudioWebWorker.web.js +0 -184
  126. package/build/cjs/workers/inlineAudioWebWorker.web.js.map +0 -1
  127. package/build/esm/AudioAnalysis/AudioAnalysis.types.js +0 -3
  128. package/build/esm/AudioAnalysis/AudioAnalysis.types.js.map +0 -1
  129. package/build/esm/AudioAnalysis/extractAudioAnalysis.js +0 -202
  130. package/build/esm/AudioAnalysis/extractAudioAnalysis.js.map +0 -1
  131. package/build/esm/AudioAnalysis/extractAudioData.js +0 -14
  132. package/build/esm/AudioAnalysis/extractAudioData.js.map +0 -1
  133. package/build/esm/AudioAnalysis/extractMelSpectrogram.js +0 -89
  134. package/build/esm/AudioAnalysis/extractMelSpectrogram.js.map +0 -1
  135. package/build/esm/AudioAnalysis/extractPreview.js +0 -25
  136. package/build/esm/AudioAnalysis/extractPreview.js.map +0 -1
  137. package/build/esm/AudioAnalysis/extractWaveform.js +0 -11
  138. package/build/esm/AudioAnalysis/extractWaveform.js.map +0 -1
  139. package/build/esm/AudioDeviceManager.js +0 -682
  140. package/build/esm/AudioDeviceManager.js.map +0 -1
  141. package/build/esm/AudioRecorder.provider.js +0 -40
  142. package/build/esm/AudioRecorder.provider.js.map +0 -1
  143. package/build/esm/ExpoAudioStream.native.js +0 -6
  144. package/build/esm/ExpoAudioStream.native.js.map +0 -1
  145. package/build/esm/ExpoAudioStream.types.js +0 -8
  146. package/build/esm/ExpoAudioStream.types.js.map +0 -1
  147. package/build/esm/ExpoAudioStream.web.js +0 -704
  148. package/build/esm/ExpoAudioStream.web.js.map +0 -1
  149. package/build/esm/ExpoAudioStreamModule.js +0 -713
  150. package/build/esm/ExpoAudioStreamModule.js.map +0 -1
  151. package/build/esm/WebRecorder.web.js +0 -773
  152. package/build/esm/WebRecorder.web.js.map +0 -1
  153. package/build/esm/constants/platformLimitations.js +0 -90
  154. package/build/esm/constants/platformLimitations.js.map +0 -1
  155. package/build/esm/constants.js +0 -14
  156. package/build/esm/constants.js.map +0 -1
  157. package/build/esm/events.js +0 -21
  158. package/build/esm/events.js.map +0 -1
  159. package/build/esm/hooks/useAudioDevices.js +0 -176
  160. package/build/esm/hooks/useAudioDevices.js.map +0 -1
  161. package/build/esm/index.js +0 -20
  162. package/build/esm/index.js.map +0 -1
  163. package/build/esm/trimAudio.js +0 -69
  164. package/build/esm/trimAudio.js.map +0 -1
  165. package/build/esm/useAudioRecorder.js +0 -512
  166. package/build/esm/useAudioRecorder.js.map +0 -1
  167. package/build/esm/utils/BlobFix.js +0 -498
  168. package/build/esm/utils/BlobFix.js.map +0 -1
  169. package/build/esm/utils/audioProcessing.js +0 -133
  170. package/build/esm/utils/audioProcessing.js.map +0 -1
  171. package/build/esm/utils/cleanNativeOptions.js +0 -19
  172. package/build/esm/utils/cleanNativeOptions.js.map +0 -1
  173. package/build/esm/utils/concatenateBuffers.js +0 -21
  174. package/build/esm/utils/concatenateBuffers.js.map +0 -1
  175. package/build/esm/utils/convertPCMToFloat32.js +0 -120
  176. package/build/esm/utils/convertPCMToFloat32.js.map +0 -1
  177. package/build/esm/utils/crc32.js +0 -50
  178. package/build/esm/utils/crc32.js.map +0 -1
  179. package/build/esm/utils/encodingToBitDepth.js +0 -13
  180. package/build/esm/utils/encodingToBitDepth.js.map +0 -1
  181. package/build/esm/utils/getWavFileInfo.js +0 -92
  182. package/build/esm/utils/getWavFileInfo.js.map +0 -1
  183. package/build/esm/utils/writeWavHeader.js +0 -84
  184. package/build/esm/utils/writeWavHeader.js.map +0 -1
  185. package/build/esm/workers/InlineFeaturesExtractor.web.js +0 -856
  186. package/build/esm/workers/InlineFeaturesExtractor.web.js.map +0 -1
  187. package/build/esm/workers/inlineAudioWebWorker.web.js +0 -181
  188. package/build/esm/workers/inlineAudioWebWorker.web.js.map +0 -1
  189. package/build/types/AudioAnalysis/AudioAnalysis.types.d.ts +0 -196
  190. package/build/types/AudioAnalysis/AudioAnalysis.types.d.ts.map +0 -1
  191. package/build/types/AudioAnalysis/extractAudioAnalysis.d.ts +0 -74
  192. package/build/types/AudioAnalysis/extractAudioAnalysis.d.ts.map +0 -1
  193. package/build/types/AudioAnalysis/extractAudioData.d.ts +0 -3
  194. package/build/types/AudioAnalysis/extractAudioData.d.ts.map +0 -1
  195. package/build/types/AudioAnalysis/extractMelSpectrogram.d.ts +0 -14
  196. package/build/types/AudioAnalysis/extractMelSpectrogram.d.ts.map +0 -1
  197. package/build/types/AudioAnalysis/extractPreview.d.ts +0 -11
  198. package/build/types/AudioAnalysis/extractPreview.d.ts.map +0 -1
  199. package/build/types/AudioAnalysis/extractWaveform.d.ts +0 -8
  200. package/build/types/AudioAnalysis/extractWaveform.d.ts.map +0 -1
  201. package/build/types/AudioDeviceManager.d.ts +0 -187
  202. package/build/types/AudioDeviceManager.d.ts.map +0 -1
  203. package/build/types/AudioRecorder.provider.d.ts +0 -11
  204. package/build/types/AudioRecorder.provider.d.ts.map +0 -1
  205. package/build/types/ExpoAudioStream.native.d.ts +0 -3
  206. package/build/types/ExpoAudioStream.native.d.ts.map +0 -1
  207. package/build/types/ExpoAudioStream.types.d.ts +0 -738
  208. package/build/types/ExpoAudioStream.types.d.ts.map +0 -1
  209. package/build/types/ExpoAudioStream.web.d.ts +0 -96
  210. package/build/types/ExpoAudioStream.web.d.ts.map +0 -1
  211. package/build/types/ExpoAudioStreamModule.d.ts +0 -3
  212. package/build/types/ExpoAudioStreamModule.d.ts.map +0 -1
  213. package/build/types/WebRecorder.web.d.ts +0 -198
  214. package/build/types/WebRecorder.web.d.ts.map +0 -1
  215. package/build/types/constants/platformLimitations.d.ts +0 -40
  216. package/build/types/constants/platformLimitations.d.ts.map +0 -1
  217. package/build/types/constants.d.ts +0 -11
  218. package/build/types/constants.d.ts.map +0 -1
  219. package/build/types/events.d.ts +0 -26
  220. package/build/types/events.d.ts.map +0 -1
  221. package/build/types/hooks/useAudioDevices.d.ts +0 -15
  222. package/build/types/hooks/useAudioDevices.d.ts.map +0 -1
  223. package/build/types/index.d.ts +0 -18
  224. package/build/types/index.d.ts.map +0 -1
  225. package/build/types/trimAudio.d.ts +0 -25
  226. package/build/types/trimAudio.d.ts.map +0 -1
  227. package/build/types/useAudioRecorder.d.ts +0 -22
  228. package/build/types/useAudioRecorder.d.ts.map +0 -1
  229. package/build/types/utils/BlobFix.d.ts +0 -9
  230. package/build/types/utils/BlobFix.d.ts.map +0 -1
  231. package/build/types/utils/audioProcessing.d.ts +0 -24
  232. package/build/types/utils/audioProcessing.d.ts.map +0 -1
  233. package/build/types/utils/cleanNativeOptions.d.ts +0 -15
  234. package/build/types/utils/cleanNativeOptions.d.ts.map +0 -1
  235. package/build/types/utils/concatenateBuffers.d.ts +0 -8
  236. package/build/types/utils/concatenateBuffers.d.ts.map +0 -1
  237. package/build/types/utils/convertPCMToFloat32.d.ts +0 -13
  238. package/build/types/utils/convertPCMToFloat32.d.ts.map +0 -1
  239. package/build/types/utils/crc32.d.ts +0 -7
  240. package/build/types/utils/crc32.d.ts.map +0 -1
  241. package/build/types/utils/encodingToBitDepth.d.ts +0 -5
  242. package/build/types/utils/encodingToBitDepth.d.ts.map +0 -1
  243. package/build/types/utils/getWavFileInfo.d.ts +0 -26
  244. package/build/types/utils/getWavFileInfo.d.ts.map +0 -1
  245. package/build/types/utils/writeWavHeader.d.ts +0 -34
  246. package/build/types/utils/writeWavHeader.d.ts.map +0 -1
  247. package/build/types/workers/InlineFeaturesExtractor.web.d.ts +0 -2
  248. package/build/types/workers/InlineFeaturesExtractor.web.d.ts.map +0 -1
  249. package/build/types/workers/inlineAudioWebWorker.web.d.ts +0 -2
  250. package/build/types/workers/inlineAudioWebWorker.web.d.ts.map +0 -1
  251. package/expo-module.config.json +0 -10
  252. package/ios/AudioAnalysisData.swift +0 -74
  253. package/ios/AudioDeviceManager.swift +0 -670
  254. package/ios/AudioNotificationManager.swift +0 -154
  255. package/ios/AudioProcessingHelpers.swift +0 -743
  256. package/ios/AudioProcessor.swift +0 -1151
  257. package/ios/AudioStreamError.swift +0 -7
  258. package/ios/AudioStreamManager.swift +0 -2369
  259. package/ios/AudioStreamManagerDelegate.swift +0 -16
  260. package/ios/DataPoint.swift +0 -54
  261. package/ios/DecodingConfig.swift +0 -59
  262. package/ios/ExpoAudioStream.podspec +0 -33
  263. package/ios/ExpoAudioStreamModule.swift +0 -1019
  264. package/ios/ExpoAudioStudioTests/AudioFileHandlerTests.swift +0 -338
  265. package/ios/ExpoAudioStudioTests/AudioFormatUtilsTests.swift +0 -331
  266. package/ios/ExpoAudioStudioTests/AudioTestHelpers.swift +0 -130
  267. package/ios/ExpoAudioStudioTests/CompressedOnlyOutputTests.swift +0 -294
  268. package/ios/ExpoAudioStudioTests/EventEmissionIntervalTests.swift +0 -105
  269. package/ios/ExpoAudioStudioTests/Info.plist +0 -22
  270. package/ios/ExpoAudioStudioTests/README.md +0 -39
  271. package/ios/ExpoAudioStudioTests/SimpleAudioTest.swift +0 -98
  272. package/ios/ExpoAudioStudioTests/TestAudioGenerator.swift +0 -75
  273. package/ios/FFT.swift +0 -62
  274. package/ios/Features.swift +0 -95
  275. package/ios/ISSUE_IOS.md +0 -68
  276. package/ios/Logger.swift +0 -39
  277. package/ios/NotificationExtension.swift +0 -15
  278. package/ios/RecordingResult.swift +0 -22
  279. package/ios/RecordingSettings.swift +0 -308
  280. package/ios/WaveformExtractor.swift +0 -105
  281. package/ios/tests/README.md +0 -41
  282. package/ios/tests/integration/buffer_and_fallback_test.swift +0 -178
  283. package/ios/tests/integration/buffer_duration_test.swift +0 -185
  284. package/ios/tests/integration/compressed_only_output_test.swift +0 -271
  285. package/ios/tests/integration/output_control_test.swift +0 -322
  286. package/ios/tests/integration/run_integration_tests.sh +0 -37
  287. package/ios/tests/opus_support_test_macos.swift +0 -154
  288. package/ios/tests/standalone/audio_processing_test.swift +0 -144
  289. package/ios/tests/standalone/audio_recording_test.swift +0 -277
  290. package/ios/tests/standalone/audio_streaming_test.swift +0 -249
  291. package/ios/tests/standalone/standalone_test.swift +0 -144
  292. package/plugin/build/index.cjs +0 -194
  293. package/plugin/build/index.d.cts +0 -22
  294. package/plugin/build/index.js +0 -194
  295. package/plugin/src/index.ts +0 -285
  296. package/plugin/tsconfig.json +0 -10
  297. package/plugin/tsconfig.tsbuildinfo +0 -1
  298. package/src/AudioAnalysis/AudioAnalysis.types.ts +0 -224
  299. package/src/AudioAnalysis/extractAudioAnalysis.ts +0 -344
  300. package/src/AudioAnalysis/extractAudioData.ts +0 -17
  301. package/src/AudioAnalysis/extractMelSpectrogram.ts +0 -154
  302. package/src/AudioAnalysis/extractPreview.ts +0 -34
  303. package/src/AudioAnalysis/extractWaveform.ts +0 -22
  304. package/src/AudioDeviceManager.ts +0 -803
  305. package/src/AudioRecorder.provider.tsx +0 -57
  306. package/src/ExpoAudioStream.native.ts +0 -6
  307. package/src/ExpoAudioStream.types.ts +0 -874
  308. package/src/ExpoAudioStream.web.ts +0 -905
  309. package/src/ExpoAudioStreamModule.ts +0 -990
  310. package/src/WebRecorder.web.ts +0 -1005
  311. package/src/constants/platformLimitations.ts +0 -118
  312. package/src/constants.ts +0 -18
  313. package/src/events.ts +0 -60
  314. package/src/hooks/useAudioDevices.ts +0 -213
  315. package/src/index.ts +0 -54
  316. package/src/trimAudio.ts +0 -94
  317. package/src/types/crc-32.d.ts +0 -9
  318. package/src/useAudioRecorder.tsx +0 -766
  319. package/src/utils/BlobFix.ts +0 -561
  320. package/src/utils/audioProcessing.ts +0 -205
  321. package/src/utils/cleanNativeOptions.ts +0 -18
  322. package/src/utils/concatenateBuffers.ts +0 -24
  323. package/src/utils/convertPCMToFloat32.ts +0 -170
  324. package/src/utils/crc32.ts +0 -59
  325. package/src/utils/encodingToBitDepth.ts +0 -18
  326. package/src/utils/getWavFileInfo.ts +0 -132
  327. package/src/utils/writeWavHeader.ts +0 -115
  328. package/src/workers/InlineFeaturesExtractor.web.tsx +0 -855
  329. package/src/workers/inlineAudioWebWorker.web.tsx +0 -180
@@ -1,277 +0,0 @@
1
- #!/usr/bin/env swift
2
-
3
- import Foundation
4
- import AVFoundation
5
-
6
- // Simple test framework
7
- struct TestResult {
8
- let name: String
9
- let passed: Bool
10
- let message: String
11
- }
12
-
13
- class AudioRecordingTest {
14
- var results: [TestResult] = []
15
- let testDir: URL
16
- var audioRecorder: AVAudioRecorder?
17
-
18
- init() {
19
- // Create a temporary directory for test files
20
- let tempDir = FileManager.default.temporaryDirectory
21
- testDir = tempDir.appendingPathComponent("audio_recording_test_\(UUID().uuidString)")
22
- try? FileManager.default.createDirectory(at: testDir, withIntermediateDirectories: true)
23
- }
24
-
25
- deinit {
26
- // Clean up test directory
27
- try? FileManager.default.removeItem(at: testDir)
28
- }
29
-
30
- func assert(_ condition: Bool, _ message: String, file: String = #file, line: Int = #line) {
31
- let testName = "\(file.split(separator: "/").last ?? ""):\(line)"
32
- results.append(TestResult(name: testName, passed: condition, message: message))
33
- if !condition {
34
- print("โŒ FAILED: \(message) at \(testName)")
35
- }
36
- }
37
-
38
- func assertEqual<T: Equatable>(_ a: T, _ b: T, _ message: String = "", file: String = #file, line: Int = #line) {
39
- let passed = a == b
40
- let msg = message.isEmpty ? "\(a) should equal \(b)" : message
41
- assert(passed, msg, file: file, line: line)
42
- }
43
-
44
- func run() {
45
- print("๐Ÿงช Running iOS Audio Recording Tests...\n")
46
-
47
- // Request permission first (in a real app)
48
- setupAudioSession()
49
-
50
- testBasicWAVRecording()
51
- testCompressedRecording()
52
- testRecordingSettings()
53
- testFileValidation()
54
-
55
- // Print summary
56
- let passed = results.filter { $0.passed }.count
57
- let total = results.count
58
-
59
- print("\n๐Ÿ“Š Test Summary:")
60
- print(" Total: \(total)")
61
- print(" Passed: \(passed)")
62
- print(" Failed: \(total - passed)")
63
-
64
- if passed == total {
65
- print("\nโœ… All tests passed!")
66
- } else {
67
- print("\nโŒ Some tests failed!")
68
- exit(1)
69
- }
70
- }
71
-
72
- func setupAudioSession() {
73
- #if os(iOS)
74
- let session = AVAudioSession.sharedInstance()
75
- do {
76
- try session.setCategory(.playAndRecord, mode: .default)
77
- try session.setActive(true)
78
- print("โœ“ Audio session configured")
79
- } catch {
80
- print("โš ๏ธ Failed to setup audio session: \(error)")
81
- }
82
- #else
83
- print("โœ“ Audio session setup skipped (macOS)")
84
- #endif
85
- }
86
-
87
- func testBasicWAVRecording() {
88
- print("\nTesting basic WAV recording...")
89
-
90
- let wavURL = testDir.appendingPathComponent("test_recording.wav")
91
-
92
- // Configure recording settings for WAV
93
- let settings: [String: Any] = [
94
- AVFormatIDKey: Int(kAudioFormatLinearPCM),
95
- AVSampleRateKey: 44100.0,
96
- AVNumberOfChannelsKey: 2,
97
- AVLinearPCMBitDepthKey: 16,
98
- AVLinearPCMIsBigEndianKey: false,
99
- AVLinearPCMIsFloatKey: false
100
- ]
101
-
102
- do {
103
- // Create recorder
104
- audioRecorder = try AVAudioRecorder(url: wavURL, settings: settings)
105
- assert(audioRecorder != nil, "Recorder should be created")
106
-
107
- // Prepare and record
108
- let prepared = audioRecorder!.prepareToRecord()
109
- assert(prepared, "Recorder should prepare successfully")
110
-
111
- let started = audioRecorder!.record()
112
- assert(started, "Recording should start")
113
-
114
- // Record for a short time
115
- Thread.sleep(forTimeInterval: 0.5)
116
-
117
- audioRecorder!.stop()
118
-
119
- // Verify file exists and has content
120
- assert(FileManager.default.fileExists(atPath: wavURL.path), "WAV file should exist")
121
-
122
- let attributes = try FileManager.default.attributesOfItem(atPath: wavURL.path)
123
- let fileSize = attributes[.size] as? Int64 ?? 0
124
- assert(fileSize > 44, "WAV file should have content beyond header")
125
-
126
- // Verify WAV header
127
- let data = try Data(contentsOf: wavURL)
128
- let riffHeader = String(data: data[0..<4], encoding: .ascii)
129
- assertEqual(riffHeader, "RIFF", "Should have RIFF header")
130
-
131
- let waveFormat = String(data: data[8..<12], encoding: .ascii)
132
- assertEqual(waveFormat, "WAVE", "Should have WAVE format")
133
-
134
- print("โœ“ Basic WAV recording test completed")
135
-
136
- } catch {
137
- assert(false, "Recording failed: \(error)")
138
- }
139
- }
140
-
141
- func testCompressedRecording() {
142
- print("\nTesting compressed recording (AAC)...")
143
-
144
- let aacURL = testDir.appendingPathComponent("test_recording.m4a")
145
-
146
- // Configure recording settings for AAC
147
- let settings: [String: Any] = [
148
- AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
149
- AVSampleRateKey: 44100.0,
150
- AVNumberOfChannelsKey: 2,
151
- AVEncoderBitRateKey: 128000,
152
- AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
153
- ]
154
-
155
- do {
156
- // Create recorder
157
- audioRecorder = try AVAudioRecorder(url: aacURL, settings: settings)
158
- assert(audioRecorder != nil, "AAC recorder should be created")
159
-
160
- // Record
161
- let started = audioRecorder!.record()
162
- assert(started, "AAC recording should start")
163
-
164
- Thread.sleep(forTimeInterval: 0.5)
165
- audioRecorder!.stop()
166
-
167
- // Verify file
168
- assert(FileManager.default.fileExists(atPath: aacURL.path), "AAC file should exist")
169
-
170
- let attributes = try FileManager.default.attributesOfItem(atPath: aacURL.path)
171
- let fileSize = attributes[.size] as? Int64 ?? 0
172
- assert(fileSize > 0, "AAC file should have content")
173
-
174
- // Verify it's a valid audio file by loading it
175
- let audioFile = try AVAudioFile(forReading: aacURL)
176
- assert(audioFile.length > 0, "AAC file should have audio frames")
177
- assertEqual(Int(audioFile.fileFormat.sampleRate), 44100, "Sample rate should match")
178
-
179
- print("โœ“ Compressed recording test completed")
180
-
181
- } catch {
182
- assert(false, "AAC recording failed: \(error)")
183
- }
184
- }
185
-
186
- func testRecordingSettings() {
187
- print("\nTesting various recording settings...")
188
-
189
- // Test different sample rates
190
- let sampleRates = [8000.0, 16000.0, 44100.0, 48000.0]
191
-
192
- for sampleRate in sampleRates {
193
- let url = testDir.appendingPathComponent("test_\(Int(sampleRate))hz.wav")
194
-
195
- let settings: [String: Any] = [
196
- AVFormatIDKey: Int(kAudioFormatLinearPCM),
197
- AVSampleRateKey: sampleRate,
198
- AVNumberOfChannelsKey: 1,
199
- AVLinearPCMBitDepthKey: 16,
200
- AVLinearPCMIsBigEndianKey: false,
201
- AVLinearPCMIsFloatKey: false
202
- ]
203
-
204
- do {
205
- let recorder = try AVAudioRecorder(url: url, settings: settings)
206
- assert(recorder.prepareToRecord(), "Should prepare at \(sampleRate)Hz")
207
-
208
- // Verify settings were applied
209
- let appliedSettings = recorder.settings
210
- let appliedRate = appliedSettings[AVSampleRateKey] as? Double ?? 0
211
- assertEqual(appliedRate, sampleRate, "Sample rate should be \(sampleRate)")
212
-
213
- } catch {
214
- assert(false, "Failed to create recorder at \(sampleRate)Hz: \(error)")
215
- }
216
- }
217
-
218
- print("โœ“ Recording settings test completed")
219
- }
220
-
221
- func testFileValidation() {
222
- print("\nTesting file validation and properties...")
223
-
224
- // Create a test recording
225
- let url = testDir.appendingPathComponent("validation_test.wav")
226
- let duration = 1.0 // 1 second
227
-
228
- let settings: [String: Any] = [
229
- AVFormatIDKey: Int(kAudioFormatLinearPCM),
230
- AVSampleRateKey: 16000.0,
231
- AVNumberOfChannelsKey: 1,
232
- AVLinearPCMBitDepthKey: 16,
233
- AVLinearPCMIsBigEndianKey: false,
234
- AVLinearPCMIsFloatKey: false
235
- ]
236
-
237
- do {
238
- audioRecorder = try AVAudioRecorder(url: url, settings: settings)
239
- audioRecorder!.record()
240
-
241
- // Record for the specified duration
242
- Thread.sleep(forTimeInterval: duration)
243
- audioRecorder!.stop()
244
-
245
- // Load and validate the file
246
- let audioFile = try AVAudioFile(forReading: url)
247
-
248
- // Check duration (should be close to 1 second)
249
- let recordedDuration = Double(audioFile.length) / audioFile.fileFormat.sampleRate
250
- assert(abs(recordedDuration - duration) < 0.5, "Duration should be close to \(duration)s (got \(recordedDuration)s)")
251
-
252
- // Check file format
253
- assertEqual(Int(audioFile.fileFormat.sampleRate), 16000, "Sample rate should be 16kHz")
254
- assertEqual(Int(audioFile.fileFormat.channelCount), 1, "Should be mono")
255
-
256
- // Calculate expected file size
257
- let expectedDataSize = Int(16000 * duration * 2) // 16kHz * 1s * 2 bytes per sample
258
- let expectedFileSize = expectedDataSize + 44 // Plus WAV header
259
-
260
- let attributes = try FileManager.default.attributesOfItem(atPath: url.path)
261
- let actualFileSize = attributes[.size] as? Int64 ?? 0
262
-
263
- // Allow some tolerance (macOS may add extra metadata)
264
- assert(abs(Int(actualFileSize) - expectedFileSize) < 5000,
265
- "File size should be close to expected (\(actualFileSize) vs \(expectedFileSize))")
266
-
267
- print("โœ“ File validation test completed")
268
-
269
- } catch {
270
- assert(false, "File validation failed: \(error)")
271
- }
272
- }
273
- }
274
-
275
- // Run the tests
276
- let test = AudioRecordingTest()
277
- test.run()
@@ -1,249 +0,0 @@
1
- #!/usr/bin/env swift
2
-
3
- import Foundation
4
- import AVFoundation
5
-
6
- // Simple test framework
7
- struct TestResult {
8
- let name: String
9
- let passed: Bool
10
- let message: String
11
- }
12
-
13
- class AudioStreamingTest {
14
- var results: [TestResult] = []
15
- let testDir: URL
16
- var audioEngine: AVAudioEngine?
17
- var inputNode: AVAudioInputNode?
18
-
19
- init() {
20
- // Create a temporary directory for test files
21
- let tempDir = FileManager.default.temporaryDirectory
22
- testDir = tempDir.appendingPathComponent("audio_streaming_test_\(UUID().uuidString)")
23
- try? FileManager.default.createDirectory(at: testDir, withIntermediateDirectories: true)
24
- }
25
-
26
- deinit {
27
- // Clean up
28
- audioEngine?.stop()
29
- try? FileManager.default.removeItem(at: testDir)
30
- }
31
-
32
- func assert(_ condition: Bool, _ message: String, file: String = #file, line: Int = #line) {
33
- let testName = "\(file.split(separator: "/").last ?? ""):\(line)"
34
- results.append(TestResult(name: testName, passed: condition, message: message))
35
- if !condition {
36
- print("โŒ FAILED: \(message) at \(testName)")
37
- }
38
- }
39
-
40
- func assertEqual<T: Equatable>(_ a: T, _ b: T, _ message: String = "", file: String = #file, line: Int = #line) {
41
- let passed = a == b
42
- let msg = message.isEmpty ? "\(a) should equal \(b)" : message
43
- assert(passed, msg, file: file, line: line)
44
- }
45
-
46
- func run() {
47
- print("๐Ÿงช Running iOS Audio Streaming Tests...\n")
48
-
49
- testAudioEngineSetup()
50
- testRealtimeStreaming()
51
- testBufferProcessing()
52
- testMultipleFormats()
53
-
54
- // Print summary
55
- let passed = results.filter { $0.passed }.count
56
- let total = results.count
57
-
58
- print("\n๐Ÿ“Š Test Summary:")
59
- print(" Total: \(total)")
60
- print(" Passed: \(passed)")
61
- print(" Failed: \(total - passed)")
62
-
63
- if passed == total {
64
- print("\nโœ… All tests passed!")
65
- } else {
66
- print("\nโŒ Some tests failed!")
67
- exit(1)
68
- }
69
- }
70
-
71
- func testAudioEngineSetup() {
72
- print("Testing AVAudioEngine setup...")
73
-
74
- audioEngine = AVAudioEngine()
75
- inputNode = audioEngine!.inputNode
76
-
77
- assert(audioEngine != nil, "Audio engine should be created")
78
- assert(inputNode != nil, "Input node should be available")
79
-
80
- // Check input format
81
- let inputFormat = inputNode!.inputFormat(forBus: 0)
82
- assert(inputFormat.sampleRate > 0, "Input format should have valid sample rate")
83
- assert(inputFormat.channelCount > 0, "Input format should have channels")
84
-
85
- print(" Sample rate: \(inputFormat.sampleRate) Hz")
86
- print(" Channels: \(inputFormat.channelCount)")
87
- print(" Format: \(inputFormat.commonFormat.rawValue)")
88
-
89
- print("โœ“ Audio engine setup test completed")
90
- }
91
-
92
- func testRealtimeStreaming() {
93
- print("\nTesting real-time audio streaming...")
94
-
95
- guard let engine = audioEngine, let input = inputNode else {
96
- assert(false, "Audio engine not initialized")
97
- return
98
- }
99
-
100
- var bufferCount = 0
101
- var totalFrames: AVAudioFrameCount = 0
102
- let expectation = DispatchSemaphore(value: 0)
103
-
104
- // Install tap on input
105
- let format = input.outputFormat(forBus: 0)
106
- input.installTap(onBus: 0, bufferSize: 1024, format: format) { buffer, time in
107
- bufferCount += 1
108
- totalFrames += buffer.frameLength
109
-
110
- // Stop after collecting some buffers
111
- if bufferCount >= 10 {
112
- expectation.signal()
113
- }
114
- }
115
-
116
- do {
117
- try engine.start()
118
- assert(engine.isRunning, "Engine should be running")
119
-
120
- // Wait for buffers
121
- let timeout = expectation.wait(timeout: .now() + 2.0)
122
- assert(timeout == .success, "Should receive audio buffers within timeout")
123
-
124
- engine.stop()
125
- input.removeTap(onBus: 0)
126
-
127
- assert(bufferCount >= 10, "Should have received at least 10 buffers")
128
- assert(totalFrames > 0, "Should have received audio frames")
129
-
130
- print(" Received \(bufferCount) buffers")
131
- print(" Total frames: \(totalFrames)")
132
-
133
- print("โœ“ Real-time streaming test completed")
134
-
135
- } catch {
136
- assert(false, "Failed to start audio engine: \(error)")
137
- }
138
- }
139
-
140
- func testBufferProcessing() {
141
- print("\nTesting buffer processing...")
142
-
143
- guard let engine = audioEngine, let input = inputNode else {
144
- assert(false, "Audio engine not initialized")
145
- return
146
- }
147
-
148
- var processedBuffers = 0
149
- var maxAmplitude: Float = 0
150
- var totalRMS: Float = 0
151
- let expectation = DispatchSemaphore(value: 0)
152
-
153
- let format = input.outputFormat(forBus: 0)
154
- input.installTap(onBus: 0, bufferSize: 2048, format: format) { buffer, time in
155
- // Process buffer
156
- if let channelData = buffer.floatChannelData {
157
- let frameLength = Int(buffer.frameLength)
158
- let channelCount = Int(buffer.format.channelCount)
159
-
160
- for channel in 0..<channelCount {
161
- let samples = channelData[channel]
162
-
163
- // Find max amplitude
164
- for i in 0..<frameLength {
165
- let amplitude = abs(samples[i])
166
- if amplitude > maxAmplitude {
167
- maxAmplitude = amplitude
168
- }
169
- }
170
-
171
- // Calculate RMS
172
- var sum: Float = 0
173
- for i in 0..<frameLength {
174
- sum += samples[i] * samples[i]
175
- }
176
- let rms = sqrt(sum / Float(frameLength))
177
- totalRMS += rms
178
- }
179
- }
180
-
181
- processedBuffers += 1
182
- if processedBuffers >= 5 {
183
- expectation.signal()
184
- }
185
- }
186
-
187
- do {
188
- try engine.start()
189
-
190
- let timeout = expectation.wait(timeout: .now() + 2.0)
191
- assert(timeout == .success, "Should process buffers within timeout")
192
-
193
- engine.stop()
194
- input.removeTap(onBus: 0)
195
-
196
- assert(processedBuffers >= 5, "Should have processed at least 5 buffers")
197
- // Note: maxAmplitude might be 0 if there's silence
198
- print(" Processed buffers: \(processedBuffers)")
199
- print(" Max amplitude: \(maxAmplitude)")
200
- print(" Average RMS: \(totalRMS / Float(processedBuffers))")
201
-
202
- print("โœ“ Buffer processing test completed")
203
-
204
- } catch {
205
- assert(false, "Failed to process buffers: \(error)")
206
- }
207
- }
208
-
209
- func testMultipleFormats() {
210
- print("\nTesting multiple audio formats...")
211
-
212
- // Test creating different format converters
213
- let sampleRates = [8000.0, 16000.0, 44100.0, 48000.0]
214
-
215
- for sampleRate in sampleRates {
216
- // Create a format
217
- guard let format = AVAudioFormat(
218
- commonFormat: .pcmFormatFloat32,
219
- sampleRate: sampleRate,
220
- channels: 1,
221
- interleaved: false
222
- ) else {
223
- assert(false, "Failed to create format at \(sampleRate)Hz")
224
- continue
225
- }
226
-
227
- assert(format.sampleRate == sampleRate, "Format should have correct sample rate")
228
- assert(format.channelCount == 1, "Format should be mono")
229
- assert(format.commonFormat == .pcmFormatFloat32, "Format should be float32")
230
-
231
- // Test creating a buffer with this format
232
- guard let buffer = AVAudioPCMBuffer(
233
- pcmFormat: format,
234
- frameCapacity: AVAudioFrameCount(sampleRate * 0.1) // 100ms
235
- ) else {
236
- assert(false, "Failed to create buffer at \(sampleRate)Hz")
237
- continue
238
- }
239
-
240
- assert(buffer.format.sampleRate == sampleRate, "Buffer format should match")
241
- }
242
-
243
- print("โœ“ Multiple formats test completed")
244
- }
245
- }
246
-
247
- // Run the tests
248
- let test = AudioStreamingTest()
249
- test.run()
@@ -1,144 +0,0 @@
1
- #!/usr/bin/env swift
2
-
3
- import Foundation
4
- import AVFoundation
5
-
6
- // Simple test framework
7
- struct TestResult {
8
- let name: String
9
- let passed: Bool
10
- let message: String
11
- }
12
-
13
- class SimpleTest {
14
- var results: [TestResult] = []
15
-
16
- func assert(_ condition: Bool, _ message: String, file: String = #file, line: Int = #line) {
17
- let testName = "\(file.split(separator: "/").last ?? ""):\(line)"
18
- results.append(TestResult(name: testName, passed: condition, message: message))
19
- if !condition {
20
- print("โŒ FAILED: \(message) at \(testName)")
21
- }
22
- }
23
-
24
- func assertEqual<T: Equatable>(_ a: T, _ b: T, _ message: String = "", file: String = #file, line: Int = #line) {
25
- let passed = a == b
26
- let msg = message.isEmpty ? "\(a) should equal \(b)" : message
27
- assert(passed, msg, file: file, line: line)
28
- }
29
-
30
- func run() {
31
- print("๐Ÿงช Running iOS Audio Tests...\n")
32
-
33
- testWAVHeader()
34
- testAudioBuffer()
35
-
36
- // Print summary
37
- let passed = results.filter { $0.passed }.count
38
- let total = results.count
39
-
40
- print("\n๐Ÿ“Š Test Summary:")
41
- print(" Total: \(total)")
42
- print(" Passed: \(passed)")
43
- print(" Failed: \(total - passed)")
44
-
45
- if passed == total {
46
- print("\nโœ… All tests passed!")
47
- } else {
48
- print("\nโŒ Some tests failed!")
49
- exit(1)
50
- }
51
- }
52
-
53
- func testWAVHeader() {
54
- print("Testing WAV header creation...")
55
-
56
- let sampleRate = 44100
57
- let channels = 2
58
- let bitsPerSample = 16
59
- let dataSize = 1024
60
-
61
- // Create header
62
- var header = Data()
63
-
64
- // RIFF chunk
65
- header.append("RIFF".data(using: .ascii)!)
66
- var fileSize = UInt32(dataSize + 36).littleEndian
67
- header.append(Data(bytes: &fileSize, count: 4))
68
- header.append("WAVE".data(using: .ascii)!)
69
-
70
- // fmt chunk
71
- header.append("fmt ".data(using: .ascii)!)
72
- var fmtSize = UInt32(16).littleEndian
73
- header.append(Data(bytes: &fmtSize, count: 4))
74
- var audioFormat = UInt16(1).littleEndian
75
- header.append(Data(bytes: &audioFormat, count: 2))
76
- var numChannels = UInt16(channels).littleEndian
77
- header.append(Data(bytes: &numChannels, count: 2))
78
- var sampleRateValue = UInt32(sampleRate).littleEndian
79
- header.append(Data(bytes: &sampleRateValue, count: 4))
80
- let byteRate = sampleRate * channels * (bitsPerSample / 8)
81
- var byteRateValue = UInt32(byteRate).littleEndian
82
- header.append(Data(bytes: &byteRateValue, count: 4))
83
- let blockAlign = channels * (bitsPerSample / 8)
84
- var blockAlignValue = UInt16(blockAlign).littleEndian
85
- header.append(Data(bytes: &blockAlignValue, count: 2))
86
- var bitsPerSampleValue = UInt16(bitsPerSample).littleEndian
87
- header.append(Data(bytes: &bitsPerSampleValue, count: 2))
88
-
89
- // data chunk
90
- header.append("data".data(using: .ascii)!)
91
- var dataSizeValue = UInt32(dataSize).littleEndian
92
- header.append(Data(bytes: &dataSizeValue, count: 4))
93
-
94
- // Tests
95
- assertEqual(header.count, 44, "WAV header should be 44 bytes")
96
-
97
- let riffHeader = String(data: header[0..<4], encoding: .ascii)
98
- assertEqual(riffHeader, "RIFF", "Should have RIFF header")
99
-
100
- let waveFormat = String(data: header[8..<12], encoding: .ascii)
101
- assertEqual(waveFormat, "WAVE", "Should have WAVE format")
102
-
103
- print("โœ“ WAV header test completed")
104
- }
105
-
106
- func testAudioBuffer() {
107
- print("\nTesting audio buffer creation...")
108
-
109
- let sampleRate = 44100.0
110
- let duration = 0.1
111
- let frequency = 440.0
112
-
113
- let frameCount = Int(sampleRate * duration)
114
- let format = AVAudioFormat(standardFormatWithSampleRate: sampleRate, channels: 1)!
115
-
116
- guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: AVAudioFrameCount(frameCount)) else {
117
- assert(false, "Failed to create audio buffer")
118
- return
119
- }
120
-
121
- buffer.frameLength = AVAudioFrameCount(frameCount)
122
-
123
- // Generate sine wave
124
- let channelData = buffer.floatChannelData![0]
125
- for frame in 0..<frameCount {
126
- let phase = 2.0 * Double.pi * frequency * Double(frame) / sampleRate
127
- channelData[frame] = Float(sin(phase) * 0.5)
128
- }
129
-
130
- // Tests
131
- assertEqual(Int(buffer.frameLength), frameCount, "Frame length should match")
132
- assertEqual(buffer.format.sampleRate, sampleRate, "Sample rate should match")
133
- assertEqual(Int(buffer.format.channelCount), 1, "Should have 1 channel")
134
-
135
- let middleSample = channelData[frameCount / 4]
136
- assert(abs(middleSample) > 0.001, "Middle sample should not be zero")
137
-
138
- print("โœ“ Audio buffer test completed")
139
- }
140
- }
141
-
142
- // Run the tests
143
- let test = SimpleTest()
144
- test.run()