({
+ duration: 0,
+ muted: false,
+ paused: true,
+ playbackRate: 1,
+ loading: false,
+});
+
+type HandleType = 'toggle' | 'set';
+
+function play(type: HandleType = 'set') {
+ log('play: ', type);
+ return __internal_audio_element.subscribe((el) => {
+ if (!el) return warn('no audio element');
+ if (type === 'toggle') {
+ el.paused ? el.play() : el.pause();
+ } else {
+ el.play();
+ }
+ })();
+}
+function pause(type: HandleType = 'set') {
+ log('pause: ', type);
+ return __internal_audio_element.subscribe((el) => {
+ if (!el) return warn('no audio element');
+ if (type === 'toggle') {
+ el.paused ? el.play() : el.pause();
+ } else {
+ el.pause();
+ }
+ })();
+}
+
+function mute(type: HandleType = 'set') {
+ log('mute: ', type);
+ return __internal_audio_element.subscribe((el) => {
+ if (!el) return warn('no audio element');
+ if (type === 'toggle') {
+ el.muted = !el.muted;
+ } else {
+ el.muted = true;
+ }
+ })();
+}
+function unmute(type: HandleType = 'set') {
+ log('unmute: ', type);
+ return __internal_audio_element.subscribe((el) => {
+ if (!el) return warn('no audio element');
+ if (type === 'toggle') {
+ el.muted = !el.muted;
+ } else {
+ el.muted = false;
+ }
+ })();
+}
+
+function load(src: string) {
+ log('load: ', src);
+ __internal_audio_src.set(src);
+ return __internal_audio_element.subscribe((el) => {
+ if (!el) return warn('no audio element');
+ el.volume = 1;
+ el.pause();
+ })();
+}
+function unload() {
+ log('unload: ');
+ __internal_audio_src.set(null);
+}
+
+function setPlaybackRate(rate: number) {
+ log('setPlaybackRate: ', rate);
+ return __internal_audio_element.subscribe((el) => {
+ if (!el) return warn('no audio element');
+ el.playbackRate = clamp(0, 10, rate);
+ })();
+}
+
+function seek(seconds: number, from: 'from-start' | 'from-end' = 'from-start') {
+ log('seek: ', seconds, from);
+ return __internal_audio_element.subscribe((el) => {
+ if (!el) return warn('no audio element');
+ if (from === 'from-end') {
+ el.currentTime = clamp(0, el.duration, el.duration - seconds);
+ } else {
+ el.currentTime = clamp(0, el.duration, seconds);
+ }
+ })();
+}
+
+function skip(seconds: number, type: 'forward' | 'backward' = 'forward') {
+ log('skip: ', seconds, type);
+ return __internal_audio_element.subscribe((el) => {
+ if (!el) return warn('no audio element');
+ if (type === 'backward') {
+ el.currentTime = clamp(0, el.duration, el.currentTime - seconds);
+ } else {
+ el.currentTime = clamp(0, el.duration, el.currentTime + seconds);
+ }
+ })();
+}
+
+export const audio = {
+ subscribe: __internal_audio_metadata.subscribe,
+ play,
+ pause,
+ mute,
+ unmute,
+ load,
+ unload,
+ setPlaybackRate,
+ seek,
+ skip,
+};
diff --git a/src/lib/components/audio/types.ts b/src/lib/components/audio/types.ts
new file mode 100644
index 0000000..6e5c9a3
--- /dev/null
+++ b/src/lib/components/audio/types.ts
@@ -0,0 +1,9 @@
+export type PlayerElement = HTMLAudioElement | undefined;
+
+export type PlayerMetadata = {
+ duration: number;
+ muted: boolean;
+ paused: boolean;
+ playbackRate: number;
+ loading: boolean;
+};
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index e9483dd..856f111 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -1,6 +1,6 @@
-
- {JSON.stringify($audio, null, 3)}
-
+{JSON.stringify($audio, null, 3)}
Demo
-