Skip to content

Commit

Permalink
Create Wasm-compatible audio components
Browse files Browse the repository at this point in the history
  • Loading branch information
whitphx committed Oct 9, 2023
1 parent 8b650d8 commit 12aba77
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 5 deletions.
9 changes: 5 additions & 4 deletions js/audio/interactive/Audio.svelte
Expand Up @@ -13,9 +13,9 @@
import { Upload, ModifyUpload } from "@gradio/upload";
import { BlockLabel } from "@gradio/atoms";
import { Music } from "@gradio/icons";
import Audio from "../shared/Audio.svelte";
// @ts-ignore
import Range from "svelte-range-slider-pips";
import { loaded } from "../shared/utils";
import { _ } from "svelte-i18n";
import type { IBlobEvent, IMediaRecorder } from "extendable-media-recorder";
Expand Down Expand Up @@ -295,10 +295,11 @@
absolute={true}
/>

<audio
use:loaded={{ autoplay, crop_values }}
<Audio
controls
bind:this={player}
{autoplay}
{crop_values}
bind:node={player}
preload="metadata"
src={value?.data}
on:play
Expand Down
1 change: 1 addition & 0 deletions js/audio/package.json
Expand Up @@ -14,6 +14,7 @@
"@gradio/statustracker": "workspace:^",
"@gradio/upload": "workspace:^",
"@gradio/utils": "workspace:^",
"@gradio/wasm": "workspace:^",
"extendable-media-recorder": "^9.0.0",
"extendable-media-recorder-wav-encoder": "^7.0.76",
"svelte-range-slider-pips": "^2.0.1"
Expand Down
33 changes: 33 additions & 0 deletions js/audio/shared/Audio.svelte
@@ -0,0 +1,33 @@
<script lang="ts">
import type { HTMLAudioAttributes } from "svelte/elements";
import { createEventDispatcher } from "svelte";
import { loaded, type LoadedParams } from "../shared/utils";
import { resolve_wasm_src } from "@gradio/wasm/svelte";
export let src: HTMLAudioAttributes["src"] = undefined;
export let autoplay: LoadedParams["autoplay"] = undefined;
export let crop_values: LoadedParams["crop_values"] = undefined;
export let controls: HTMLAudioAttributes["controls"] = undefined;
export let preload: HTMLAudioAttributes["preload"] = undefined;
export let node: HTMLAudioElement | undefined = undefined;
const dispatch = createEventDispatcher();
</script>

{#await resolve_wasm_src(src) then resolved_src}
<audio
src={resolved_src}
{controls}
{preload}
on:play={dispatch.bind(null, "play")}
on:pause={dispatch.bind(null, "pause")}
on:ended={dispatch.bind(null, "ended")}
bind:this={node}
use:loaded={{ autoplay, crop_values }}
data-testid={$$props["data-testid"]}
/>
{:catch error}
<p style="color: red;">{error.message}</p>
{/await}
2 changes: 1 addition & 1 deletion js/audio/shared/utils.ts
@@ -1,6 +1,6 @@
import type { ActionReturn } from "svelte/action";

interface LoadedParams {
export interface LoadedParams {
crop_values?: [number, number];
autoplay?: boolean;
}
Expand Down
3 changes: 3 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 12aba77

Please sign in to comment.