@symbiote-native/audio 0.1.2 → 0.1.3

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 (280) hide show
  1. package/README.md +96 -52
  2. package/build/angular/index.d.ts +8 -0
  3. package/build/angular/index.js +8 -3
  4. package/build/angular/inject-audio-player-status.d.ts +4 -0
  5. package/build/angular/inject-audio-player-status.js +4 -0
  6. package/build/angular/inject-audio-player.d.ts +4 -0
  7. package/build/angular/inject-audio-player.js +8 -0
  8. package/build/angular/inject-audio-playlist-status.d.ts +3 -0
  9. package/build/angular/inject-audio-playlist-status.js +4 -0
  10. package/build/angular/inject-audio-playlist.d.ts +5 -0
  11. package/build/angular/inject-audio-playlist.js +7 -0
  12. package/build/angular/inject-audio-recorder-state.d.ts +5 -0
  13. package/build/angular/inject-audio-recorder-state.js +10 -0
  14. package/build/angular/inject-audio-recorder.d.ts +5 -0
  15. package/build/angular/inject-audio-recorder.js +13 -0
  16. package/build/angular/inject-audio-sample-listener.d.ts +4 -0
  17. package/build/angular/inject-audio-sample-listener.js +7 -0
  18. package/build/angular/inject-audio-stream.d.ts +4 -0
  19. package/build/angular/inject-audio-stream.js +17 -0
  20. package/build/core/audio-module.js +1 -1
  21. package/build/core/audio-player-controller.d.ts +7 -0
  22. package/build/core/audio-player-controller.js +10 -0
  23. package/build/core/audio-player.js +16 -4
  24. package/build/core/audio-playlist-controller.d.ts +4 -0
  25. package/build/core/audio-playlist-controller.js +5 -0
  26. package/build/core/audio-recorder-controller.d.ts +4 -0
  27. package/build/core/audio-recorder-controller.js +5 -0
  28. package/build/core/audio-recorder-polling.d.ts +5 -0
  29. package/build/core/audio-recorder-polling.js +10 -0
  30. package/build/core/audio-recorder-state.d.ts +2 -0
  31. package/build/core/audio-recorder-state.js +18 -0
  32. package/build/core/audio-recorder-status.d.ts +8 -0
  33. package/build/core/audio-recorder-status.js +6 -0
  34. package/build/core/audio-recorder.d.ts +2 -0
  35. package/build/core/audio-recorder.js +4 -0
  36. package/build/core/audio-sample-listener.d.ts +11 -0
  37. package/build/core/audio-sample-listener.js +9 -0
  38. package/build/core/audio-stream-controller.d.ts +4 -0
  39. package/build/core/audio-stream-controller.js +5 -0
  40. package/build/core/audio-stream-hooks.d.ts +8 -0
  41. package/build/core/audio-stream-hooks.js +13 -0
  42. package/build/core/audio-stream-lifecycle.d.ts +3 -0
  43. package/build/core/audio-stream-lifecycle.js +9 -0
  44. package/build/core/audio-stream-subscription.d.ts +10 -0
  45. package/build/core/audio-stream-subscription.js +12 -0
  46. package/build/core/audio-stream.d.ts +9 -10
  47. package/build/core/audio-stream.js +1 -9
  48. package/build/core/index.d.ts +14 -2
  49. package/build/core/index.js +9 -1
  50. package/build/core/json-keyed-resource-controller.d.ts +2 -0
  51. package/build/core/json-keyed-resource-controller.js +5 -0
  52. package/build/core/resolve-source.d.ts +2 -7
  53. package/build/core/resolve-source.js +69 -15
  54. package/build/core/subscribe-single-event.d.ts +5 -0
  55. package/build/core/subscribe-single-event.js +8 -0
  56. package/build/core/types.d.ts +11 -5
  57. package/build/react/index.d.ts +9 -0
  58. package/build/react/index.js +9 -0
  59. package/build/react/use-audio-player-status.d.ts +4 -0
  60. package/build/react/use-audio-player-status.js +4 -0
  61. package/build/react/use-audio-player.d.ts +3 -0
  62. package/build/react/use-audio-player.js +7 -0
  63. package/build/react/use-audio-playlist-status.d.ts +3 -0
  64. package/build/react/use-audio-playlist-status.js +4 -0
  65. package/build/react/use-audio-playlist.d.ts +4 -0
  66. package/build/react/use-audio-playlist.js +7 -0
  67. package/build/react/use-audio-recorder-state.d.ts +4 -0
  68. package/build/react/use-audio-recorder-state.js +9 -0
  69. package/build/react/use-audio-recorder.d.ts +4 -0
  70. package/build/react/use-audio-recorder.js +11 -0
  71. package/build/react/use-audio-sample-listener.d.ts +4 -0
  72. package/build/react/use-audio-sample-listener.js +6 -0
  73. package/build/react/use-audio-stream.d.ts +3 -0
  74. package/build/react/use-audio-stream.js +14 -0
  75. package/build/solid/index.d.ts +9 -0
  76. package/build/solid/index.js +9 -0
  77. package/build/solid/use-audio-player-status.d.ts +4 -0
  78. package/build/solid/use-audio-player-status.js +4 -0
  79. package/build/solid/use-audio-player.d.ts +5 -0
  80. package/build/solid/use-audio-player.js +7 -0
  81. package/build/solid/use-audio-playlist-status.d.ts +3 -0
  82. package/build/solid/use-audio-playlist-status.js +4 -0
  83. package/build/solid/use-audio-playlist.d.ts +5 -0
  84. package/build/solid/use-audio-playlist.js +7 -0
  85. package/build/solid/use-audio-recorder-state.d.ts +5 -0
  86. package/build/solid/use-audio-recorder-state.js +9 -0
  87. package/build/solid/use-audio-recorder.d.ts +5 -0
  88. package/build/solid/use-audio-recorder.js +13 -0
  89. package/build/solid/use-audio-sample-listener.d.ts +4 -0
  90. package/build/solid/use-audio-sample-listener.js +8 -0
  91. package/build/solid/use-audio-stream.d.ts +4 -0
  92. package/build/solid/use-audio-stream.js +16 -0
  93. package/build/svelte/index.d.ts +9 -0
  94. package/build/svelte/index.js +9 -0
  95. package/build/svelte/use-audio-player-status.svelte.d.ts +6 -0
  96. package/build/svelte/use-audio-player-status.svelte.js +4 -0
  97. package/build/svelte/use-audio-player.svelte.d.ts +6 -0
  98. package/build/svelte/use-audio-player.svelte.js +8 -0
  99. package/build/svelte/use-audio-playlist-status.svelte.d.ts +5 -0
  100. package/build/svelte/use-audio-playlist-status.svelte.js +4 -0
  101. package/build/svelte/use-audio-playlist.svelte.d.ts +6 -0
  102. package/build/svelte/use-audio-playlist.svelte.js +8 -0
  103. package/build/svelte/use-audio-recorder-state.svelte.d.ts +7 -0
  104. package/build/svelte/use-audio-recorder-state.svelte.js +14 -0
  105. package/build/svelte/use-audio-recorder.svelte.d.ts +6 -0
  106. package/build/svelte/use-audio-recorder.svelte.js +11 -0
  107. package/build/svelte/use-audio-sample-listener.svelte.d.ts +4 -0
  108. package/build/svelte/use-audio-sample-listener.svelte.js +5 -0
  109. package/build/svelte/use-audio-stream.svelte.d.ts +4 -0
  110. package/build/svelte/use-audio-stream.svelte.js +29 -0
  111. package/build/vue/index.d.ts +9 -0
  112. package/build/vue/index.js +9 -0
  113. package/build/vue/use-audio-player-status.d.ts +4 -0
  114. package/build/vue/use-audio-player-status.js +4 -0
  115. package/build/vue/use-audio-player.d.ts +5 -0
  116. package/build/vue/use-audio-player.js +8 -0
  117. package/build/vue/use-audio-playlist-status.d.ts +3 -0
  118. package/build/vue/use-audio-playlist-status.js +4 -0
  119. package/build/vue/use-audio-playlist.d.ts +5 -0
  120. package/build/vue/use-audio-playlist.js +8 -0
  121. package/build/vue/use-audio-recorder-state.d.ts +5 -0
  122. package/build/vue/use-audio-recorder-state.js +12 -0
  123. package/build/vue/use-audio-recorder.d.ts +5 -0
  124. package/build/vue/use-audio-recorder.js +11 -0
  125. package/build/vue/use-audio-sample-listener.d.ts +4 -0
  126. package/build/vue/use-audio-sample-listener.js +11 -0
  127. package/build/vue/use-audio-stream.d.ts +4 -0
  128. package/build/vue/use-audio-stream.js +18 -0
  129. package/build-ngc/angular/index.d.ts +8 -0
  130. package/build-ngc/angular/index.js +8 -3
  131. package/build-ngc/angular/index.js.map +1 -1
  132. package/build-ngc/angular/inject-audio-player-status.d.ts +4 -0
  133. package/build-ngc/angular/inject-audio-player-status.js +5 -0
  134. package/build-ngc/angular/inject-audio-player-status.js.map +1 -0
  135. package/build-ngc/angular/inject-audio-player.d.ts +4 -0
  136. package/build-ngc/angular/inject-audio-player.js +9 -0
  137. package/build-ngc/angular/inject-audio-player.js.map +1 -0
  138. package/build-ngc/angular/inject-audio-playlist-status.d.ts +3 -0
  139. package/build-ngc/angular/inject-audio-playlist-status.js +5 -0
  140. package/build-ngc/angular/inject-audio-playlist-status.js.map +1 -0
  141. package/build-ngc/angular/inject-audio-playlist.d.ts +5 -0
  142. package/build-ngc/angular/inject-audio-playlist.js +8 -0
  143. package/build-ngc/angular/inject-audio-playlist.js.map +1 -0
  144. package/build-ngc/angular/inject-audio-recorder-state.d.ts +5 -0
  145. package/build-ngc/angular/inject-audio-recorder-state.js +12 -0
  146. package/build-ngc/angular/inject-audio-recorder-state.js.map +1 -0
  147. package/build-ngc/angular/inject-audio-recorder.d.ts +5 -0
  148. package/build-ngc/angular/inject-audio-recorder.js +14 -0
  149. package/build-ngc/angular/inject-audio-recorder.js.map +1 -0
  150. package/build-ngc/angular/inject-audio-sample-listener.d.ts +4 -0
  151. package/build-ngc/angular/inject-audio-sample-listener.js +8 -0
  152. package/build-ngc/angular/inject-audio-sample-listener.js.map +1 -0
  153. package/build-ngc/angular/inject-audio-stream.d.ts +4 -0
  154. package/build-ngc/angular/inject-audio-stream.js +18 -0
  155. package/build-ngc/angular/inject-audio-stream.js.map +1 -0
  156. package/build-ngc/core/audio-module.js +1 -1
  157. package/build-ngc/core/audio-module.js.map +1 -1
  158. package/build-ngc/core/audio-player-controller.d.ts +7 -0
  159. package/build-ngc/core/audio-player-controller.js +11 -0
  160. package/build-ngc/core/audio-player-controller.js.map +1 -0
  161. package/build-ngc/core/audio-player.js +16 -4
  162. package/build-ngc/core/audio-player.js.map +1 -1
  163. package/build-ngc/core/audio-playlist-controller.d.ts +4 -0
  164. package/build-ngc/core/audio-playlist-controller.js +6 -0
  165. package/build-ngc/core/audio-playlist-controller.js.map +1 -0
  166. package/build-ngc/core/audio-recorder-controller.d.ts +4 -0
  167. package/build-ngc/core/audio-recorder-controller.js +6 -0
  168. package/build-ngc/core/audio-recorder-controller.js.map +1 -0
  169. package/build-ngc/core/audio-recorder-polling.d.ts +5 -0
  170. package/build-ngc/core/audio-recorder-polling.js +11 -0
  171. package/build-ngc/core/audio-recorder-polling.js.map +1 -0
  172. package/build-ngc/core/audio-recorder-state.d.ts +2 -0
  173. package/build-ngc/core/audio-recorder-state.js +19 -0
  174. package/build-ngc/core/audio-recorder-state.js.map +1 -0
  175. package/build-ngc/core/audio-recorder-status.d.ts +8 -0
  176. package/build-ngc/core/audio-recorder-status.js +7 -0
  177. package/build-ngc/core/audio-recorder-status.js.map +1 -0
  178. package/build-ngc/core/audio-recorder.d.ts +2 -0
  179. package/build-ngc/core/audio-recorder.js +4 -0
  180. package/build-ngc/core/audio-recorder.js.map +1 -1
  181. package/build-ngc/core/audio-sample-listener.d.ts +11 -0
  182. package/build-ngc/core/audio-sample-listener.js +10 -0
  183. package/build-ngc/core/audio-sample-listener.js.map +1 -0
  184. package/build-ngc/core/audio-stream-controller.d.ts +4 -0
  185. package/build-ngc/core/audio-stream-controller.js +6 -0
  186. package/build-ngc/core/audio-stream-controller.js.map +1 -0
  187. package/build-ngc/core/audio-stream-hooks.d.ts +8 -0
  188. package/build-ngc/core/audio-stream-hooks.js +14 -0
  189. package/build-ngc/core/audio-stream-hooks.js.map +1 -0
  190. package/build-ngc/core/audio-stream-lifecycle.d.ts +3 -0
  191. package/build-ngc/core/audio-stream-lifecycle.js +10 -0
  192. package/build-ngc/core/audio-stream-lifecycle.js.map +1 -0
  193. package/build-ngc/core/audio-stream-subscription.d.ts +10 -0
  194. package/build-ngc/core/audio-stream-subscription.js +13 -0
  195. package/build-ngc/core/audio-stream-subscription.js.map +1 -0
  196. package/build-ngc/core/audio-stream.d.ts +9 -10
  197. package/build-ngc/core/audio-stream.js +1 -9
  198. package/build-ngc/core/audio-stream.js.map +1 -1
  199. package/build-ngc/core/index.d.ts +14 -2
  200. package/build-ngc/core/index.js +9 -1
  201. package/build-ngc/core/index.js.map +1 -1
  202. package/build-ngc/core/json-keyed-resource-controller.d.ts +2 -0
  203. package/build-ngc/core/json-keyed-resource-controller.js +6 -0
  204. package/build-ngc/core/json-keyed-resource-controller.js.map +1 -0
  205. package/build-ngc/core/resolve-source.d.ts +2 -7
  206. package/build-ngc/core/resolve-source.js +69 -15
  207. package/build-ngc/core/resolve-source.js.map +1 -1
  208. package/build-ngc/core/subscribe-single-event.d.ts +5 -0
  209. package/build-ngc/core/subscribe-single-event.js +9 -0
  210. package/build-ngc/core/subscribe-single-event.js.map +1 -0
  211. package/build-ngc/core/types.d.ts +11 -5
  212. package/build-ngc/core/types.js.map +1 -1
  213. package/package.json +24 -23
  214. package/src/angular/index.ts +8 -3
  215. package/src/angular/inject-audio-player-status.ts +11 -0
  216. package/src/angular/inject-audio-player.ts +17 -0
  217. package/src/angular/inject-audio-playlist-status.ts +11 -0
  218. package/src/angular/inject-audio-playlist.ts +16 -0
  219. package/src/angular/inject-audio-recorder-state.ts +21 -0
  220. package/src/angular/inject-audio-recorder.ts +24 -0
  221. package/src/angular/inject-audio-sample-listener.ts +13 -0
  222. package/src/angular/inject-audio-stream.ts +41 -0
  223. package/src/core/audio-module.ts +2 -1
  224. package/src/core/audio-player-controller.ts +25 -0
  225. package/src/core/audio-player.ts +17 -4
  226. package/src/core/audio-playlist-controller.ts +14 -0
  227. package/src/core/audio-recorder-controller.ts +14 -0
  228. package/src/core/audio-recorder-polling.ts +20 -0
  229. package/src/core/audio-recorder-state.ts +26 -0
  230. package/src/core/audio-recorder-status.ts +22 -0
  231. package/src/core/audio-recorder.ts +5 -0
  232. package/src/core/audio-sample-listener.ts +23 -0
  233. package/src/core/audio-stream-controller.ts +14 -0
  234. package/src/core/audio-stream-hooks.ts +31 -0
  235. package/src/core/audio-stream-lifecycle.ts +19 -0
  236. package/src/core/audio-stream-subscription.ts +28 -0
  237. package/src/core/audio-stream.ts +11 -10
  238. package/src/core/index.ts +20 -1
  239. package/src/core/json-keyed-resource-controller.ts +16 -0
  240. package/src/core/resolve-source.ts +80 -18
  241. package/src/core/subscribe-single-event.ts +17 -0
  242. package/src/core/types.ts +13 -14
  243. package/src/react/index.ts +9 -0
  244. package/src/react/use-audio-player-status.ts +11 -0
  245. package/src/react/use-audio-player.ts +14 -0
  246. package/src/react/use-audio-playlist-status.ts +11 -0
  247. package/src/react/use-audio-playlist.ts +13 -0
  248. package/src/react/use-audio-recorder-state.ts +23 -0
  249. package/src/react/use-audio-recorder.ts +23 -0
  250. package/src/react/use-audio-sample-listener.ts +15 -0
  251. package/src/react/use-audio-stream.ts +39 -0
  252. package/src/solid/index.ts +9 -0
  253. package/src/solid/use-audio-player-status.ts +11 -0
  254. package/src/solid/use-audio-player.ts +15 -0
  255. package/src/solid/use-audio-playlist-status.ts +11 -0
  256. package/src/solid/use-audio-playlist.ts +14 -0
  257. package/src/solid/use-audio-recorder-state.ts +18 -0
  258. package/src/solid/use-audio-recorder.ts +22 -0
  259. package/src/solid/use-audio-sample-listener.ts +14 -0
  260. package/src/solid/use-audio-stream.ts +34 -0
  261. package/src/svelte/index.ts +9 -0
  262. package/src/svelte/svelte-ambient.d.ts +3 -0
  263. package/src/svelte/svelte-compile.test-helper.ts +7 -0
  264. package/src/svelte/use-audio-player-status.svelte.ts +11 -0
  265. package/src/svelte/use-audio-player.svelte.ts +20 -0
  266. package/src/svelte/use-audio-playlist-status.svelte.ts +11 -0
  267. package/src/svelte/use-audio-playlist.svelte.ts +19 -0
  268. package/src/svelte/use-audio-recorder-state.svelte.ts +29 -0
  269. package/src/svelte/use-audio-recorder.svelte.ts +25 -0
  270. package/src/svelte/use-audio-sample-listener.svelte.ts +11 -0
  271. package/src/svelte/use-audio-stream.svelte.ts +44 -0
  272. package/src/vue/index.ts +9 -0
  273. package/src/vue/use-audio-player-status.ts +11 -0
  274. package/src/vue/use-audio-player.ts +19 -0
  275. package/src/vue/use-audio-playlist-status.ts +11 -0
  276. package/src/vue/use-audio-playlist.ts +15 -0
  277. package/src/vue/use-audio-recorder-state.ts +21 -0
  278. package/src/vue/use-audio-recorder.ts +30 -0
  279. package/src/vue/use-audio-sample-listener.ts +22 -0
  280. package/src/vue/use-audio-stream.ts +40 -0
@@ -0,0 +1,11 @@
1
+ import { createEventValueHook } from '@symbiote-native/svelte/runes/create-event-value-hook';
2
+ import { PLAYBACK_STATUS_UPDATE } from '../core/types';
3
+ import type { AudioPlayer } from '../core';
4
+ import type { IAudioStatus } from '../core';
5
+
6
+ /** Svelte twin of `expo-audio`'s `useAudioPlayerStatus` */
7
+ export const useAudioPlayerStatus = createEventValueHook<
8
+ AudioPlayer,
9
+ IAudioStatus,
10
+ typeof PLAYBACK_STATUS_UPDATE
11
+ >(PLAYBACK_STATUS_UPDATE, player => player.currentStatus);
@@ -0,0 +1,20 @@
1
+ // Svelte twin of `expo-audio`'s `useAudioPlayer`, boxed getter shape matching
2
+ // `use-image-manipulator.svelte.ts` (`components_split_logic_view_lifecycle`)
3
+
4
+ import { createResourceHook } from '@symbiote-native/svelte/runes/create-resource-hook';
5
+ import { createAudioPlayerController } from '../core/audio-player-controller';
6
+ import type { AudioPlayer } from '../core';
7
+ import type { IAudioPlayerOptions, IAudioSource } from '../core';
8
+
9
+ export type IUseAudioPlayerResult = {
10
+ readonly current: AudioPlayer;
11
+ };
12
+
13
+ const usePlayerResource = createResourceHook(createAudioPlayerController);
14
+
15
+ export function useAudioPlayer(
16
+ getSource: () => IAudioSource = () => null,
17
+ getOptions: () => IAudioPlayerOptions = () => ({}),
18
+ ): IUseAudioPlayerResult {
19
+ return usePlayerResource(() => [getSource(), getOptions()]);
20
+ }
@@ -0,0 +1,11 @@
1
+ import { createEventValueHook } from '@symbiote-native/svelte/runes/create-event-value-hook';
2
+ import { PLAYLIST_STATUS_UPDATE } from '../core/types';
3
+ import type { AudioPlaylist } from '../core';
4
+ import type { IAudioPlaylistStatus } from '../core';
5
+
6
+ /** Svelte twin of `expo-audio`'s `useAudioPlaylistStatus` */
7
+ export const useAudioPlaylistStatus = createEventValueHook<
8
+ AudioPlaylist,
9
+ IAudioPlaylistStatus,
10
+ typeof PLAYLIST_STATUS_UPDATE
11
+ >(PLAYLIST_STATUS_UPDATE, playlist => playlist.currentStatus);
@@ -0,0 +1,19 @@
1
+ // Svelte twin of `expo-audio`'s `useAudioPlaylist`, boxed getter shape matching
2
+ // `use-audio-player.svelte.ts` (`components_split_logic_view_lifecycle`)
3
+
4
+ import { createResourceHook } from '@symbiote-native/svelte/runes/create-resource-hook';
5
+ import { createAudioPlaylistController } from '../core/audio-playlist-controller';
6
+ import type { AudioPlaylist } from '../core';
7
+ import type { IAudioPlaylistOptions } from '../core';
8
+
9
+ export type IUseAudioPlaylistResult = {
10
+ readonly current: AudioPlaylist;
11
+ };
12
+
13
+ const usePlaylistResource = createResourceHook(createAudioPlaylistController);
14
+
15
+ export function useAudioPlaylist(
16
+ getOptions: () => IAudioPlaylistOptions = () => ({}),
17
+ ): IUseAudioPlaylistResult {
18
+ return usePlaylistResource(() => [getOptions()]);
19
+ }
@@ -0,0 +1,29 @@
1
+ import { pollRecorderState } from '../core/audio-recorder-polling';
2
+ import type { AudioRecorder } from '../core';
3
+ import type { IRecorderState } from '../core';
4
+
5
+ const DEFAULT_POLL_INTERVAL_MS = 500;
6
+
7
+ export type IUseAudioRecorderStateResult = {
8
+ readonly current: IRecorderState;
9
+ };
10
+
11
+ /** Svelte twin of `expo-audio`'s `useAudioRecorderState` */
12
+ export function useAudioRecorderState(
13
+ recorder: AudioRecorder,
14
+ interval: number = DEFAULT_POLL_INTERVAL_MS,
15
+ ): IUseAudioRecorderStateResult {
16
+ let state = $state(recorder.getStatus());
17
+
18
+ $effect(() =>
19
+ pollRecorderState(recorder, interval, updater => {
20
+ state = updater(state);
21
+ }),
22
+ );
23
+
24
+ return {
25
+ get current(): IRecorderState {
26
+ return state;
27
+ },
28
+ };
29
+ }
@@ -0,0 +1,25 @@
1
+ // Svelte twin of `expo-audio`'s `useAudioRecorder`, boxed getter shape matching
2
+ // `use-audio-player.svelte.ts` (`components_split_logic_view_lifecycle`)
3
+
4
+ import { createResourceHook } from '@symbiote-native/svelte/runes/create-resource-hook';
5
+ import { createAudioRecorderController } from '../core/audio-recorder-controller';
6
+ import { subscribeRecordingStatus } from '../core/audio-recorder-status';
7
+ import type { AudioRecorder } from '../core';
8
+ import type { IRecordingOptions, IRecordingStatus } from '../core';
9
+
10
+ export type IUseAudioRecorderResult = {
11
+ readonly current: AudioRecorder;
12
+ };
13
+
14
+ const useRecorderResource = createResourceHook(createAudioRecorderController);
15
+
16
+ export function useAudioRecorder(
17
+ getOptions: () => IRecordingOptions,
18
+ statusListener?: (status: IRecordingStatus) => void,
19
+ ): IUseAudioRecorderResult {
20
+ const recorder = useRecorderResource(() => [getOptions()]);
21
+
22
+ $effect(() => subscribeRecordingStatus(recorder.current, statusListener));
23
+
24
+ return recorder;
25
+ }
@@ -0,0 +1,11 @@
1
+ import { subscribeAudioSampleListener } from '../core/audio-sample-listener';
2
+ import type { IAudioSamplePlayer } from '../core/audio-sample-listener';
3
+ import type { IAudioSample } from '../core/types';
4
+
5
+ /** Svelte twin of `expo-audio`'s `useAudioSampleListener` */
6
+ export function useAudioSampleListener(
7
+ player: IAudioSamplePlayer,
8
+ listener: (data: IAudioSample) => void,
9
+ ): void {
10
+ $effect(() => subscribeAudioSampleListener(player, listener));
11
+ }
@@ -0,0 +1,44 @@
1
+ // `$effect` is a compiler macro, can't be passed by reference like `watchEffect`/`createEffect`,
2
+ // so it's wrapped instead of handed to `runAudioStreamBufferEffect` directly.
3
+ // Approved cross-framework duplicate vs Solid's use-audio-stream.ts (.claude/reuse.json)
4
+
5
+ import { createResourceHook } from '@symbiote-native/svelte/runes/create-resource-hook';
6
+ import { createEventValueHook } from '@symbiote-native/svelte/runes/create-event-value-hook';
7
+ import { createAudioStreamHooks } from '../core/audio-stream-hooks';
8
+ import { toAudioStreamKey } from '../core/audio-stream-subscription';
9
+ import { runAudioStreamBufferEffect } from '../core/audio-stream-lifecycle';
10
+ import type { IAudioStreamResult, IUseAudioStreamOptions } from '../core';
11
+
12
+ const { useStreamResource, useStreamStatus } = createAudioStreamHooks(
13
+ createResourceHook,
14
+ createEventValueHook,
15
+ );
16
+
17
+ export function useAudioStream(getOptions: () => IUseAudioStreamOptions): {
18
+ readonly current: IAudioStreamResult;
19
+ } {
20
+ const stream = useStreamResource(() => [toAudioStreamKey(getOptions())]);
21
+ const status = useStreamStatus(() => stream.current);
22
+
23
+ const cleanups: Array<() => void> = [];
24
+ runAudioStreamBufferEffect(
25
+ () => stream.current,
26
+ () => getOptions().onBuffer,
27
+ effect => {
28
+ $effect(effect);
29
+ },
30
+ cleanup => cleanups.push(cleanup),
31
+ );
32
+ $effect(() => () => {
33
+ for (const cleanup of cleanups) cleanup();
34
+ });
35
+
36
+ return {
37
+ get current(): IAudioStreamResult {
38
+ return {
39
+ stream: stream.current,
40
+ isStreaming: status.current.isStreaming,
41
+ };
42
+ },
43
+ };
44
+ }
@@ -0,0 +1,9 @@
1
+ export * from '../core';
2
+ export { useAudioPlayer } from './use-audio-player';
3
+ export { useAudioPlayerStatus } from './use-audio-player-status';
4
+ export { useAudioSampleListener } from './use-audio-sample-listener';
5
+ export { useAudioPlaylist } from './use-audio-playlist';
6
+ export { useAudioPlaylistStatus } from './use-audio-playlist-status';
7
+ export { useAudioRecorder } from './use-audio-recorder';
8
+ export { useAudioRecorderState } from './use-audio-recorder-state';
9
+ export { useAudioStream } from './use-audio-stream';
@@ -0,0 +1,11 @@
1
+ import { createEventValueHook } from '@symbiote-native/vue';
2
+ import { PLAYBACK_STATUS_UPDATE } from '../core/types';
3
+ import type { AudioPlayer } from '../core';
4
+ import type { IAudioStatus } from '../core';
5
+
6
+ /** Vue twin of `expo-audio`'s `useAudioPlayerStatus` */
7
+ export const useAudioPlayerStatus = createEventValueHook<
8
+ AudioPlayer,
9
+ IAudioStatus,
10
+ typeof PLAYBACK_STATUS_UPDATE
11
+ >(PLAYBACK_STATUS_UPDATE, player => player.currentStatus);
@@ -0,0 +1,19 @@
1
+ import {
2
+ toValue,
3
+ type ComputedRef,
4
+ type MaybeRefOrGetter,
5
+ } from '@vue/runtime-core';
6
+ import { createResourceHook } from '@symbiote-native/vue';
7
+ import { createAudioPlayerController } from '../core/audio-player-controller';
8
+ import type { AudioPlayer } from '../core';
9
+ import type { IAudioPlayerOptions, IAudioSource } from '../core';
10
+
11
+ const usePlayerResource = createResourceHook(createAudioPlayerController);
12
+
13
+ /** Vue twin of `expo-audio`'s `useAudioPlayer` */
14
+ export function useAudioPlayer(
15
+ source: MaybeRefOrGetter<IAudioSource> = null,
16
+ options: MaybeRefOrGetter<IAudioPlayerOptions> = {},
17
+ ): ComputedRef<AudioPlayer> {
18
+ return usePlayerResource(() => [toValue(source), toValue(options)]);
19
+ }
@@ -0,0 +1,11 @@
1
+ import { createEventValueHook } from '@symbiote-native/vue';
2
+ import { PLAYLIST_STATUS_UPDATE } from '../core/types';
3
+ import type { AudioPlaylist } from '../core';
4
+ import type { IAudioPlaylistStatus } from '../core';
5
+
6
+ /** Vue twin of `expo-audio`'s `useAudioPlaylistStatus` */
7
+ export const useAudioPlaylistStatus = createEventValueHook<
8
+ AudioPlaylist,
9
+ IAudioPlaylistStatus,
10
+ typeof PLAYLIST_STATUS_UPDATE
11
+ >(PLAYLIST_STATUS_UPDATE, playlist => playlist.currentStatus);
@@ -0,0 +1,15 @@
1
+ import type { ComputedRef, MaybeRefOrGetter } from '@vue/runtime-core';
2
+ import { toValue } from '@vue/runtime-core';
3
+ import { createResourceHook } from '@symbiote-native/vue';
4
+ import { createAudioPlaylistController } from '../core/audio-playlist-controller';
5
+ import type { AudioPlaylist } from '../core';
6
+ import type { IAudioPlaylistOptions } from '../core';
7
+
8
+ const usePlaylistResource = createResourceHook(createAudioPlaylistController);
9
+
10
+ /** Vue twin of `expo-audio`'s `useAudioPlaylist` */
11
+ export function useAudioPlaylist(
12
+ getOptions: MaybeRefOrGetter<IAudioPlaylistOptions> = {},
13
+ ): ComputedRef<AudioPlaylist> {
14
+ return usePlaylistResource(() => [toValue(getOptions)]);
15
+ }
@@ -0,0 +1,21 @@
1
+ import { onUnmounted, shallowRef, type ShallowRef } from '@vue/runtime-core';
2
+ import { pollRecorderState } from '../core/audio-recorder-polling';
3
+ import type { AudioRecorder } from '../core';
4
+ import type { IRecorderState } from '../core';
5
+
6
+ const DEFAULT_POLL_INTERVAL_MS = 500;
7
+
8
+ /** Vue twin of `expo-audio`'s `useAudioRecorderState` */
9
+ export function useAudioRecorderState(
10
+ recorder: AudioRecorder,
11
+ interval: number = DEFAULT_POLL_INTERVAL_MS,
12
+ ): ShallowRef<IRecorderState> {
13
+ const state = shallowRef(recorder.getStatus());
14
+
15
+ const stop = pollRecorderState(recorder, interval, updater => {
16
+ state.value = updater(state.value);
17
+ });
18
+ onUnmounted(stop);
19
+
20
+ return state;
21
+ }
@@ -0,0 +1,30 @@
1
+ import {
2
+ toValue,
3
+ watch,
4
+ type ComputedRef,
5
+ type MaybeRefOrGetter,
6
+ } from '@vue/runtime-core';
7
+ import { createResourceHook } from '@symbiote-native/vue';
8
+ import { createAudioRecorderController } from '../core/audio-recorder-controller';
9
+ import { subscribeRecordingStatus } from '../core/audio-recorder-status';
10
+ import type { AudioRecorder } from '../core';
11
+ import type { IRecordingOptions, IRecordingStatus } from '../core';
12
+
13
+ const useRecorderResource = createResourceHook(createAudioRecorderController);
14
+
15
+ /** Vue twin of `expo-audio`'s `useAudioRecorder` */
16
+ export function useAudioRecorder(
17
+ getOptions: MaybeRefOrGetter<IRecordingOptions>,
18
+ statusListener?: (status: IRecordingStatus) => void,
19
+ ): ComputedRef<AudioRecorder> {
20
+ const recorder = useRecorderResource(() => [toValue(getOptions)]);
21
+
22
+ watch(
23
+ recorder,
24
+ (current, _previous, onCleanup) =>
25
+ onCleanup(subscribeRecordingStatus(current, statusListener)),
26
+ { immediate: true },
27
+ );
28
+
29
+ return recorder;
30
+ }
@@ -0,0 +1,22 @@
1
+ import { onUnmounted, watch } from '@vue/runtime-core';
2
+ import { subscribeAudioSampleListener } from '../core/audio-sample-listener';
3
+ import type { IAudioSamplePlayer } from '../core/audio-sample-listener';
4
+ import type { IAudioSample } from '../core/types';
5
+
6
+ /** Vue twin of `expo-audio`'s `useAudioSampleListener` */
7
+ export function useAudioSampleListener(
8
+ player: IAudioSamplePlayer,
9
+ listener: (data: IAudioSample) => void,
10
+ ): void {
11
+ let unsubscribe = subscribeAudioSampleListener(player, listener);
12
+
13
+ watch(
14
+ () => player,
15
+ next => {
16
+ unsubscribe();
17
+ unsubscribe = subscribeAudioSampleListener(next, listener);
18
+ },
19
+ );
20
+
21
+ onUnmounted(() => unsubscribe());
22
+ }
@@ -0,0 +1,40 @@
1
+ import {
2
+ computed,
3
+ onUnmounted,
4
+ toValue,
5
+ watchEffect,
6
+ type ComputedRef,
7
+ type MaybeRefOrGetter,
8
+ } from '@vue/runtime-core';
9
+ import { createResourceHook, createEventValueHook } from '@symbiote-native/vue';
10
+ import { createAudioStreamHooks } from '../core/audio-stream-hooks';
11
+ import { toAudioStreamKey } from '../core/audio-stream-subscription';
12
+ import { runAudioStreamBufferEffect } from '../core/audio-stream-lifecycle';
13
+ import type { IAudioStreamResult, IUseAudioStreamOptions } from '../core';
14
+
15
+ const { useStreamResource, useStreamStatus } = createAudioStreamHooks(
16
+ createResourceHook,
17
+ createEventValueHook,
18
+ );
19
+
20
+ /** Vue twin of `expo-audio`'s `useAudioStream` */
21
+ export function useAudioStream(
22
+ getOptions: MaybeRefOrGetter<IUseAudioStreamOptions>,
23
+ ): ComputedRef<IAudioStreamResult> {
24
+ const stream = useStreamResource(() => [
25
+ toAudioStreamKey(toValue(getOptions)),
26
+ ]);
27
+ const status = useStreamStatus(() => stream.value);
28
+
29
+ runAudioStreamBufferEffect(
30
+ () => stream.value,
31
+ () => toValue(getOptions).onBuffer,
32
+ watchEffect,
33
+ onUnmounted,
34
+ );
35
+
36
+ return computed(() => ({
37
+ stream: stream.value,
38
+ isStreaming: status.value.isStreaming,
39
+ }));
40
+ }