From b1d9ce07ff0346fc423325114144d39db23924ea Mon Sep 17 00:00:00 2001 From: Federico Gratti Date: Tue, 16 Nov 2021 16:07:48 -0300 Subject: [PATCH] Add support to PositionalAudio --- .version | 2 +- package.json | 2 +- src/components/AudioClip.js | 20 ++++++++++-- src/resource_loader/AudioLoader.js | 47 ++++++++++++---------------- src/resource_loader/ResourceBatch.js | 4 +-- src/resource_loader/TextureLoader.js | 9 +++--- 6 files changed, 46 insertions(+), 38 deletions(-) diff --git a/.version b/.version index 7813641..10a4559 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -v5.16.10 +v5.16.11 diff --git a/package.json b/package.json index 755ba36..420c63f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ohzi-core", - "version": "5.16.10", + "version": "5.16.11", "description": "OHZI Core Library", "module": "build/index.module.js", "source": "src/index.js", diff --git a/src/components/AudioClip.js b/src/components/AudioClip.js index e7cffd9..8dad68d 100644 --- a/src/components/AudioClip.js +++ b/src/components/AudioClip.js @@ -1,21 +1,35 @@ -import { Audio as THREEAudio } from 'three'; +import { Audio as TAudio } from 'three'; +import { PositionalAudio as TPositionalAudio } from 'three'; export default class AudioClip { - constructor(buffer, loop = true, volume = 1) + constructor(buffer, loop = true, volume = 1, positional = false) { this.buffer = buffer; this.loop = loop; this.volume = volume; + this.positional = positional; this.audio = undefined; } init(audio_listener) { - this.audio = new THREEAudio(audio_listener); + if (this.positional) + { + this.audio = new TPositionalAudio(audio_listener); + } + else + { + this.audio = new TAudio(audio_listener); + } + this.audio.setBuffer(this.buffer); this.audio.setLoop(this.loop); + + // This prevents undesired volume at the beginning of playing + this.audio.gain.gain.value = 0; + this.audio.setVolume(this.loop ? 0 : this.volume); } diff --git a/src/resource_loader/AudioLoader.js b/src/resource_loader/AudioLoader.js index 668eb51..4347da4 100644 --- a/src/resource_loader/AudioLoader.js +++ b/src/resource_loader/AudioLoader.js @@ -1,54 +1,47 @@ import AbstractLoader from './AbstractLoader'; import AudioClip from '../components/AudioClip'; -import { AudioLoader as THREEAudioLoader } from 'three'; + +import { AudioContext } from 'three'; export default class AudioLoader extends AbstractLoader { - constructor(resource_id, url, loop = true, volume = 1, size) + constructor(resource_id, url, loop = true, volume = 0, size, positional = false) { super(resource_id, url, size); - this.loader = new THREEAudioLoader(); this.loop = loop; this.volume = volume; + this.positional = positional; } - on_preloaded_finished(resource_container) + on_preloaded_finished(resource_container, response) { if (!window.user_interaction_for_audio) { - setTimeout(this.on_preloaded_finished.bind(this, resource_container), 100); + setTimeout(this.on_preloaded_finished.bind(this, resource_container, response), 100); } else { - this.load_with_three_loader(resource_container); + this.instantiate_audio(resource_container, response); } } - load_with_three_loader(resource_container) + instantiate_audio(resource_container, response) { - let ctx = this; - - this.loader.load(this.url, (buffer) => + response.arrayBuffer().then((array_buffer) => { - resource_container.set_resource(ctx.resource_id, ctx.url, new AudioClip(buffer, this.loop, this.volume)); + const context = AudioContext.getContext(); + context.decodeAudioData(array_buffer, (audio_buffer) => + { + resource_container.set_resource( + this.resource_id, + this.url, + new AudioClip(audio_buffer, this.loop, this.volume, this.positional) + ); - ctx.__update_downloaded_bytes(1, 1); - ctx.__loading_ended(); - }, - (xhr) => - { - // if (xhr) - // { - // let total = xhr.total || this.total_bytes; - - // ctx.__update_downloaded_bytes(xhr.loaded, total); - // } - }, - (error) => - { - ctx.__set_error('Audio could not be loaded. Maybe wrong name or path, I don\'t know' + '¯\\_(ツ)_/¯', error); - ctx.__loading_ended(); + this.__update_downloaded_bytes(1, 1); + this.__loading_ended(); + }); }); } } diff --git a/src/resource_loader/ResourceBatch.js b/src/resource_loader/ResourceBatch.js index f0bcfd5..7f81c31 100644 --- a/src/resource_loader/ResourceBatch.js +++ b/src/resource_loader/ResourceBatch.js @@ -69,9 +69,9 @@ export default class ResourceBatch this.resource_loaders.push(new CubemapLoader(resource_id, url, size)); } - add_audio(resource_id, url, loop, volume, size) + add_audio(resource_id, url, loop, volume, size, positional) { - this.resource_loaders.push(new AudioLoader(resource_id, url, loop, volume, size)); + this.resource_loaders.push(new AudioLoader(resource_id, url, loop, volume, size, positional)); } add_video(resource_id, url, size) diff --git a/src/resource_loader/TextureLoader.js b/src/resource_loader/TextureLoader.js index 12afaef..69fb62d 100644 --- a/src/resource_loader/TextureLoader.js +++ b/src/resource_loader/TextureLoader.js @@ -19,16 +19,17 @@ export default class TextureLoader extends AbstractLoader const image = new Image(); image.src = url; + image.onload = () => { texture.image = image; texture.needsUpdate = true; - }; - resource_container.set_resource(this.resource_id, this.url, texture); + resource_container.set_resource(this.resource_id, this.url, texture); - this.__update_downloaded_bytes(1, 1); - this.__loading_ended(); + this.__update_downloaded_bytes(1, 1); + this.__loading_ended(); + }; }); } }