-
-
Notifications
You must be signed in to change notification settings - Fork 116
/
Audio.svelte
50 lines (41 loc) · 1.37 KB
/
Audio.svelte
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<script lang="ts">
import { forwardEventHandlers, T } from '@threlte/core'
import { Audio as ThreeAudio } from 'three'
import { useAudio } from '../utils/useAudio'
import { useThrelteAudio } from '../useThrelteAudio'
import type { AudioEvents, AudioProps, AudioSlots } from './Audio.svelte'
type $$Props = AudioProps
type $$Events = AudioEvents
type $$Slots = AudioSlots
export let src: $$Props['src']
export let id: $$Props['id'] = undefined
export let volume: $$Props['volume'] = undefined
export let playbackRate: $$Props['playbackRate'] = undefined
export let autoplay: $$Props['autoplay'] = undefined
export let detune: $$Props['detune'] = undefined
export let loop: $$Props['loop'] = undefined
const { getAudioListener } = useThrelteAudio()
const listener = getAudioListener(id)
if (!listener) {
throw new Error(`No Audiolistener with id ${id} found.`)
}
export const ref = new ThreeAudio<GainNode>(listener)
const { pause, play, stop, setAutoPlay, setDetune, setLoop, setPlaybackRate, setSrc, setVolume } =
useAudio(ref)
export { play, pause, stop }
$: setAutoPlay(autoplay)
$: setSrc(src)
$: setVolume(volume)
$: setPlaybackRate(playbackRate)
$: setLoop(loop)
$: setDetune(detune)
const component = forwardEventHandlers()
</script>
<T
is={ref}
{...$$restProps}
let:ref
bind:this={$component}
>
<slot {ref} />
</T>