123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417 |
- /**
- * Copyright (C) 2014-2016 Triumph LLC
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- "use strict";
- /**
- * Sound effects API.
- * Uses Web Audio API for sound effects and HTML5 audio for background music.
- * @see https://www.blend4web.com/doc/en/audio.html
- * @module sfx
- * @cc_externs AudioContext webkitAudioContext MediaElementAudioSourceNode
- */
- b4w.module["sfx"] = function(exports, require) {
- var m_obj_util = require("__obj_util");
- var m_scs = require("__scenes");
- var m_sfx = require("__sfx");
- var m_print = require("__print");
- /**
- * Play sound through the speaker.
- * @method module:sfx.play
- * @param {Object3D} obj Object 3D
- * @param {Number} [when=0] Delay after exec in seconds
- * @param {Number} [duration=0] Duration of the speaker's playback cycle (in
- * seconds). duration=0 - assign default value according to sound playback length.
- */
- exports.play = function(obj, when, duration) {
- when = when || 0;
- duration = duration || 0;
- m_sfx.play(obj, when, duration);
- }
- /**
- * Play sound through the speaker using the default delay and duration params.
- * @method module:sfx.play_def
- * @param {Object3D} obj Object 3D
- */
- exports.play_def = function(obj) {
- m_sfx.play_def(obj);
- }
- /**
- * Check if sound is played through the speaker now.
- * @method module:sfx.is_play
- * @param {Object3D} obj Object 3D
- * @returns {Boolean} Playing state
- * @deprecated Use {@link module:sfx.is_playing|sfx.is_playing} instead.
- */
- exports.is_play = function(obj) {
- return m_sfx.is_playing(obj);
- }
- /**
- * Check if sound is played through the speaker now.
- * @method module:sfx.is_playing
- * @param {Object3D} obj Object 3D
- * @returns {Boolean} Playing state
- */
- exports.is_playing = function(obj) {
- return m_sfx.is_playing(obj);
- }
- /**
- * Stop the speaker.
- * @method module:sfx.stop
- * @param {Object3D} obj Object 3D
- */
- exports.stop = function(obj) {
- m_sfx.stop(obj);
- }
- /**
- * Pause the speaker.
- * @method module:sfx.pause
- * @param {Object3D} obj Object 3D
- */
- exports.pause = function(obj) {
- m_sfx.speaker_pause(obj);
- }
- /**
- * Resume the paused speaker.
- * @method module:sfx.resume
- * @param {Object3D} obj Object 3D
- */
- exports.resume = function(obj) {
- m_sfx.speaker_resume(obj);
- }
- /**
- * Stop the speaker's looping playback.
- * @method module:sfx.loop_stop
- * @param {Object3D} obj Speaker object
- * @param {Number} [when=0] Delay after exec in seconds
- * @param {Boolean} [wait=false] Wait loop until currently played cycle is
- * finished
- */
- exports.loop_stop = function(obj, when, wait) {
- when = when || 0;
- wait = wait || false;
- m_sfx.loop_stop(obj, when, wait);
- }
- /**
- * Change the speaker playback rate value.
- * @method module:sfx.playrate
- * @param {Object3D} obj Object 3D
- * @param {Number} playrate Playback rate (1.0 - normal speed).
- */
- exports.playrate = function(obj, playrate) {
- m_sfx.playrate(obj, playrate);
- }
- /**
- * Get the speaker playback rate value.
- * @method module:sfx.playrate
- * @param {Object3D} obj Object 3D
- * @returns {Number} Playback rate
- */
- exports.get_playrate = function(obj) {
- return m_sfx.get_playrate(obj);
- }
- /**
- * Set cyclic flag.
- * @method module:sfx.cyclic
- * @param {Object3D} obj Speaker object.
- * @param {Boolean} cyclic New cyclic flag value.
- */
- exports.cyclic = function(obj, cyclic) {
- m_sfx.cyclic(obj, cyclic);
- }
- /**
- * Check if the cyclic flag is set.
- * @method module:sfx.is_cyclic
- * @param {Object3D} obj Speaker object.
- * @returns {Boolean} Cyclic flag value.
- */
- exports.is_cyclic = function(obj) {
- return m_sfx.is_cyclic(obj);
- }
- /**
- * Reset the listener speed.
- * Use before rapid listener movements to neutralize undesirable doppler effect.
- * @method module:sfx.listener_reset_speed
- * @param {Number} speed The listener new speed
- * @param {?Float32Array} [dir=null] The listener new direction
- * @deprecated Use {@link module:sfx.listener_stride|sfx.listener_stride} instead
- */
- exports.listener_reset_speed = function(speed, dir) {
- m_sfx.listener_stride();
- }
- /**
- * Make a listener stride.
- * Use before quick listener movements to neutralize undesirable doppler effect.
- * @method module:sfx.listener_stride
- */
- exports.listener_stride = function() {
- m_sfx.listener_stride();
- }
- /**
- * Reset the speaker speed.
- * It's necessary to nullify speed before the speaker has moved quickly in order
- * to neutralize the undesirable doppler effect.
- * @method module:sfx.speaker_reset_speed
- * @param {Object3D} obj Speaker object.
- * @param {Number} speed The speaker's new speed
- * @param {?Float32Array} [dir=null] The speaker's new direction
- * @deprecated Use {@link module:sfx.speaker_stride|sfx.speaker_stride} instead
- */
- exports.speaker_reset_speed = function(obj, speed, dir) {
- m_sfx.speaker_stride(obj);
- }
- /**
- * Make a speaker stride.
- * Use before rapid speaker movements to neutralize undesirable doppler effect.
- * @method module:sfx.speaker_reset_speed
- * @param {Object3D} obj Speaker object.
- */
- exports.speaker_stride = function(obj) {
- m_sfx.speaker_stride(obj);
- }
- /**
- * Get volume level.
- * @method module:sfx.get_volume
- * @param {?Object3D} obj Object 3D or null for MASTER volume
- * @returns {Number} Volume (0..1)
- */
- exports.get_volume = function(obj) {
- if (obj && typeof obj === "object")
- return m_sfx.get_volume(obj);
- else
- return m_sfx.get_master_volume();
- }
- /**
- * Set volume level.
- * @method module:sfx.set_volume
- * @param {?Object3D} obj Object 3D or null for MASTER volume
- * @param {Number} volume Volume (0..1)
- */
- exports.set_volume = function(obj, volume) {
- if (obj && typeof obj === "object")
- m_sfx.set_volume(obj, volume);
- else
- m_sfx.set_master_volume(volume);
- }
- /**
- * Mute/unmute.
- * @method module:sfx.mute
- * @param {?Object3D} obj Speaker object or null for all of them
- * @param {Boolean} muted New state
- */
- exports.mute = function(obj, muted) {
- if (obj && typeof obj === "object")
- m_sfx.mute(obj, muted);
- else
- m_sfx.mute_master(muted);
- }
- /**
- * Check if the speaker is muted.
- * @method module:sfx.is_muted
- * @param {?Object3D} obj Speaker object or null for all of them.
- * @returns {Boolean} Muted state.
- */
- exports.is_muted = function(obj) {
- if (obj && typeof obj === "object")
- return m_sfx.is_muted(obj);
- else
- return m_sfx.is_master_muted();
- }
- /**
- * Get the speaker objects which are used by the module.
- * @returns {Array} Speaker object array
- */
- exports.get_speaker_objects = function() {
- return m_sfx.get_speaker_objects().slice(0);
- }
- /**
- * Check if there are some active speakers in use or not.
- * @method module:sfx.check_active_speakers
- * @returns {Boolean} Check result
- */
- exports.check_active_speakers = m_sfx.check_active_speakers;
- /**
- * Set compressor params.
- * @method module:sfx.set_compressor_params
- * @param {CompressorParams} params Params object
- * @cc_externs threshold knee ratio attack release
- */
- exports.set_compressor_params = function(params) {
- m_sfx.set_compressor_params(m_scs.get_active(), params);
- }
- /**
- * Get compressor params.
- * @method module:sfx.get_compressor_params
- * @returns {CompressorParams} Params object
- */
- exports.get_compressor_params = function() {
- return m_sfx.get_compressor_params(m_scs.get_active());
- }
- /**
- * Duck (reduce the volume).
- * works independently from the volume API and the volume randomization
- * @method module:sfx.duck
- * @param {?Object3D} obj Object 3D or null for MASTER
- * @param {Number} value Duck amount.
- * @param {Number} time Time to change volume.
- */
- exports.duck = function(obj, value, time) {
- if (obj && typeof obj === "object")
- m_sfx.duck(obj, value, time);
- else
- m_sfx.duck_master(value, time);
- }
- /**
- * Unduck (restore the volume).
- * @method module:sfx.unduck
- * @param {?Object3D} obj Object 3D or null for MASTER
- */
- exports.unduck = function(obj) {
- if (obj && typeof obj === "object")
- m_sfx.unduck(obj);
- else
- m_sfx.unduck_master();
- }
- /**
- * Apply the new playlist from the given set of speakers.
- * The new playlist starts playing immediately.
- * @method module:sfx.apply_playlist
- * @param {Object3D[]} objs Array of objects.
- * @param {Number} delay Number of seconds between tracks
- * @param {Boolean} random Randomize playback sequence
- */
- exports.apply_playlist = m_sfx.apply_playlist;
- /**
- * Stop playback and clear the playlist.
- * @method module:sfx.clear_playlist
- */
- exports.clear_playlist = m_sfx.clear_playlist;
- /**
- * Detect supported audio containter.
- * Containers have same meaning as file extension here, for each one possible
- * fallback exists:
- * <ul>
- * <li>ogg -> mp4
- * <li>mp3 -> ogg
- * <li>mp4 -> ogg
- * </ul>
- * @method module:sfx.detect_audio_container
- * @param {String} [hint="ogg"] Required container
- * @returns {String} Supported containter or ""
- */
- exports.detect_audio_container = m_sfx.detect_audio_container;
- /**
- * Detect supported video containter.
- * Containers have same meaning as file extension here, for each one possible
- * fallback exists:
- * <ul>
- * <li>ogv -> m4v
- * <li>m4v -> webm
- * <li>webm -> m4v
- * </ul>
- * @method module:sfx.detect_video_container
- * @param {String} [hint="webm"] Required container
- * @returns {String} Supported containter or ""
- */
- exports.detect_video_container = m_sfx.detect_video_container;
- /**
- * Set positional params.
- * @method module:sfx.set_positional_params
- * @param {Object3D} obj Object 3D
- * @param {PositionalParams} params Params object
- * @cc_externs dist_ref dist_max attenuation
- */
- exports.set_positional_params = m_sfx.set_positional_params;
- /**
- * Get positional params.
- * @method module:sfx.get_positional_params
- * @param {Object3D} obj Object 3D
- * @returns {PositionalParams} Params object
- */
- exports.get_positional_params = m_sfx.get_positional_params;
- /**
- * Set filter params.
- * @method module:sfx.set_filter_params
- * @param {Object3D} obj Object 3D
- * @param {FilterParams} params Params object
- * @cc_externs freq Q gain
- */
- exports.set_filter_params = m_sfx.set_filter_params;
- /**
- * Get filter params.
- * @method module:sfx.get_filter_params
- * @param {Object3D} obj Object 3D
- * @returns {FilterParams} Params object
- */
- exports.get_filter_params = m_sfx.get_filter_params;
- /**
- * Get filter frequency response.
- * @method module:sfx.get_filter_freq_response
- * @param {Object3D} obj Object 3D
- * @param {Float32Array} freq_arr Input array with frequencies.
- * @param {Float32Array} mag_arr Ouput array with filter response magnitudes.
- * @param {Float32Array} phase_arr Output array with filter response phases.
- */
- exports.get_filter_freq_response = m_sfx.get_filter_freq_response;
- /**
- * Get duration of the speaker's playback cycle.
- * Zero duration means looped or non-ready speaker
- * @method module:sfx.get_volume
- * @param {?Object3D} obj Speaker object.
- * @returns {Number} Duration
- */
- exports.get_duration = function(obj) {
- if (!obj || !m_obj_util.is_speaker(obj)) {
- m_print.error("Object \"" + (obj ? obj.name : undefined) +
- "\" is not a valid speaker");
- return;
- }
- return m_sfx.get_duration(obj);
- }
- }
|