<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://community.bistudio.com/wiki?action=history&amp;feed=atom&amp;title=Arma_Reforger%3AAudio%3A_Sound_Components</id>
	<title>Arma Reforger:Audio: Sound Components - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://community.bistudio.com/wiki?action=history&amp;feed=atom&amp;title=Arma_Reforger%3AAudio%3A_Sound_Components"/>
	<link rel="alternate" type="text/html" href="https://community.bistudio.com/wiki?title=Arma_Reforger:Audio:_Sound_Components&amp;action=history"/>
	<updated>2026-04-21T06:00:04Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.0</generator>
	<entry>
		<id>https://community.bistudio.com/wiki?title=Arma_Reforger:Audio:_Sound_Components&amp;diff=370934&amp;oldid=prev</id>
		<title>Lou Montana: Text replacement - &quot;\{\{GameCategory\|armaR\|Modding\|(Guidelines|Tutorials)\|([^=&amp;#8629;]*)\}\}&quot; to &quot;{{GameCategory|armaR|Modding|$2|$1}}&quot;</title>
		<link rel="alternate" type="text/html" href="https://community.bistudio.com/wiki?title=Arma_Reforger:Audio:_Sound_Components&amp;diff=370934&amp;oldid=prev"/>
		<updated>2025-02-26T12:31:52Z</updated>

		<summary type="html">&lt;p&gt;Text replacement - &amp;quot;\{\{GameCategory\|armaR\|Modding\|(Guidelines|Tutorials)\|([^=↵]*)\}\}&amp;quot; to &amp;quot;{{GameCategory|armaR|Modding|$2|$1}}&amp;quot;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:31, 26 February 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l177&quot;&gt;Line 177:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 177:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{GameCategory|armaR|Modding|Guidelines&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|Audio&lt;/del&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{GameCategory|armaR|Modding&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|Audio&lt;/ins&gt;|Guidelines}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Lou Montana</name></author>
	</entry>
	<entry>
		<id>https://community.bistudio.com/wiki?title=Arma_Reforger:Audio:_Sound_Components&amp;diff=370865&amp;oldid=prev</id>
		<title>Lou Montana: Page creation</title>
		<link rel="alternate" type="text/html" href="https://community.bistudio.com/wiki?title=Arma_Reforger:Audio:_Sound_Components&amp;diff=370865&amp;oldid=prev"/>
		<updated>2025-02-20T15:44:34Z</updated>

		<summary type="html">&lt;p&gt;Page creation&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{TOC|side}}&lt;br /&gt;
At the most basic level, Sound Components are Components that give an Entity the ability to play sounds defined in ACP files.&lt;br /&gt;
The ACP files available to the Entity are defined in the Filenames section of its SoundComponent. &lt;br /&gt;
&lt;br /&gt;
Via GameCode or a Script, the {{Link/Enfusion|armaR|SoundComponent}} can receive the instruction to play a Sound. This instruction will contain a string with the desired Sound Event Name.&lt;br /&gt;
The SoundComponent will then search through its connected ACP files and play the first Sound whose name matches the Sound Event Name provided by the instruction.&lt;br /&gt;
&lt;br /&gt;
There are different SoundComponents: Some are generic, like the {{Link/Enfusion|armaR|BaseSoundComponent}} and {{Link/Enfusion|armaR|SimpleSoundComponent}},&lt;br /&gt;
and some are meant to be used for a specific purpose, e.g the {{Link/Enfusion|armaR|WeaponSoundComponent}} or {{Link/Enfusion|armaR|VehicleSoundComponent}}.&lt;br /&gt;
&lt;br /&gt;
The main reason for having multiple different SoundComponents is performance.&lt;br /&gt;
More &amp;quot;advanced&amp;quot; SoundComponents perform a variety of checks and calculations that might not be needed in every use case, such as interior detection or listening in on animations for sound events.&lt;br /&gt;
&lt;br /&gt;
It is therefore recommended to familiarise oneself with the different SoundComponent types and use that one that matches the required featureset the closest.&lt;br /&gt;
&lt;br /&gt;
The most common feature of &amp;quot;advanced&amp;quot; SoundComponent variations is it to read Signal values from an Entity's SignalsManagerComponent as well as the Gameworld's {{Link/Enfusion|armaR|GameSignalsManager}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SoundComponent Variants ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable align-center-col-2 align-center-col-3 align-center-col-4 align-center-col-5 align-center-col-6&amp;quot;&lt;br /&gt;
! SoundComponent Type&lt;br /&gt;
! Dynamic Simulation&lt;br /&gt;
! Trigger Update&lt;br /&gt;
! Can read Signals from Signals Manager&lt;br /&gt;
! Sound position's dynamic update&lt;br /&gt;
! Listen to animation events&lt;br /&gt;
! Dedicated features&lt;br /&gt;
|-&lt;br /&gt;
| {{Link/Enfusion|armaR|BaseSoundComponent}}&lt;br /&gt;
| {{Icon|unchecked}}&lt;br /&gt;
| {{Icon|checked}}&amp;lt;br&amp;gt;but must be called manually via UpdateTrigger&lt;br /&gt;
| {{Icon|unchecked}}&lt;br /&gt;
| {{Icon|unchecked}}&lt;br /&gt;
| {{Icon|unchecked}}&lt;br /&gt;
| {{n/a}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Link/Enfusion|armaR|SimpleSoundComponent}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&amp;lt;br&amp;gt;but must be called manually via UpdateTrigger&lt;br /&gt;
| {{Icon|unchecked}}&lt;br /&gt;
| {{Icon|unchecked}}&amp;lt;br&amp;gt;but UpdateSoundJob is called when any of assigned {{hl|.acp}}s is in the audibility range.&lt;br /&gt;
| {{Icon|unchecked}}&lt;br /&gt;
| {{n/a}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Link/Enfusion|armaR|SoundComponent}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
|&lt;br /&gt;
* Reads local signals from the SignalsManagerComponent.&lt;br /&gt;
* Reads Global Signals from the GameSignalsManager.&lt;br /&gt;
* Listens to Animation Events (BaseItemAnimationComponent or BaseAnimPhysComponent).&lt;br /&gt;
* EOnFrame flag enables calling UpdateSoundJob() from entity EOnFrame.&lt;br /&gt;
* Manages sound transformation offset using bone, vector offset, and sound points.&lt;br /&gt;
* Manages Component activation based of the presence of playing sound.&lt;br /&gt;
* Updates sound position to entity position.&lt;br /&gt;
* Updates triggers for sound nodes.&lt;br /&gt;
|-&lt;br /&gt;
| {{Link/Enfusion|armaR|WeaponSoundComponent}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
|&lt;br /&gt;
* Manages Signals for the SOUND_SHOT Event when using speed of sound simulation. On a shot event, a signal snapshot with current signal values is created and this snapshot is used once shot sound is triggered.&lt;br /&gt;
|-&lt;br /&gt;
| {{Link/Enfusion|armaR|CharacterSoundComponent}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
|&lt;br /&gt;
* Updates Surface signals for footstep Eound Events. An Animation Event is considered as Footstep Event if its bone name contains the &amp;quot;foot&amp;quot; string.&lt;br /&gt;
|-&lt;br /&gt;
| {{Link/Enfusion|armaR|VehicleSoundComponent}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
|&lt;br /&gt;
* Dedicated slots for wheel sound. Sound position offset is defined directly on the component. The Surface signal for each wheel is tied to this position.&lt;br /&gt;
|-&lt;br /&gt;
| {{Link/Enfusion|armaR|CommunicationSoundComponent}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
| {{Icon|checked}}&lt;br /&gt;
|&lt;br /&gt;
* See {{Link|#CommunicationSoundComponent}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
&lt;br /&gt;
=== CommunicationSoundComponent ===&lt;br /&gt;
&lt;br /&gt;
For purposes of the communication protocol, the dedicated Communication Sound Component was created. Simplified, this component have two main purposes.&lt;br /&gt;
Based on input signals, it is able to construct a sentence that is represented as&lt;br /&gt;
* a list of {{hl|.wav}} files that the audio system can play in sequence&lt;br /&gt;
* a string array that is used for displaying subtitles.&lt;br /&gt;
&lt;br /&gt;
The sentence definition is done in one place in audio project, so it should keep the whole configuration and maintenance of the system manageable.&lt;br /&gt;
&lt;br /&gt;
==== Animation Sound Priority Ranges ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Range&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;lt; 0'''&lt;br /&gt;
| Discarded - Negative values are not allowed and used by the priority queue.&lt;br /&gt;
|-&lt;br /&gt;
| '''0..99'''&lt;br /&gt;
| Queued if current playing sound has a higher priority&lt;br /&gt;
|-&lt;br /&gt;
| '''100..199'''&lt;br /&gt;
| Discarded if current playing sound has a higher priority&lt;br /&gt;
&lt;br /&gt;
100 = IgnoreQueue, 1XX = Priority (Example: 199 = Priority Queue with 99 Priority)&lt;br /&gt;
|-&lt;br /&gt;
| '''&amp;gt; 199'''&lt;br /&gt;
| Discarded - Values higher than 199 are not allowed and used by the priority queue.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SCR_AmbientSoundComponent ===&lt;br /&gt;
&lt;br /&gt;
==== HandleQueryEntities() ====&lt;br /&gt;
&lt;br /&gt;
* By default {{Link/Enfusion|armaR|SCR_AmbientSoundsComponent}} performs sphere queries over entities and stores the output into appropriate data structures. Those can be then used by any configured SCR_AmbientSoundsEffects.&lt;br /&gt;
* From script, we can access counts of the {{Link/Enfusion|armaR|EQueryType}} types&lt;br /&gt;
* On engine side references to entities of the following types are stored. There is no script API to access them directly.&lt;br /&gt;
&lt;br /&gt;
==== Looped Sounds System ====&lt;br /&gt;
* System for playing looped sounds with posibility to create multiple instances of the same event and without need for a signal for each sound instance&lt;br /&gt;
* System keeps a pool of triggered sounds and check if, they are playing or tries to trigger them.&lt;br /&gt;
* Used only by insects particles&lt;br /&gt;
* API: see {{Link/Enfusion|armaR|SCR_AmbientSoundsComponent}}&amp;lt;enforce&amp;gt;&lt;br /&gt;
SCR_AudioHandleLoop SoundEventLooped(string soundEvent, vector transformation[4])&lt;br /&gt;
void TerminateLooped(SCR_AudioHandleLoop audioHandleLoop)&lt;br /&gt;
void UpdateLoopedSounds()&lt;br /&gt;
&amp;lt;/enforce&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Activeness ==&lt;br /&gt;
&lt;br /&gt;
For certain features like position update, or trigger functionality, the {{hl|SoundComponent}} needs to be active.&lt;br /&gt;
That means that the {{hl|SoundComponent}} is added to the {{Link/Enfusion|armaR|SndSystem}} and &amp;lt;enforce inline&amp;gt;SoundComponent.UpdateSoundJob()&amp;lt;/enforce&amp;gt; is called.&lt;br /&gt;
&lt;br /&gt;
=== Rules ===&lt;br /&gt;
&lt;br /&gt;
* If any sound is playing on the SoundComponent, it is added to SndSystem. When the sound finishes playing, the SoundComponent is removed from SndSystem, unless additional flags on the SoundComponent are used.&lt;br /&gt;
* If any ACP on the SoundComponent uses triggers, the SoundComponent is always automatically added to SndSystem. There it is handled by the Dynamic Simulation, meaning the SndSystem checks the SoundComponent's distance from the listener, and if the listener is in the audible distance of the triggered sound with the largest audible range, it will start calling &amp;lt;enforce inline&amp;gt;SoundComponent.UpdateSoundJob()&amp;lt;/enforce&amp;gt;&lt;br /&gt;
* Distance management flag enables addition of any SoundComponent to Dynamic simulation on SndSystem. In that case largest audible distance (evaluated from both triggered and not-triggered events is used).&lt;br /&gt;
* Include Inactive flag makes sure, that SoundComponent is not removed from SndSystem when the entity is deactivated.&lt;br /&gt;
** If there is a trigger sound on the component and you are not sure, if EOnActivate/EOnDeactivate are called on the entity, set to true.&lt;br /&gt;
** If there is a trigger sound on the component and you know EOnActivate/EOnDeactivate events are called and you want to use them to improve SndSystem performance, set to false.&lt;br /&gt;
* If &amp;lt;enforce inline&amp;gt;SoundComponent.UpdateSoundJob()&amp;lt;/enforce&amp;gt; is supposed to be always called, no matter how far is listener is from the component, use OnFrameUpdate flag&lt;br /&gt;
&lt;br /&gt;
=== OnPostInit SndSystem Components ===&lt;br /&gt;
&lt;br /&gt;
Components are added to {{hl|SndSystem}} in &amp;lt;enforce inline&amp;gt;OnPostInit()&amp;lt;/enforce&amp;gt; if one of the following:&lt;br /&gt;
* any ACP on the SoundComponent uses triggers&lt;br /&gt;
* OnFrameUpdate is set to true&lt;br /&gt;
* Distance management is set to true&lt;br /&gt;
&lt;br /&gt;
; EOnActivate&lt;br /&gt;
: SoundComponent is added to SndSystem&lt;br /&gt;
&lt;br /&gt;
; EOnDeactivate&lt;br /&gt;
: SoundComponent is removed from SndSystem unless '''Include Inactive''' is set to true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{GameCategory|armaR|Modding|Guidelines|Audio}}&lt;/div&gt;</summary>
		<author><name>Lou Montana</name></author>
	</entry>
</feed>