diff --git a/demos/demos/audio/audioOscillator.js b/demos/demos/audio/audioOscillator.js index 2f1245c8..5b550293 100644 --- a/demos/demos/audio/audioOscillator.js +++ b/demos/demos/audio/audioOscillator.js @@ -3,7 +3,9 @@ import { World, AudioOscillator, EntityCommands, - Cleanup + Cleanup, + Timer, + TimerMode } from 'wima' import { addDefaultCamera3D } from '../utils.js' @@ -22,6 +24,9 @@ function init(world) { .spawn() .insertPrefab([ new AudioOscillator(), + new Timer({ + mode: TimerMode.Repeat + }), new Cleanup() ]) .build() diff --git a/demos/demos/audio/audioPlayback.js b/demos/demos/audio/audioPlayback.js new file mode 100644 index 00000000..33619cf6 --- /dev/null +++ b/demos/demos/audio/audioPlayback.js @@ -0,0 +1,86 @@ +import { + Demo, + World, + Audio, + AudioPlayer, + TimerMode, + EntityCommands, + Cleanup, + Timer, + Query, + VirtualClock, + AssetServer +} from 'wima' +import { addDefaultCamera3D } from '../utils.js' + +export default new Demo( + 'audio/audio playback', + [init, addDefaultCamera3D], + [update] +) + +/** + * @param {World} world + */ +function init(world) { + const server = world.getResource(AssetServer) + const commands = world.getResource(EntityCommands) + + world.setResource(new AudioTimer({ + mode: TimerMode.Repeat, + duration: 5 + })) + commands + .spawn() + .insertPrefab([ + new AudioPlayer({ + audio: server.load(Audio, 'assets/audio/bad-apple.m4a') + }), + new Timer({ + mode: TimerMode.Once, + duration: 0 + }), + new Cleanup() + ]) + .build() +} + +/** + * @param {World} world + */ +function update(world) { + const audios = new Query(world, [AudioPlayer, Timer]) + const clock = world.getResource(VirtualClock) + const timer = world.getResource(AudioTimer) + + audios.each(([_player, playback]) => { + if (timer.cycleStarted()) { + const count = timer.cyclesCompleted() + + if (count === 1) { + playback.pause() + } else if (count === 2) { + playback.play() + } else if (count === 3) { + playback.start() + } else if (count === 4) { + playback.stop() + } else if (count === 5) { + playback.speed = 1.2 + playback.play() + } else if (count === 6) { + playback.speed = 1.5 + playback.play() + } else if (count === 7) { + playback.speed = 1 + playback.seek(200) + } else if(count === 8) { + timer.reset() + } + } + }) + + timer.update(clock.getDelta()) +} + +class AudioTimer extends Timer {} \ No newline at end of file diff --git a/demos/demos/audio/audioPlayer.js b/demos/demos/audio/audioPlayer.js index 7d9057e7..d24d5a96 100644 --- a/demos/demos/audio/audioPlayer.js +++ b/demos/demos/audio/audioPlayer.js @@ -6,7 +6,8 @@ import { TimerMode, EntityCommands, Cleanup, - Audio + Audio, + Timer } from 'wima' import { addDefaultCamera3D } from '../utils.js' @@ -26,9 +27,12 @@ function init(world) { .spawn() .insertPrefab([ new AudioPlayer({ - audio: server.load(Audio, 'assets/audio/bad-apple.m4a'), - playbackMode: TimerMode.Repeat + audio: server.load(Audio, 'assets/audio/bad-apple.m4a') }), - new Cleanup()]) + new Timer({ + mode: TimerMode.Repeat + }), + new Cleanup() + ]) .build() } \ No newline at end of file diff --git a/demos/demos/audio/index.js b/demos/demos/audio/index.js index bff6271d..d60b542a 100644 --- a/demos/demos/audio/index.js +++ b/demos/demos/audio/index.js @@ -1,3 +1,4 @@ export { default as audioGraph } from './audioGraph.js' export { default as audioPlayer } from './audioPlayer.js' +export { default as audioPlayback } from './audioPlayback.js' export { default as audioOscillator } from './audioOscillator.js' \ No newline at end of file diff --git a/demos/main.js b/demos/main.js index e2bbb9c8..f8cb8bef 100644 --- a/demos/main.js +++ b/demos/main.js @@ -21,6 +21,7 @@ import { despawn, audioGraph, audioPlayer, + audioPlayback, audioOscillator, keyboard, mouse, @@ -72,6 +73,7 @@ app touch, audioGraph, audioPlayer, + audioPlayback, audioOscillator, lineStyle2d, arcs2d, diff --git a/src/audio/components/audiooscillator.js b/src/audio/components/audiooscillator.js index 62d256f7..a5d30f4c 100644 --- a/src/audio/components/audiooscillator.js +++ b/src/audio/components/audiooscillator.js @@ -1,6 +1,5 @@ /** @import { NodeId } from '../../datastructures/index.js' */ /** @import { ComponentHook } from '../../ecs/index.js' */ -import { Timer } from '../../time/index.js' import { AudioGraph } from '../resources/index.js' export class AudioOscillator { @@ -30,11 +29,6 @@ export class AudioOscillator { */ frequency - /** - * @type {Timer} - */ - playback = new Timer({ duration:1000000 }) - /** * @param {AudioOscillatorOptions} [options] */ diff --git a/src/audio/components/audioplayer.js b/src/audio/components/audioplayer.js index bce4b348..213a55a4 100644 --- a/src/audio/components/audioplayer.js +++ b/src/audio/components/audioplayer.js @@ -1,7 +1,6 @@ /** @import { NodeId } from '../../datastructures/index.js' */ /** @import { ComponentHook } from '../../ecs/index.js' */ import { Handle } from '../../asset/index.js' -import { Timer, TimerMode } from '../../time/index.js' import { Audio } from '../assets/index.js' import { AudioGraph } from '../resources/index.js' @@ -22,21 +21,12 @@ export class AudioPlayer { */ audio - /** - * @type {Timer} - */ - playback - /** * @param {AudioPlayerOptions} [options] */ - constructor({ attach, audio, playbackMode = TimerMode.Once } = {}) { + constructor({ attach, audio } = {}) { this.attach = attach this.audio = audio - this.playback = new Timer({ - duration:1000000, - mode: playbackMode - }) } } @@ -68,5 +58,4 @@ export function removeAudioPlayerSink(entity, world) { * @typedef AudioPlayerOptions * @property {NodeId} [attach] * @property {Handle