@symbiote-native/audio 0.1.2 → 0.1.4

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 +1 -0
  51. package/build/core/json-keyed-resource-controller.js +1 -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 +1 -0
  203. package/build-ngc/core/json-keyed-resource-controller.js +2 -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 +1 -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,13 @@
1
+ import { createAudioStreamController } from './audio-stream-controller.js';
2
+ import { AUDIO_STREAM_STATUS } from './types.js';
3
+ // Binds `createAudioStreamController`/`AUDIO_STREAM_STATUS` behind the getter-based
4
+ // `createResourceHook`/`createEventValueHook` shape Vue/Solid/Angular share (React keeps its own
5
+ // ref-based wiring, same split as `runAudioStreamBufferEffect`)
6
+ export function createAudioStreamHooks(createResourceHook, createEventValueHook) {
7
+ return {
8
+ useStreamResource: createResourceHook(createAudioStreamController),
9
+ useStreamStatus: createEventValueHook(AUDIO_STREAM_STATUS, stream => ({
10
+ isStreaming: stream.isStreaming,
11
+ })),
12
+ };
13
+ }
@@ -0,0 +1,3 @@
1
+ import type { IAudioStreamBufferSource } from './audio-stream-subscription';
2
+ import type { IAudioStreamBuffer } from './types';
3
+ export declare function runAudioStreamBufferEffect<TStream extends IAudioStreamBufferSource>(getStream: () => TStream, getOnBuffer: () => ((buffer: IAudioStreamBuffer) => void) | undefined, runEffect: (effect: () => void) => void, registerCleanup: (cleanup: () => void) => void): void;
@@ -0,0 +1,9 @@
1
+ import { subscribeAudioStreamBuffer } from './audio-stream-subscription.js';
2
+ // Shared by adapters whose reactivity auto-tracks reads inside a plain effect (Vue's
3
+ // `watchEffect`, Solid's `createEffect`, Angular's `effect`); React's render model doesn't, so
4
+ // it keeps its own ref-based wiring - same split as `createNetworkRequestObserverLifecycle`
5
+ export function runAudioStreamBufferEffect(getStream, getOnBuffer, runEffect, registerCleanup) {
6
+ runEffect(() => {
7
+ registerCleanup(subscribeAudioStreamBuffer(getStream(), getOnBuffer()));
8
+ });
9
+ }
@@ -0,0 +1,10 @@
1
+ import { AUDIO_STREAM_BUFFER } from './types';
2
+ import type { IAudioStreamBuffer, IAudioStreamOptions } from './types';
3
+ import type { IUseAudioStreamOptions } from './audio-stream';
4
+ export type IAudioStreamBufferSource = {
5
+ addListener: (event: typeof AUDIO_STREAM_BUFFER, listener: (buffer: IAudioStreamBuffer) => void) => {
6
+ remove: () => void;
7
+ };
8
+ };
9
+ export declare function subscribeAudioStreamBuffer(stream: IAudioStreamBufferSource, onBuffer: ((buffer: IAudioStreamBuffer) => void) | undefined): () => void;
10
+ export declare function toAudioStreamKey(options: IUseAudioStreamOptions): IAudioStreamOptions;
@@ -0,0 +1,12 @@
1
+ import { AUDIO_STREAM_BUFFER } from './types.js';
2
+ import { subscribeSingleEvent } from './subscribe-single-event.js';
3
+ // Ported from `useAudioStream`'s buffer-listener `useEffect` body
4
+ export function subscribeAudioStreamBuffer(stream, onBuffer) {
5
+ return subscribeSingleEvent(stream, AUDIO_STREAM_BUFFER, onBuffer);
6
+ }
7
+ // Drops `onBuffer` so a callback identity change doesn't recreate the native stream - matches
8
+ // upstream's own `[sampleRate, channels, encoding]` dependency array
9
+ export function toAudioStreamKey(options) {
10
+ const { sampleRate, channels, encoding } = options;
11
+ return { sampleRate, channels, encoding };
12
+ }
@@ -1,13 +1,12 @@
1
- import type { IAudioStreamOptions } from './types';
1
+ import type { IAudioStreamBuffer, IAudioStreamOptions } from './types';
2
2
  export declare const AudioStream: typeof import("./native-module").NativeAudioStream;
3
3
  export type AudioStream = InstanceType<typeof AudioStream>;
4
- /**
5
- * Creates a native `AudioStream` for real-time PCM microphone capture. Call `.start()` to
6
- * begin and `.stop()` to end; requires microphone permission — see
7
- * `requestRecordingPermissionsAsync`. Upstream only exposes this via the `useAudioStream` hook
8
- * (React-only, see the package README); this factory is the framework-agnostic equivalent — the
9
- * hook itself just applies these same defaults and wires `addListener` for
10
- * `AUDIO_STREAM_STATUS`/`AUDIO_STREAM_BUFFER` on top, which each adapter's own lifecycle wrapper
11
- * is responsible for.
12
- */
4
+ export type IUseAudioStreamOptions = IAudioStreamOptions & {
5
+ onBuffer?: (buffer: IAudioStreamBuffer) => void;
6
+ };
7
+ export type IAudioStreamResult = {
8
+ stream: AudioStream;
9
+ isStreaming: boolean;
10
+ };
11
+ /** Requires microphone permission - see `requestRecordingPermissionsAsync`. */
13
12
  export declare function createAudioStream(options?: IAudioStreamOptions): AudioStream;
@@ -1,15 +1,7 @@
1
1
  import { expoAudio } from './native-module.js';
2
2
  // Plain re-export — upstream has no prototype shim for `AudioStream` either.
3
3
  export const AudioStream = expoAudio.AudioStream;
4
- /**
5
- * Creates a native `AudioStream` for real-time PCM microphone capture. Call `.start()` to
6
- * begin and `.stop()` to end; requires microphone permission — see
7
- * `requestRecordingPermissionsAsync`. Upstream only exposes this via the `useAudioStream` hook
8
- * (React-only, see the package README); this factory is the framework-agnostic equivalent — the
9
- * hook itself just applies these same defaults and wires `addListener` for
10
- * `AUDIO_STREAM_STATUS`/`AUDIO_STREAM_BUFFER` on top, which each adapter's own lifecycle wrapper
11
- * is responsible for.
12
- */
4
+ /** Requires microphone permission - see `requestRecordingPermissionsAsync`. */
13
5
  export function createAudioStream(options = {}) {
14
6
  const { sampleRate = 48000, channels = 1, encoding = 'float32' } = options;
15
7
  return new AudioStream({ sampleRate, channels, encoding });
@@ -1,9 +1,21 @@
1
1
  export { AudioPlayer, createAudioPlayer } from './audio-player';
2
- export { AudioRecorder } from './audio-recorder';
2
+ export { AudioRecorder, createAudioRecorder } from './audio-recorder';
3
3
  export { AudioPlaylist, createAudioPlaylist } from './audio-playlist';
4
4
  export { AudioStream, createAudioStream } from './audio-stream';
5
+ export type { IUseAudioStreamOptions, IAudioStreamResult, } from './audio-stream';
6
+ export { createAudioStreamController } from './audio-stream-controller';
7
+ export { subscribeAudioStreamBuffer, toAudioStreamKey, } from './audio-stream-subscription';
8
+ export type { IAudioStreamBufferSource } from './audio-stream-subscription';
9
+ export { runAudioStreamBufferEffect } from './audio-stream-lifecycle';
10
+ export { createAudioStreamHooks } from './audio-stream-hooks';
5
11
  export { setIsAudioActiveAsync, setAudioModeAsync, requestRecordingPermissionsAsync, requestNotificationPermissionsAsync, getRecordingPermissionsAsync, preload, clearPreloadedSource, clearAllPreloadedSources, getPreloadedSources, } from './audio-module';
6
12
  export { resolveSource, resolveSources } from './resolve-source';
13
+ export { subscribeAudioSampleListener } from './audio-sample-listener';
14
+ export type { IAudioSamplePlayer } from './audio-sample-listener';
15
+ export { subscribeRecordingStatus } from './audio-recorder-status';
16
+ export type { IStatusRecorder } from './audio-recorder-status';
17
+ export { shouldUpdateRecorderState } from './audio-recorder-state';
18
+ export { pollRecorderState } from './audio-recorder-polling';
7
19
  export { RecordingPresets, IOSOutputFormat, AudioQuality, } from './recording-presets';
8
20
  export { PLAYBACK_STATUS_UPDATE, AUDIO_SAMPLE_UPDATE, RECORDING_STATUS_UPDATE, PLAYLIST_STATUS_UPDATE, TRACK_CHANGED, AUDIO_STREAM_BUFFER, AUDIO_STREAM_STATUS, } from './types';
9
- export type { IAudioSource, IAudioSourceInfo, IAudioPlayerOptions, IPreloadOptions, IRecordingInput, IPitchCorrectionQuality, IAudioStatus, IRecordingStatus, IRecorderState, IAndroidOutputFormat, IAndroidAudioEncoder, IRecordingStartOptions, IRecordingDirectory, IRecordingOptions, IRecordingOptionsWeb, IRecordingOptionsIos, IRecordingOptionsAndroid, IRecordingSource, IAudioMode, IInterruptionMode, IAudioMetadata, IAudioPlaylistLoopMode, IAudioPlaylistOptions, IAudioPlaylistStatus, IAudioLockScreenOptions, IAudioSample, IAudioStreamEncoding, IAudioStreamOptions, IAudioStreamBuffer, IAudioStreamStatus, } from './types';
21
+ export type { IAudioSource, IAudioSourceInfo, IAudioPlayerOptions, IAudioLoadOptions, IPreloadOptions, IRecordingInput, IPitchCorrectionQuality, IAudioStatus, IRecordingStatus, IRecorderState, IAndroidOutputFormat, IAndroidAudioEncoder, IRecordingStartOptions, IRecordingDirectory, IRecordingOptions, IRecordingOptionsWeb, IRecordingOptionsIos, IRecordingOptionsAndroid, IRecordingSource, IAudioMode, IInterruptionMode, IAudioMetadata, IAudioPlaylistLoopMode, IAudioPlaylistOptions, IAudioPlaylistStatus, IAudioLockScreenOptions, IAudioSample, IAudioStreamEncoding, IAudioStreamOptions, IAudioStreamBuffer, IAudioStreamStatus, } from './types';
@@ -1,8 +1,16 @@
1
1
  export { AudioPlayer, createAudioPlayer } from './audio-player.js';
2
- export { AudioRecorder } from './audio-recorder.js';
2
+ export { AudioRecorder, createAudioRecorder } from './audio-recorder.js';
3
3
  export { AudioPlaylist, createAudioPlaylist } from './audio-playlist.js';
4
4
  export { AudioStream, createAudioStream } from './audio-stream.js';
5
+ export { createAudioStreamController } from './audio-stream-controller.js';
6
+ export { subscribeAudioStreamBuffer, toAudioStreamKey, } from './audio-stream-subscription.js';
7
+ export { runAudioStreamBufferEffect } from './audio-stream-lifecycle.js';
8
+ export { createAudioStreamHooks } from './audio-stream-hooks.js';
5
9
  export { setIsAudioActiveAsync, setAudioModeAsync, requestRecordingPermissionsAsync, requestNotificationPermissionsAsync, getRecordingPermissionsAsync, preload, clearPreloadedSource, clearAllPreloadedSources, getPreloadedSources, } from './audio-module.js';
6
10
  export { resolveSource, resolveSources } from './resolve-source.js';
11
+ export { subscribeAudioSampleListener } from './audio-sample-listener.js';
12
+ export { subscribeRecordingStatus } from './audio-recorder-status.js';
13
+ export { shouldUpdateRecorderState } from './audio-recorder-state.js';
14
+ export { pollRecorderState } from './audio-recorder-polling.js';
7
15
  export { RecordingPresets, IOSOutputFormat, AudioQuality, } from './recording-presets.js';
8
16
  export { PLAYBACK_STATUS_UPDATE, AUDIO_SAMPLE_UPDATE, RECORDING_STATUS_UPDATE, PLAYLIST_STATUS_UPDATE, TRACK_CHANGED, AUDIO_STREAM_BUFFER, AUDIO_STREAM_STATUS, } from './types.js';
@@ -0,0 +1 @@
1
+ export { createJsonKeyedResourceController } from '@symbiote-native/engine';
@@ -0,0 +1 @@
1
+ export { createJsonKeyedResourceController } from '@symbiote-native/engine';
@@ -1,10 +1,5 @@
1
1
  import type { IAudioSource } from './types';
2
- /**
3
- * Normalizes a source into the shape the native player accepts. A `number` (a `require()`'d
4
- * local asset) resolves via `@symbiote-native/engine`'s `resolveAssetSource` seam — RN's own
5
- * generic asset-registry lookup, wired by `bootstrapHost`. An actual `expo-asset` `Asset`
6
- * instance is still not ported, see `types.ts`'s header comment on `IAudioSource`. A plain
7
- * string is treated as a URI, matching upstream.
8
- */
9
2
  export declare function resolveSource(source?: IAudioSource): IAudioSource | null;
10
3
  export declare function resolveSources(sources: IAudioSource[]): NonNullable<IAudioSource>[];
4
+ /** Resolves `source` and, unlike `resolveSource`, downloads it to a local cache file first. */
5
+ export declare function resolveSourceWithDownload(source?: IAudioSource): Promise<IAudioSource | null>;
@@ -1,27 +1,61 @@
1
- import { resolveAssetSource } from '@symbiote-native/engine';
2
- // resolveAssetSource returns `unknown` by design (the seam serves every require()'d-asset
3
- // consumer, not just this package) — narrow it instead of casting.
4
- function isAudioSourceObject(value) {
5
- return typeof value === 'object' && value !== null;
1
+ // Ported from expo-audio/src/utils/resolveSource.ts (sdk-57), against @symbiote-native/asset's
2
+ // Asset class instead of importing expo-asset directly (same pattern as packages/font).
3
+ import { Asset } from '@symbiote-native/asset';
4
+ function getAssetFromSource(source) {
5
+ if (!source) {
6
+ return null;
7
+ }
8
+ if (source instanceof Asset) {
9
+ return source;
10
+ }
11
+ if (typeof source === 'number') {
12
+ return Asset.fromModule(source);
13
+ }
14
+ if (typeof source === 'object') {
15
+ if ('assetId' in source && typeof source.assetId === 'number') {
16
+ return Asset.fromModule(source.assetId);
17
+ }
18
+ if ('uri' in source && typeof source.uri === 'string') {
19
+ return Asset.fromURI(source.uri);
20
+ }
21
+ }
22
+ if (typeof source === 'string') {
23
+ return Asset.fromURI(source);
24
+ }
25
+ return null;
26
+ }
27
+ function createSourceFromAsset(asset, extras = {}) {
28
+ const result = {
29
+ uri: asset.localUri ?? asset.uri,
30
+ };
31
+ if (asset.name) {
32
+ result.name = asset.name;
33
+ }
34
+ if (extras.assetId != null) {
35
+ result.assetId = extras.assetId;
36
+ }
37
+ if (extras.headers) {
38
+ result.headers = extras.headers;
39
+ }
40
+ return result;
6
41
  }
7
- /**
8
- * Normalizes a source into the shape the native player accepts. A `number` (a `require()`'d
9
- * local asset) resolves via `@symbiote-native/engine`'s `resolveAssetSource` seam — RN's own
10
- * generic asset-registry lookup, wired by `bootstrapHost`. An actual `expo-asset` `Asset`
11
- * instance is still not ported, see `types.ts`'s header comment on `IAudioSource`. A plain
12
- * string is treated as a URI, matching upstream.
13
- */
14
42
  export function resolveSource(source) {
15
43
  if (source == null) {
16
44
  return null;
17
45
  }
18
- if (typeof source === 'number') {
19
- const resolved = resolveAssetSource(source);
20
- return isAudioSourceObject(resolved) ? resolved : null;
46
+ if (source instanceof Asset) {
47
+ return createSourceFromAsset(source);
21
48
  }
22
49
  if (typeof source === 'string') {
23
50
  return { uri: source };
24
51
  }
52
+ if (typeof source === 'number') {
53
+ return createSourceFromAsset(Asset.fromModule(source), { assetId: source });
54
+ }
55
+ if ('assetId' in source && typeof source.assetId === 'number') {
56
+ const asset = Asset.fromModule(source.assetId);
57
+ return { ...source, uri: asset.localUri ?? asset.uri };
58
+ }
25
59
  return source;
26
60
  }
27
61
  export function resolveSources(sources) {
@@ -29,3 +63,23 @@ export function resolveSources(sources) {
29
63
  .map(source => resolveSource(source))
30
64
  .filter((source) => source != null);
31
65
  }
66
+ /** Resolves `source` and, unlike `resolveSource`, downloads it to a local cache file first. */
67
+ export async function resolveSourceWithDownload(source) {
68
+ const asset = getAssetFromSource(source);
69
+ const fallback = resolveSource(source);
70
+ if (!asset) {
71
+ return fallback;
72
+ }
73
+ try {
74
+ await asset.downloadAsync();
75
+ if (asset.localUri) {
76
+ return fallback && typeof fallback === 'object'
77
+ ? { ...fallback, uri: asset.localUri }
78
+ : { uri: asset.localUri };
79
+ }
80
+ }
81
+ catch {
82
+ // Falls through to the un-downloaded source below, matching upstream's own recovery path.
83
+ }
84
+ return fallback;
85
+ }
@@ -0,0 +1,5 @@
1
+ export declare function subscribeSingleEvent<TEvent extends string, TPayload>(source: {
2
+ addListener: (event: TEvent, listener: (payload: TPayload) => void) => {
3
+ remove: () => void;
4
+ };
5
+ }, event: TEvent, listener: ((payload: TPayload) => void) | undefined): () => void;
@@ -0,0 +1,8 @@
1
+ // Shared shape behind `subscribeRecordingStatus`/`subscribeAudioStreamBuffer`: one optional
2
+ // listener over one named event, unsubscribed via the returned cleanup
3
+ export function subscribeSingleEvent(source, event, listener) {
4
+ const subscription = source.addListener(event, payload => {
5
+ listener?.(payload);
6
+ });
7
+ return () => subscription.remove();
8
+ }
@@ -1,15 +1,15 @@
1
+ import type { Asset } from '@symbiote-native/asset';
1
2
  import type { AudioQuality, IOSOutputFormat } from './recording-presets';
2
3
  /** Audio source information returned from native when reading sources from a queue. */
3
4
  export type IAudioSourceInfo = {
4
5
  uri?: string;
5
6
  name?: string;
6
7
  };
7
- /**
8
- * A URI string, an object describing a remote/local (by URI) audio source, or the numeric asset
9
- * id `require('./song.mp3')` produces — resolved via `resolveSource`/`resolveSources`.
10
- */
11
- export type IAudioSource = string | number | null | {
8
+ /** A URI, a `require()` module id, an `Asset`, or a source object — see resolve-source.ts. */
9
+ export type IAudioSource = string | number | Asset | null | {
12
10
  uri?: string;
11
+ /** id of a local asset from `require()`; ignored if `uri` is set. */
12
+ assetId?: number;
13
13
  headers?: Record<string, string>;
14
14
  name?: string;
15
15
  };
@@ -31,7 +31,11 @@ export type IAudioPlayerOptions = {
31
31
  * @default 0
32
32
  */
33
33
  preferredForwardBufferDuration?: number;
34
+ /** Downloads the source via `Asset` before the native player loads it. @default false */
35
+ downloadFirst?: boolean;
34
36
  };
37
+ /** @deprecated Use `IAudioPlayerOptions` instead */
38
+ export type IAudioLoadOptions = IAudioPlayerOptions;
35
39
  export type IPreloadOptions = {
36
40
  /** @default 10 */
37
41
  preferredForwardBufferDuration?: number;
@@ -136,6 +140,8 @@ export type IAudioMode = {
136
140
  playsInSilentMode: boolean;
137
141
  /** @default 'mixWithOthers' */
138
142
  interruptionMode: IInterruptionMode;
143
+ /** @platform android @deprecated Use `interruptionMode`, which now works on both platforms */
144
+ interruptionModeAndroid?: IInterruptionMode;
139
145
  /** @default false @platform ios */
140
146
  allowsRecording: boolean;
141
147
  /** @default false */
@@ -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,9 @@
1
+ export * from '../core/index.js';
2
+ export { useAudioPlayer } from './use-audio-player.js';
3
+ export { useAudioPlayerStatus } from './use-audio-player-status.js';
4
+ export { useAudioSampleListener } from './use-audio-sample-listener.js';
5
+ export { useAudioPlaylist } from './use-audio-playlist.js';
6
+ export { useAudioPlaylistStatus } from './use-audio-playlist-status.js';
7
+ export { useAudioRecorder } from './use-audio-recorder.js';
8
+ export { useAudioRecorderState } from './use-audio-recorder-state.js';
9
+ export { useAudioStream } from './use-audio-stream.js';
@@ -0,0 +1,4 @@
1
+ import type { AudioPlayer } from '../core';
2
+ import type { IAudioStatus } from '../core';
3
+ /** React twin of `expo-audio`'s `useAudioPlayerStatus` */
4
+ export declare const useAudioPlayerStatus: (source: AudioPlayer) => IAudioStatus;
@@ -0,0 +1,4 @@
1
+ import { createEventValueHook } from '@symbiote-native/react';
2
+ import { PLAYBACK_STATUS_UPDATE } from '../core/types.js';
3
+ /** React twin of `expo-audio`'s `useAudioPlayerStatus` */
4
+ export const useAudioPlayerStatus = createEventValueHook(PLAYBACK_STATUS_UPDATE, player => player.currentStatus);
@@ -0,0 +1,3 @@
1
+ import type { AudioPlayer } from '../core';
2
+ import type { IAudioPlayerOptions, IAudioSource } from '../core';
3
+ export declare function useAudioPlayer(source?: IAudioSource, options?: IAudioPlayerOptions): AudioPlayer;
@@ -0,0 +1,7 @@
1
+ import { createResourceHook } from '@symbiote-native/react';
2
+ import { createAudioPlayerController } from '../core/audio-player-controller.js';
3
+ const usePlayerResource = createResourceHook(createAudioPlayerController);
4
+ // React twin of `expo-audio`'s `useAudioPlayer`
5
+ export function useAudioPlayer(source = null, options = {}) {
6
+ return usePlayerResource(source, options);
7
+ }
@@ -0,0 +1,3 @@
1
+ import type { IAudioPlaylistStatus } from '../core';
2
+ /** React twin of `expo-audio`'s `useAudioPlaylistStatus` */
3
+ export declare const useAudioPlaylistStatus: (source: import("../core/native-module").NativeAudioPlaylist) => IAudioPlaylistStatus;
@@ -0,0 +1,4 @@
1
+ import { createEventValueHook } from '@symbiote-native/react';
2
+ import { PLAYLIST_STATUS_UPDATE } from '../core/types.js';
3
+ /** React twin of `expo-audio`'s `useAudioPlaylistStatus` */
4
+ export const useAudioPlaylistStatus = createEventValueHook(PLAYLIST_STATUS_UPDATE, playlist => playlist.currentStatus);
@@ -0,0 +1,4 @@
1
+ import type { AudioPlaylist } from '../core';
2
+ import type { IAudioPlaylistOptions } from '../core';
3
+ /** React twin of `expo-audio`'s `useAudioPlaylist` */
4
+ export declare function useAudioPlaylist(options?: IAudioPlaylistOptions): AudioPlaylist;
@@ -0,0 +1,7 @@
1
+ import { createResourceHook } from '@symbiote-native/react';
2
+ import { createAudioPlaylistController } from '../core/audio-playlist-controller.js';
3
+ const usePlaylistResource = createResourceHook(createAudioPlaylistController);
4
+ /** React twin of `expo-audio`'s `useAudioPlaylist` */
5
+ export function useAudioPlaylist(options = {}) {
6
+ return usePlaylistResource(options);
7
+ }
@@ -0,0 +1,4 @@
1
+ import type { AudioRecorder } from '../core';
2
+ import type { IRecorderState } from '../core';
3
+ /** React twin of `expo-audio`'s `useAudioRecorderState` */
4
+ export declare function useAudioRecorderState(recorder: AudioRecorder, interval?: number): IRecorderState;
@@ -0,0 +1,9 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { pollRecorderState } from '../core/audio-recorder-polling.js';
3
+ const DEFAULT_POLL_INTERVAL_MS = 500;
4
+ /** React twin of `expo-audio`'s `useAudioRecorderState` */
5
+ export function useAudioRecorderState(recorder, interval = DEFAULT_POLL_INTERVAL_MS) {
6
+ const [state, setState] = useState(() => recorder.getStatus());
7
+ useEffect(() => pollRecorderState(recorder, interval, setState), [recorder, interval]);
8
+ return state;
9
+ }
@@ -0,0 +1,4 @@
1
+ import type { AudioRecorder } from '../core';
2
+ import type { IRecordingOptions, IRecordingStatus } from '../core';
3
+ /** React twin of `expo-audio`'s `useAudioRecorder` */
4
+ export declare function useAudioRecorder(options: IRecordingOptions, statusListener?: (status: IRecordingStatus) => void): AudioRecorder;
@@ -0,0 +1,11 @@
1
+ import { useEffect } from 'react';
2
+ import { createResourceHook } from '@symbiote-native/react';
3
+ import { createAudioRecorderController } from '../core/audio-recorder-controller.js';
4
+ import { subscribeRecordingStatus } from '../core/audio-recorder-status.js';
5
+ const useRecorderResource = createResourceHook(createAudioRecorderController);
6
+ /** React twin of `expo-audio`'s `useAudioRecorder` */
7
+ export function useAudioRecorder(options, statusListener) {
8
+ const recorder = useRecorderResource(options);
9
+ useEffect(() => subscribeRecordingStatus(recorder, statusListener), [recorder, statusListener]);
10
+ return recorder;
11
+ }
@@ -0,0 +1,4 @@
1
+ import type { IAudioSamplePlayer } from '../core/audio-sample-listener';
2
+ import type { IAudioSample } from '../core/types';
3
+ /** React twin of `expo-audio`'s `useAudioSampleListener` */
4
+ export declare function useAudioSampleListener(player: IAudioSamplePlayer, listener: (data: IAudioSample) => void): void;
@@ -0,0 +1,6 @@
1
+ import { useEffect } from 'react';
2
+ import { subscribeAudioSampleListener } from '../core/audio-sample-listener.js';
3
+ /** React twin of `expo-audio`'s `useAudioSampleListener` */
4
+ export function useAudioSampleListener(player, listener) {
5
+ useEffect(() => subscribeAudioSampleListener(player, listener), [player, listener]);
6
+ }
@@ -0,0 +1,3 @@
1
+ import type { IAudioStreamResult, IUseAudioStreamOptions } from '../core';
2
+ /** React twin of `expo-audio`'s `useAudioStream` */
3
+ export declare function useAudioStream(options?: IUseAudioStreamOptions): IAudioStreamResult;
@@ -0,0 +1,14 @@
1
+ import { useEffect } from 'react';
2
+ import { createResourceHook, createEventValueHook, } from '@symbiote-native/react';
3
+ import { createAudioStreamController } from '../core/audio-stream-controller.js';
4
+ import { subscribeAudioStreamBuffer, toAudioStreamKey, } from '../core/audio-stream-subscription.js';
5
+ import { AUDIO_STREAM_STATUS } from '../core/types.js';
6
+ const useStreamResource = createResourceHook(createAudioStreamController);
7
+ const useStreamStatus = createEventValueHook(AUDIO_STREAM_STATUS, stream => ({ isStreaming: stream.isStreaming }));
8
+ /** React twin of `expo-audio`'s `useAudioStream` */
9
+ export function useAudioStream(options = {}) {
10
+ const stream = useStreamResource(toAudioStreamKey(options));
11
+ const status = useStreamStatus(stream);
12
+ useEffect(() => subscribeAudioStreamBuffer(stream, options.onBuffer), [stream, options.onBuffer]);
13
+ return { stream, isStreaming: status.isStreaming };
14
+ }
@@ -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,9 @@
1
+ export * from '../core/index.js';
2
+ export { useAudioPlayer } from './use-audio-player.js';
3
+ export { useAudioPlayerStatus } from './use-audio-player-status.js';
4
+ export { useAudioSampleListener } from './use-audio-sample-listener.js';
5
+ export { useAudioPlaylist } from './use-audio-playlist.js';
6
+ export { useAudioPlaylistStatus } from './use-audio-playlist-status.js';
7
+ export { useAudioRecorder } from './use-audio-recorder.js';
8
+ export { useAudioRecorderState } from './use-audio-recorder-state.js';
9
+ export { useAudioStream } from './use-audio-stream.js';
@@ -0,0 +1,4 @@
1
+ import type { AudioPlayer } from '../core';
2
+ import type { IAudioStatus } from '../core';
3
+ /** Solid twin of `expo-audio`'s `useAudioPlayerStatus` */
4
+ export declare const useAudioPlayerStatus: (getSource: import("solid-js").Accessor<AudioPlayer>) => import("solid-js").Accessor<IAudioStatus>;
@@ -0,0 +1,4 @@
1
+ import { createEventValueHook } from '@symbiote-native/solid';
2
+ import { PLAYBACK_STATUS_UPDATE } from '../core/types.js';
3
+ /** Solid twin of `expo-audio`'s `useAudioPlayerStatus` */
4
+ export const useAudioPlayerStatus = createEventValueHook(PLAYBACK_STATUS_UPDATE, player => player.currentStatus);
@@ -0,0 +1,5 @@
1
+ import type { Accessor } from 'solid-js';
2
+ import type { AudioPlayer } from '../core';
3
+ import type { IAudioPlayerOptions, IAudioSource } from '../core';
4
+ /** Solid twin of `expo-audio`'s `useAudioPlayer` */
5
+ export declare function useAudioPlayer(source: Accessor<IAudioSource>, options?: Accessor<IAudioPlayerOptions>): Accessor<AudioPlayer>;
@@ -0,0 +1,7 @@
1
+ import { createResourceHook } from '@symbiote-native/solid';
2
+ import { createAudioPlayerController } from '../core/audio-player-controller.js';
3
+ const usePlayerResource = createResourceHook(createAudioPlayerController);
4
+ /** Solid twin of `expo-audio`'s `useAudioPlayer` */
5
+ export function useAudioPlayer(source, options = () => ({})) {
6
+ return usePlayerResource(() => [source(), options()]);
7
+ }
@@ -0,0 +1,3 @@
1
+ import type { IAudioPlaylistStatus } from '../core';
2
+ /** Solid twin of `expo-audio`'s `useAudioPlaylistStatus` */
3
+ export declare const useAudioPlaylistStatus: (getSource: import("solid-js").Accessor<import("../core/native-module").NativeAudioPlaylist>) => import("solid-js").Accessor<IAudioPlaylistStatus>;
@@ -0,0 +1,4 @@
1
+ import { createEventValueHook } from '@symbiote-native/solid';
2
+ import { PLAYLIST_STATUS_UPDATE } from '../core/types.js';
3
+ /** Solid twin of `expo-audio`'s `useAudioPlaylistStatus` */
4
+ export const useAudioPlaylistStatus = createEventValueHook(PLAYLIST_STATUS_UPDATE, playlist => playlist.currentStatus);
@@ -0,0 +1,5 @@
1
+ import type { Accessor } from 'solid-js';
2
+ import type { AudioPlaylist } from '../core';
3
+ import type { IAudioPlaylistOptions } from '../core';
4
+ /** Solid twin of `expo-audio`'s `useAudioPlaylist` */
5
+ export declare function useAudioPlaylist(getOptions: Accessor<IAudioPlaylistOptions>): Accessor<AudioPlaylist>;
@@ -0,0 +1,7 @@
1
+ import { createResourceHook } from '@symbiote-native/solid';
2
+ import { createAudioPlaylistController } from '../core/audio-playlist-controller.js';
3
+ const usePlaylistResource = createResourceHook(createAudioPlaylistController);
4
+ /** Solid twin of `expo-audio`'s `useAudioPlaylist` */
5
+ export function useAudioPlaylist(getOptions) {
6
+ return usePlaylistResource(() => [getOptions()]);
7
+ }
@@ -0,0 +1,5 @@
1
+ import { type Accessor } from 'solid-js';
2
+ import type { AudioRecorder } from '../core';
3
+ import type { IRecorderState } from '../core';
4
+ /** Solid twin of `expo-audio`'s `useAudioRecorderState` */
5
+ export declare function useAudioRecorderState(recorder: AudioRecorder, interval?: number): Accessor<IRecorderState>;
@@ -0,0 +1,9 @@
1
+ import { createSignal, onCleanup } from 'solid-js';
2
+ import { pollRecorderState } from '../core/audio-recorder-polling.js';
3
+ const DEFAULT_POLL_INTERVAL_MS = 500;
4
+ /** Solid twin of `expo-audio`'s `useAudioRecorderState` */
5
+ export function useAudioRecorderState(recorder, interval = DEFAULT_POLL_INTERVAL_MS) {
6
+ const [state, setState] = createSignal(recorder.getStatus());
7
+ onCleanup(pollRecorderState(recorder, interval, setState));
8
+ return state;
9
+ }
@@ -0,0 +1,5 @@
1
+ import { type Accessor } from 'solid-js';
2
+ import type { AudioRecorder } from '../core';
3
+ import type { IRecordingOptions, IRecordingStatus } from '../core';
4
+ /** Solid twin of `expo-audio`'s `useAudioRecorder` */
5
+ export declare function useAudioRecorder(getOptions: Accessor<IRecordingOptions>, statusListener?: (status: IRecordingStatus) => void): Accessor<AudioRecorder>;
@@ -0,0 +1,13 @@
1
+ import { createEffect, onCleanup } from 'solid-js';
2
+ import { createResourceHook } from '@symbiote-native/solid';
3
+ import { createAudioRecorderController } from '../core/audio-recorder-controller.js';
4
+ import { subscribeRecordingStatus } from '../core/audio-recorder-status.js';
5
+ const useRecorderResource = createResourceHook(createAudioRecorderController);
6
+ /** Solid twin of `expo-audio`'s `useAudioRecorder` */
7
+ export function useAudioRecorder(getOptions, statusListener) {
8
+ const recorder = useRecorderResource(() => [getOptions()]);
9
+ createEffect(() => {
10
+ onCleanup(subscribeRecordingStatus(recorder(), statusListener));
11
+ });
12
+ return recorder;
13
+ }
@@ -0,0 +1,4 @@
1
+ import type { IAudioSamplePlayer } from '../core/audio-sample-listener';
2
+ import type { IAudioSample } from '../core/types';
3
+ /** Solid twin of `expo-audio`'s `useAudioSampleListener` */
4
+ export declare function useAudioSampleListener(player: IAudioSamplePlayer, listener: (data: IAudioSample) => void): void;
@@ -0,0 +1,8 @@
1
+ import { createEffect, onCleanup } from 'solid-js';
2
+ import { subscribeAudioSampleListener } from '../core/audio-sample-listener.js';
3
+ /** Solid twin of `expo-audio`'s `useAudioSampleListener` */
4
+ export function useAudioSampleListener(player, listener) {
5
+ createEffect(() => {
6
+ onCleanup(subscribeAudioSampleListener(player, listener));
7
+ });
8
+ }
@@ -0,0 +1,4 @@
1
+ import { type Accessor } from 'solid-js';
2
+ import type { IAudioStreamResult, IUseAudioStreamOptions } from '../core';
3
+ /** Solid twin of `expo-audio`'s `useAudioStream` */
4
+ export declare function useAudioStream(getOptions: Accessor<IUseAudioStreamOptions>): Accessor<IAudioStreamResult>;