You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
SFXSources are the interface to sound playback. They are created through the SFXSystem and control all aspects of playback. The SFX system can be interfaced through a number of console methods.
Note: Do not create SFXSources directly through object declarations (i.e. new or singleton). This is inhibited by the SFX system.
SFXSources are either created from SFXProfiles or
directly from SFXStreams. The latter method is only available
internally from within the engine and not exposed to script.
SFXProfiles are created by the user. They
combine sound files with SFXDescriptions that describe how to play back
the particular file.
SFXDescriptions are datablocks with a series of properties that describe aspects of sound playback.
SFXSources create SFXVoices (playback
controllers) and SFXBuffers (sample data buffers) on SFXDevices. This
happens internally.
SFXStreams are used to load sample data
into SFXBuffers. For streaming buffers, this is a continuous process.
This happens internally.
An SFXListener instance is coupled to the
SFXSystem and defines the location and velocity of the listener in 3D
space. This is used for volume attenuation of 3D sounds. This happens
internally. The listener is automatically updated from the game's
control object.
Channels
To allow volume level adjustment to a whole batch of sounds, sounds
are grouped into logical volume channels. Music can thus be separated
from sound effects or voices and have its volume adjusted
independently.
Volume channels are numbered from 0 onwards. There is a
maximum of 32 channels. The core scripts currently define and use three
separate channels (defined in core/scripts/client/audio.cs):
$GuiAudioType = 1;
Use for sounds relating to the interface.
$SimAudioType = 2;
Use for in-game sound effect and environmental sounds.
$MessageAudioType = 3;
Use for notifications (such as from chat) and possibly voices.
$MusicAudioType = 4;
Use for background music.
Note: The master volume set on the SFX system simultaneously scales all of the volume channels.
A set of SFXDescriptions preset to this set of channels is made
available through core/scripts/client/audio.cs. These should best be
used as copy-sources for custom SFXDescriptions.
AudioGui
AudioSim
AudioMessage
AudioMusic
Descriptions
Playback setups are described in SFXDescriptions. These are defined in art/datablocks/audioProfiles.cs. Some useful examples are below:
There are multiple options available for configuring volume
attenuation of 3D sounds on the device. The settings are exposed as
script variables and must be set in script (either from the console or
add them to scripts/client/prefs.cs).
$pref::SFX::distanceModel
The distance model determines the rolloff function for 3D sounds,
i.e. the way the volume attenuates as you move away from a 3D sound.
The chosen model affects distance attenuation of all 3D sounds.
Currently, there are two models available:
"linear"
Starting from a sound's reference distance, the volume fades
linearly towards its set maximum distance at which point it reaches
zero.
Notes:
Linear rolloff is not supported with DirectSound.
Linear rolloff is unaffected by the rolloff factor set on the device.
"logarithmic"
Starting from a sound's reference distance, the volume halves
every reference distance steps. This is the more realistic behavior for
distance attenuation. In this model, the maximum distance only
determines at which distance volume no longer decreases.
Instead, attenuation simply stops at the set maximum distance.
Attenuation can be scaled by the rolloff factor to be faster or slower.
$pref::SFX::dopplerFactor
The doppler shift to apply to 3D sounds based on the relative
velocity to the listener. Higher values give more pronounced doppler
effects. Default is 0.5.
$pref::SFX::rolloffFactor
The rolloff factor scales the reference distance of a sound to
determine how fast attenuation decreases a sound's volume. At 1.0,
every reference distance steps will halve the volume of a sound. At
0.5, every reference distance steps will have the quarter of the
previous step's volume.
Note: The rolloff factor only affects logarithmic distance attenuation.
Script Classes
SFXDescription
Description
SFXDescriptions tell the sound system how to play back a sound, i.e.
they provide the parameters when setting up playback for a sound on the
device.
Properties
volume [float]: Base volume level for the sound. This
will be the starting point for volume attenuation on the sound. Must be
between 0 (min) and 1 (max). Default is 1.
pitch [float]: Pitch scale. This speeds up or slows down playback. Must be
greater than 0. Default is 1.
isLooping [bool]: If true, the sound will be played in an endless loop. Default is false.
isStreaming [bool]: If true, the sound will be progressively streamed; if false, the sound will be buffered in whole. Default is false.
is3D [bool]: If true, the sound is positional and mixed according to its spatial properties. Default is false.
referenceDistance [float]: Distance at which volume
attenuation begins. Up to this distance, the sound retains its base
volume. Also, in the exponential distance model, the reference distance
determine how fast the sound volume decreases with distance. Each
referenceDistance steps (scaled by the rolloff factor), the volume
halves. A rule of thumb is that for sounds that require you to be close
to hear them in the real world, set the reference distance to small
values whereas for sounds that are widely audible set it to larger
values. Only for 3D sounds.
maxDistance [float]: The distance at which attenuation
stops. In the linear distance model, the attenuated volume will be zero
at this distance. In the logarithmic model, attenuation will simply
stop at this distance and the sound will keep its attenuated volume
from there on out. Only for 3D sounds.
coneInsideAngle [float]: Specifies the angle of the
inside cone in degrees. Valid values are from 0 to 360. Must be less
than coneOutsideAngle. Default is 360. Only for 3D sounds.
coneOutsideAngle [float]: Specifies the angle of the outside cone in degrees. Valid values are from 0 to 360. Default is 360. Only for 3D sounds.
coneOutsideVolume [float]: Determines the volume scale
factor applied to a source's base volume level outside of the outer
cone. In the outer cone, starting from outside the inner cone, the
scale factor smoothly interpolates from 1.0 (within the inner cone) to
this value. At the moment, the allowed range is 0.0 (silence) to 1.0
(no attenuation) as amplification is only supported on XAudio2 but not
on the other devices. Only for 3D sound.
channel [int]: Volume channel that the sound will get
assigned to. The base volume level of the sound will be scaled by the
channel's volume level. Default is 0.
fadeInTime [float]: Number of seconds to gradually fade in volume from zero when playback starts.
fadeOutTime [float]: Number of seconds to gradually fade out volume to zero before playback stops.
streamPacketSize [int]: Number of seconds of sample data
to read per streaming packet. Only for streamed sounds and only when
SFX's own streaming system is used.
streamReadAhead [int]: Number of stream packets to keep
buffered ahead of time. A number of packets (usually three) will
generally be kept immediately on the SFX device for playback. This
number controls how many more packets are read ahead of time in
addition to this. Higher numbers allow to better cope with lagging
stream sources but for good resource consumption, this should be kept
reasonably low. Only for streamed sounds and only when SFX's own
streaming system is used.
SFXProfile
Description
An SFXProfile combines a sound file with an SFXDescription that tells how to play back the sound. SFXProfiles are datablocks, so when you define server-side SFXProfiles use the
datablock keyword. For client-side only profiles, use new or
singleton.
For non-streamed sounds, the SFXProfile will keep a
reference to the SFXBuffer on the device once the sound has been
loaded. This will allow simultaneous playbacks of the same profile to
share a single SFXBuffer. A profile's sound will automatically reload
when its file on disk changes. This will also update all sources that
are currently using the profile.
By default, the sound data contained in an SFXProfile will
be loaded into the SFX device when the sound is first played. This will
incur a short delay on the first use. To load the sound data ahead of
time independent on the first use, set the "preload" property to true.
This will cause sound data to be loaded when the profile object is
added to the system.
Once loaded, the sound data will remain loaded on the
device until either the device is destroyed or the SFXProfile is
deleted. Be aware that only non-streamed sounds may be preloaded.
Streamed sounds always incur a certain loading delay. To ready a
streamed sound for playback, attach and ready an SFXSource before
playing the sound.
Properties
filename [string]: The name of the file to load. It is usually best to omit extensions with sound filenames. This allows you to easily switch formats without having to change scripts. The SFX system will scan through its list of supported file formats (including extended formats supported by specific devices) to find the full filename.
description [object]: The SFXDescription to use when playing back the sound.
preload [bool]: If true, the sound file will be loaded
into the SFX system as soon as the profile object gets added to
Torque's object graph. This helps ensure that sounds are immediately
ready for playback when the profile is used. Be aware, though, that
this will also result in immediate resource consumption on the
SFXDevice. Preloading will not cause disruptions in the loading process
as sound loading happens in the background. Only non-streamed sounds
can be preloaded. This flag is ignored for streamed sounds. To load a
streamed sound into ready state before playing, create an SFXSource for
it.
Methods
*float getSoundDuration(): Return the duration (in seconds) of the sound referenced by the profile.
SFXSource
Description
Central controller for sound playback. SFXSources control the
playback of a particular SFXProfile or SFXStream. SFXSources can only
be created through sfxCreateSource or the various sfxPlay functions.
SFXSources are explicitly created by the user through SFX
functions and are valid until they are deleted. However, to reduce
bookkeeping required for single-shot sounds, the system keeps a list of
so called "play-once sources." An SFXSource that is created as a
play-once source will only be valid for as long as it is playing. When
it has finished playing, it will be automatically deleted during the
next SFX update.
Note that while permanent references to play-once sources
should not be stored in script, a reference will not become invalid
in-midst of script execution.
Markers are used for notifications that are triggered when
playback crosses over a certain playback position. Each marker has a
name and an associated playback position expressed in seconds. When
playback crosses over the position, the
"onMarkerPassed( %source, %markerName )" callback will be
called on the source.
This is useful for synchronizing logic to music and sound
effects. Currently, using setPosition() on a source will not prevent
markers being jumped over from triggering. Instead, these markers will
immediately trigger on the next source update.
Properties
statusCallback [string]: Name of function to call when
the status of the SFXSource changes. Must take two parameters "(
object %source, string %newStatus )". Default is empty which
deactivates the callback. If this field is set, the source's
onStatusChange callback will not trigger.
Callbacks
These methods may be defined on SFXSources by the user and are called by the system on specific events.
onMarkerPassed( object this, string name ): Called when a notification marker has been passed by the playback cursor. "name" is the name of the marker.
onStatusChange( object this, string newStatus ):Called when the playback status of the source changes. Set getStatus() for the possible values for "newStatus".
Methods
bool isReady(): Returns true when the source has successfully loaded all its sound data and is ready for playback.
bool isPaused(): Returns true when the source is currently in paused state.
bool isPlaying(): Return true when the source is
currently playing. Even though a given SFXSource is in playing state,
it will not emit sound data on the device if it is in blocked state
(awaiting data from its SFXStream) or is in virtualized playback mode.
bool isStopped(): Returns true when the source is
currently stopped. Sources will start out in stopped state and will
transition back into stopped state when they have finished playing.
string getStatus(): Return the current playback status of the source. Possible values are:
"playing": source is currently playing
"stopped": source is not playing
"paused": source has been paused
int getChannel(): Return the volume channel this SFXSource is assigned to.
float getDuration(): Return the total playback time of the SFXSource's associated sound in seconds.
setTransform( vector pos, [ vector direction ] ): Set the 3D position and optionally the direction of the SFXSource.
setCone( float innerAngle, float outerAngle, foat outsideVolume ): Set the 3D sound cone of the SFXSource.
setVolume( float volume ): Set the (unattenuated) volume of the SFXSource. Must be between 0 (min) and 1 (max).
setPitch( float pitch ): The frequency shift factor. A
pitch of 1 plays back at the default frequency. A pitch of 0.5 of half
the default frequency. The default frequency is the frequency of the
source SFXStream.
float getPosition(): Returns the current position of the play cursor in seconds.
setPosition( float pos ): Set the position of the play cursor in seconds.
play( [ float fadeInTime ] ): Start or resume playback.
If "fadeInTime" is given and is greater than 0, then the source will do a volume
fade to its assigned volume in "fadeInTime" seconds. "fadeInTime"
overrides a setting given in the SFXSource's SFXDescription. If the
sound referred to by the source is not yet fully loaded, there may be a
delay before playback actually starts. If there are more active voices
than supported by the current SFX device, one SFXSource (this or
another one depending on which is deemed least important) will go into
virtualized playback mode as a result of calling play().
stop( [ float fadeOutTime ] ): Stop playback. If
"fadeOutTime" is given and is greater than 0, then the source will do a volume
fade to zero in "fadeOutTime" seconds and then stop. "fadeOutTime"
overrides a setting given in the SFXSource's SFXDescription.
pause( [ float fadeOutTime ] ): Pause playback. If
"fadeOutTime" is given and is greater than 0, then the source will do a volume
fade to zero in "fadeOutTime" seconds and then pause. "fadeOutTime"
overrides a setting given in the SFXSource's SFXDescription.
addMarker( string name, float pos ): Add a marker called
"name" at "pos" seconds into playback. If playback passes the given
position, the "onMarkerPassed" callback will trigger.
SFXEmitter
Description
An SFXEmitter is a 3D object that emits sound. It has no visible
representation (except within the editor), but does have a true
location and velocity in 3D world space. Even though an SFXEmitter is
an object in 3D space, it need not necessarily emit a 3D sound. It can
also emit non-positional 2D sounds.
This is useful for placing background music in a level. There are two ways to set up an SFXEmitter:
through a predefined SFXProfile ("profile" property)
plays the sound specified by the profile
uses the profile's SFXDescription
some of the emitter's properties override the settings in the profile's SFXDescription (see documentation below)
directly through a sound file ("fileName" property)
uses the properties on the emitter to set up a custom SFXDescription
Setting a "profile" will take precedence over setting a "fileName".
Currently it is not possible to have an emitter go through a list of
sounds (at least not without scripting).
Properties
profile [SFXProfile]: The sound profile to play on this
emitter. Either use this or "fileName" to set the sound to play. This
field will take precedence over "fileName".
fileName [FileName]: The sound file to play on this emitter.
playOnAdd [bool]: If true, playback will be immediately
started when the emitter is added to the scene. Applies regardless of
whether "profile" or "fileName" is used.
isLooping [bool]: If true, the emitter's sound will loop
infinitely. Only applies when using "fileName". For "profile", the
profile SFXDescription's "isLooping" value is used.
isStreaming [bool]: If true, the sound will use streamed
playback. Only applies when using "fileName". For "profile", the
profile SFXDescription's "isStreaming" value is used.
channel [int]: The volume channel to play the sound in.
Only applies when using "fileName". For "profile", the profile
SFXDescription's "channel" value is used.
volume [float]: The base (unattenuated) volume at which
to play the sound. Applies to both "profile" and "fileName". Must be
between 0 (min) and 1 (max).
pitch [float]: The frequency shift factor at which to play back the sound. Must be
greater than 0. Applies to both "profile" and "fileName".
fadeInTime [float]: Time in seconds to fade volume from
zero to full intensity when starting/resuming playback. Must be greater
or equal to 0. Only applies when using "fileName". For "profile", the
profile SFXDescription's "fadeInTime" value is used.
fadeOutTime [float]: Time in seconds to fade volume out
to zero before stopping/pausing playback. Must be greater or equal to
0. Only applies when using "fileName". For "profile", the profile
SFXDescription's "fadeOutTime" value is used.
is3D [bool]: If true, the sound will be positional. Only
applies when using "fileName". For "profile", the profile
SFXDescription's "is3D" value is used.
referenceDistance [float]: The distance at which to
start distance-based volume attenuation. Only applies to 3D sounds.
Applies to both "profile" and "fileName".
maxDistance [float]: The distance at which to stop
distance-based volume attenuation. Only applies to 3D sounds. Applies
to both "profile" and "fileName".
coneInsideAngle [int]: Inside 3D cone angle in degrees.
Must be between 0 (min) and 360 (max). Only applies to 3D sounds.
Applies to both "profile" and "fileName".
coneOutsideAngle [int]: Outside 3D cone angle in
degrees. Must be between 0 (min) and 360 (max). Only applies to 3D
sounds. Applies to both "profile" and "fileName".
coneOutsideVolume [float]: Volume scale factor outside
3D cone. Must be between (0) (min) and 1 (max). Only applies to 3D
sounds. Applies to both "profile" and "fileName".
Methods
play(): Sends network event to start playback of the emitter (if not already playing). If called on the client (the ghost), will immediately trigger playback.
stop(): Sends network event to stop playback of the emitter (if not already stopped). If called on the client (the ghost), will immediately stop playback.
string getPlaybackStatus(): Returns the playback status of the emitter. See SFXSource.getStatus(). If called on a server-side SFXEmitter, the emitter's client-side object (ghost) object on the local client connection will be queried.
bool isInRange(): Returns true if the SFX listener (local connection's control object) is currently within the max range of the emitter.
Script Functions
Device Management
Before sound playback functions can be used, a valid sound device
must be created through one of the given sound providers. When using
the standard game/core/ scripts, this is automatically taken care of during
engine startup.
vector sfxGetAvailableDevices(): Returns a vector that
describes each of the available devices. Individual devices are
separated by newlines and individual properties of devices are
separated by tabs.
bool sfxCreateDevice( string provider, string device, bool useHardware, int maxBuffers ):
Try to create a new sound device using the given properties. This
function must be called before any of the sound playback functions can
be used. If there currently is an active device, it will be deleted
automatically. Returns true if the operation succeeded and the device
has been created.
Each device entry has the following properties (in the order they appear in the vector):
providerName [string]: The name of the sound provider (e.g. "FMOD")
deviceName [string]: The name of the device made available by the provider.
hasHardware [bool]: If true, the device has support for mixing in hardware.
maxBuffers [int]: Maximum number of concurrent
buffers supported by the device, i.e. the maximum number of
concurrently audible voices. If this is exceeded, playback
virtualization will kick in and distribute the available voices across
the playing sounds.
In the
game/core scripts, sound is automatically set up during
startup in the sfxStartup() function. Sounds that are playing while the
sound device is being changed will be temporarily transitioned to
virtualized playback and then resume normal playback once the new
device has been created.
sfxDeleteDevice(): Delete the currently active sound
device and release all its resources. In the core scripts, this is done
automatically for you during shutdown in the sfxShutdown() function.
SFXSources that are still playing will be transitioned to virtualized
playback mode. When creating a new device, they will automatically
transition back to normal playback.
vector sfxGetDeviceInfo(): Return information about the
currently active sound device. The return value is a tab-delimited
string containing the following properties (in the order they appear in
the vector):
providerName [string]: Name of the sound provider that supplies the device (e.g. "FMOD").
deviceName [string]: Name of the device on the provider.
usesHardware [bool]: If true, device is set up to use hardware mixing.
maxBuffers [int]: Maximum number of concurrent voices the device is configured to use.
Configuration
float sfxGetMasterVolume(): Return the system master
volume. This volume level scales the volume of all independent volume
channels simultaneously. Default is 1.
sfxSetMasterVolume( float volume ): Set the system master volume. Must be between 0 (min) and 1 (max). This will affect all currently active sounds.
float sfxGetChannelVolume( int channel ): Return the volume level of the given channel. Will be between 0 and 1. Default is 1.
sfxSetChannelVolume( int channel, float volume ): Set
the volume level of the given channel. Must be between 0 (min) and 1
(max). This will affect all sounds currently playing on that channel.
string sfxGetDistanceModel(): Return the name of the
distance model currently used for distance attenuation of 3D sounds.
Currently, this is either "linear" or "logarithmic". Default is set by
"$pref::SFX::distanceModel". If unset, the linear distance model is
used.
sfxSetDistanceModel( string model ): Set the distance
model to use for distance attenuation of 3D sounds. Must be either
"linear" or "logarithmic". This will affect the volume attenuation of
all currently active 3D sounds.
float sfxGetDopplerFactor(): Return the factor applied
to doppler effects on 3D sounds. Default is set by
"$pref::SFX::dopplerFactor". If unset, default is 0.5.
sfxSetDopplerFactor( float factor ): Set the factor to
apply to doppler effects on 3D sounds. Set to zero to turn off pitch
shifting caused by the Doppler Effect. The higher the value, the more
pronounced the Doppler Effect will be.
float sfxGetRolloffFactor(): Get the scale factor
applied to distance attenuation curves of 3D sounds in the logarithmic
distance model. Default is taken from "$pref::SFX::rolloffFactor". If
unset, default is 1.0, i.e. no scaling.
sfxSetRolloffFactor( float factor ): Set the scale
factor to apply to distance attenuation curves of 3D sounds in the
logarithmic distance model. Values greater than 1 cause volume to decrease
faster with distance where as values less than 1 cause volume to decrease
slower. A value of 0 will disable distance attenuation. Factor must be
greater or equal to 0.
Playback
SFXSource sfxCreateSource( SFXProfile profile [, float x, float y, float z ] ):
Create a new SFXSource that plays the given profile. If coordinates are
given, the source will be placed at the given position (though only if
the given profile contains a 3D sound). The source will initially be in
"stopped" state. If the sound contained in the profile has not yet been
loaded, this will be initiated in the process.
SFXSource sfxCreateSource( SFXDescription description, string filename [, float x, float y, float z ] ):
Create a temporary SFXProfile using the given description and filename
and then create a new SFXSource that plays the profile. If coordinates
are given, the source will be placed at the given position (though only
if the description has is3D set to true). The source will initially be in "stopped" state. Loading of the given file will be initiated in the process.
SFXSource sfxPlay( SFXSource source ): Start playing the
given SFXSource. This is the same as calling the play() method on the
SFXSource directly. Returns source or null on failure.
SFXSource sfxPlay( SFXProfile profile [, float x, float y, float z ] ): This is the same as calling sfxPlayOnce() with the given parameters.
SFXSource sfxPlayOnce(SFXProfile profile [, float x, float y, float z ] ):
Create a play-once SFXSource using the given profile and start playing
it. The SFXSource will only be valid for as long as playback is
running. If coordinates are given, the SFXSource will be placed at the
specified position (only if the profile contains a 3D sound). The
SFXSource will return in "playing" state. Returns a handle for the
temporary SFXSource or null on failure.
SFXSource sfxPlayOnce( SFXDescription description, string filename [, float x, float y, float z ] ):
Creates a temporary SFXProfile with the given description and filename
and then instantiates a new play-once SFXSource playing the profile.
The SFXSource will be valid only for as long as playback is running. If
coordinates are given, the SFXSource will be placed at the specified
position (only if the given SFXDescription has is3D set to true). The SFXSource will return in "playing" state. Returns a handle for the temporary SFXSource or null on failure.
sfxStop( SFXSource source ): Stop playing the given SFXSource. This is the same as calling the stop() method directly on the SFXSource.
sfxStopAll(): Call stop() on all SFXSources that are currently playing.
Misc
sfxDumpSources(): Print a detailed rundown on all currently instantiated SFXSources to the console.
Conclusion
This interface guide covers everything you will need to know about
using Torque 3D's stock sound effect system (SFX). Continue reading to
learn more about the SFX Internals. CLICK HERE to continue.