Skip to content

Commit

Permalink
🔧 Audio: Eliminated dead "SoundLink" mechanism.
Browse files Browse the repository at this point in the history
Aside of "trigger source", "pitch modulation source" and "gain modulation source", a soundscript (in code) had 2 more attributes: "sound link type" and "linked item ID". This was apparently designed for unfinished feature 'soundsources3', which was described in truckfile reference on the wiki (I removed it later).

The only "sound link type" ever used was SL_COMMAND which was hardcoded against these soundscript names: "tracks/linked/default_command/extend" and "tracks/linked/default_command/retract". For both of them, one instance would be created for every `command` (=a player-controlled hydro in RoR jargon). These soundscripts were never added as defaults and never documented, so I very much doubt anyone ever used them.

The respective trigger, "linked_command" could be specified in soundscript file, but there was no way to specify command ID, so it was useless. Removed.

** COMMANDS2 / PLAY_SOUNDS option **

During analyzing the code, I stubmbled upon a feature added by Ulteq in 2016: RigsOfRods#791.
The demand was for a commands2 flag to selectively mute the built-in hydropump sound (at least that's the way I understand it in retrospect). Until now, it only silenced the SL_COMMAND sounds (which were probably never used). I changed it to fullfill it's original purpose (hopefully).
  • Loading branch information
ohlidalp committed Mar 28, 2017
1 parent 13da867 commit 25914bd
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 136 deletions.
93 changes: 41 additions & 52 deletions source/main/audio/SoundScriptManager.cpp
Expand Up @@ -98,18 +98,18 @@ SoundScriptManager::SoundScriptManager() :
ResourceGroupManager::getSingleton()._registerScriptLoader(this);
}

void SoundScriptManager::trigOnce(Beam* truck, int trig, int linkType, int linkItemID)
void SoundScriptManager::trigOnce(Beam* truck, int trig)
{
if (disabled)
return;

if (truck)
{
trigOnce(truck->trucknum, trig, linkType, linkItemID);
this->trigOnce(truck->trucknum, trig);
}
}

void SoundScriptManager::trigOnce(int truck, int trig, int linkType, int linkItemID)
void SoundScriptManager::trigOnce(int truck, int trig)
{
if (disabled)
return;
Expand All @@ -119,157 +119,148 @@ void SoundScriptManager::trigOnce(int truck, int trig, int linkType, int linkIte
// cycle through all instance groups
SoundScriptInstance* inst = trigs[trig + i * SS_MAX_TRIG];

if (inst && inst->truck == truck && inst->sound_link_type == linkType && inst->sound_link_item_id == linkItemID)
if (inst && inst->truck_id == truck)
{
inst->runOnce();
}
}
}

void SoundScriptManager::trigStart(Beam* truck, int trig, int linkType, int linkItemID)
void SoundScriptManager::trigStart(Beam* truck, int trig)
{
if (disabled)
return;

if (truck)
{
trigStart(truck->trucknum, trig, linkType, linkItemID);
this->trigStart(truck->trucknum, trig);
}
}

void SoundScriptManager::trigStart(int truck, int trig, int linkType, int linkItemID)
void SoundScriptManager::trigStart(int truck, int trig)
{
if (disabled)
return;
if (getTrigState(truck, trig, linkType, linkItemID))
if (this->getTrigState(truck, trig))
return;

state_map[linkType][linkItemID][truck][trig] = true;
state_map[truck][trig] = true;

for (int i = 0; i < free_trigs[trig]; i++)
{
SoundScriptInstance* inst = trigs[trig + i * SS_MAX_TRIG];

if (inst && inst->truck == truck && inst->sound_link_type == linkType && inst->sound_link_item_id == linkItemID)
if (inst && inst->truck_id == truck)
{
inst->start();
}
}
}

void SoundScriptManager::trigStop(Beam* truck, int trig, int linkType, int linkItemID)
void SoundScriptManager::trigStop(Beam* truck, int trig)
{
if (disabled)
return;

if (truck)
{
trigStop(truck->trucknum, trig, linkType, linkItemID);
this->trigStop(truck->trucknum, trig);
}
}

void SoundScriptManager::trigStop(int truck, int trig, int linkType, int linkItemID)
void SoundScriptManager::trigStop(int truck, int trig)
{
if (disabled)
return;
if (!getTrigState(truck, trig, linkType, linkItemID))
if (!this->getTrigState(truck, trig))
return;

state_map[linkType][linkItemID][truck][trig] = false;
state_map[truck][trig] = false;
for (int i = 0; i < free_trigs[trig]; i++)
{
SoundScriptInstance* inst = trigs[trig + i * SS_MAX_TRIG];

if (inst && inst->truck == truck && inst->sound_link_type == linkType && inst->sound_link_item_id == linkItemID)
if (inst && inst->truck_id == truck)
{
inst->stop();
}
}
}

void SoundScriptManager::trigKill(Beam* truck, int trig, int linkType, int linkItemID)
void SoundScriptManager::trigKill(int truck, int trig)
{
if (disabled)
return;

if (truck)
{
trigKill(truck->trucknum, trig, linkType, linkItemID);
}
}

void SoundScriptManager::trigKill(int truck, int trig, int linkType, int linkItemID)
{
if (disabled)
return;
if (!getTrigState(truck, trig, linkType, linkItemID))
if (!this->getTrigState(truck, trig))
return;

state_map[linkType][linkItemID][truck][trig] = false;
state_map[truck][trig] = false;
for (int i = 0; i < free_trigs[trig]; i++)
{
SoundScriptInstance* inst = trigs[trig + i * SS_MAX_TRIG];

if (inst && inst->truck == truck && inst->sound_link_type == linkType && inst->sound_link_item_id == linkItemID)
if (inst && inst->truck_id == truck)
{
inst->kill();
}
}
}

void SoundScriptManager::trigToggle(Beam* truck, int trig, int linkType, int linkItemID)
void SoundScriptManager::trigToggle(Beam* truck, int trig)
{
if (disabled)
return;

if (truck)
{
trigToggle(truck->trucknum, trig, linkType, linkItemID);
this->trigToggle(truck->trucknum, trig);
}
}

void SoundScriptManager::trigToggle(int truck, int trig, int linkType, int linkItemID)
void SoundScriptManager::trigToggle(int truck, int trig)
{
if (disabled)
return;

if (getTrigState(truck, trig, linkType, linkItemID))
trigStop(truck, trig, linkType, linkItemID);
if (this->getTrigState(truck, trig))
this->trigStop(truck, trig);
else
trigStart(truck, trig, linkType, linkItemID);
this->trigStart(truck, trig);
}

bool SoundScriptManager::getTrigState(Beam* truck, int trig, int linkType, int linkItemID)
bool SoundScriptManager::getTrigState(Beam* truck, int trig)
{
if (disabled)
return false;

if (truck)
return getTrigState(truck->trucknum, trig, linkType, linkItemID);
return this->getTrigState(truck->trucknum, trig);
else
return false;
}

bool SoundScriptManager::getTrigState(int truck, int trig, int linkType, int linkItemID)
bool SoundScriptManager::getTrigState(int truck, int trig)
{
if (disabled)
return false;

return state_map[linkType][linkItemID][truck][trig];
return state_map[truck][trig];
}

void SoundScriptManager::modulate(Beam* truck, int mod, float value, int linkType, int linkItemID)
void SoundScriptManager::modulate(Beam* truck, int mod, float value)
{
if (disabled)
return;

if (truck)
{
modulate(truck->trucknum, mod, value, linkType, linkItemID);
this->modulate(truck->trucknum, mod, value);
}
}

void SoundScriptManager::modulate(int truck, int mod, float value, int linkType, int linkItemID)
// TIGHT-LOOP
// -- BeamEngine
void SoundScriptManager::modulate(int truck, int mod, float value)
{
if (disabled)
return;
Expand All @@ -280,7 +271,7 @@ void SoundScriptManager::modulate(int truck, int mod, float value, int linkType,
for (int i = 0; i < free_gains[mod]; i++)
{
SoundScriptInstance* inst = gains[mod + i * SS_MAX_MOD];
if (inst && inst->truck == truck && inst->sound_link_type == linkType && inst->sound_link_item_id == linkItemID)
if (inst && inst->truck_id == truck)
{
// this one requires modulation
float gain = value * value * inst->templ->gain_square + value * inst->templ->gain_multiplier + inst->templ->gain_offset;
Expand All @@ -293,7 +284,7 @@ void SoundScriptManager::modulate(int truck, int mod, float value, int linkType,
for (int i = 0; i < free_pitches[mod]; i++)
{
SoundScriptInstance* inst = pitches[mod + i * SS_MAX_MOD];
if (inst && inst->truck == truck && inst->sound_link_type == linkType && inst->sound_link_item_id == linkItemID)
if (inst && inst->truck_id == truck)
{
// this one requires modulation
float pitch = value * value * inst->templ->pitch_square + value * inst->templ->pitch_multiplier + inst->templ->pitch_offset;
Expand Down Expand Up @@ -361,7 +352,7 @@ void SoundScriptManager::clearNonBaseTemplates()
}
}

SoundScriptInstance* SoundScriptManager::createInstance(Ogre::String templatename, int truck, Ogre::SceneNode* toAttach, int soundLinkType, int soundLinkItemId)
SoundScriptInstance* SoundScriptManager::createInstance(Ogre::String templatename, int truck, Ogre::SceneNode* toAttach)
{
//first, search template
SoundScriptTemplate* templ = NULL;
Expand All @@ -386,7 +377,7 @@ SoundScriptInstance* SoundScriptManager::createInstance(Ogre::String templatenam
return NULL; // reached limit!
}

SoundScriptInstance* inst = new SoundScriptInstance(truck, templ, sound_manager, templ->file_name + "-" + TOSTRING(truck) + "-" + TOSTRING(instance_counter), soundLinkType, soundLinkItemId);
SoundScriptInstance* inst = new SoundScriptInstance(truck, templ, sound_manager, templ->file_name + "-" + TOSTRING(truck) + "-" + TOSTRING(instance_counter));
instance_counter++;

// register to lookup tables
Expand Down Expand Up @@ -1031,12 +1022,10 @@ int SoundScriptTemplate::parseModulation(String str)

//====================================================================

SoundScriptInstance::SoundScriptInstance(int truck, SoundScriptTemplate* templ, SoundManager* sound_manager, String instancename, int soundLinkType, int soundLinkItemId) :
truck(truck)
SoundScriptInstance::SoundScriptInstance(int truck, SoundScriptTemplate* templ, SoundManager* sound_manager, String instancename) :
truck_id(truck)
, templ(templ)
, sound_manager(sound_manager)
, sound_link_type(soundLinkType)
, sound_link_item_id(soundLinkItemId)
, start_sound(NULL)
, start_sound_pitchgain(0.0f)
, stop_sound(NULL)
Expand Down
63 changes: 21 additions & 42 deletions source/main/audio/SoundScriptManager.h
Expand Up @@ -139,24 +139,6 @@ enum ModulationSources {
SS_MAX_MOD
};

enum SoundLinkTypes {
SL_DEFAULT,
SL_COMMAND,
SL_HYDRO,
SL_COLLISION,
SL_SHOCKS,
SL_BRAKES,
SL_ROPES,
SL_TIES,
SL_PARTICLES,
SL_AXLES,
SL_FLARES,
SL_FLEXBODIES,
SL_EXHAUSTS,
SL_VIDEOCAMERA,
SL_MAX
};

class Sound;
class SoundManager;

Expand Down Expand Up @@ -210,11 +192,9 @@ class SoundScriptInstance : public ZeroedMemoryAllocator

public:

SoundScriptInstance(int truck, SoundScriptTemplate* templ, SoundManager* sm, Ogre::String instancename, int soundLinkType=SL_DEFAULT, int soundLinkItemId=-1);
SoundScriptInstance(int truck, SoundScriptTemplate* templ, SoundManager* sm, Ogre::String instancename);
void runOnce();
void setEnabled(bool e);
void setGain(float value);
void setPitch(float value);
void setPosition(Ogre::Vector3 pos, Ogre::Vector3 velocity);
void start();
void stop();
Expand All @@ -225,6 +205,9 @@ class SoundScriptInstance : public ZeroedMemoryAllocator

private:

void setGain(float value); // Used by SSI::ctor(), SSM::modulate(), SSI::setPitch()
void setPitch(float value); // Used by SSI::ctor(), SSM::modulate()

float pitchgain_cutoff(float sourcepitch, float targetpitch);

SoundScriptTemplate* templ;
Expand All @@ -237,9 +220,7 @@ class SoundScriptInstance : public ZeroedMemoryAllocator
float sounds_pitchgain[MAX_SOUNDS_PER_SCRIPT];
float lastgain;

int truck; // holds the number of the truck this is for. important
int sound_link_type; // holds the SL_ type this is bound to
int sound_link_item_id; // holds the item number this is for
int truck_id;
};

class SoundScriptManager : public Ogre::ScriptLoader, public RoRSingleton<SoundScriptManager>, public ZeroedMemoryAllocator
Expand All @@ -253,24 +234,21 @@ class SoundScriptManager : public Ogre::ScriptLoader, public RoRSingleton<SoundS
void parseScript(Ogre::DataStreamPtr& stream, const Ogre::String& groupName);
Ogre::Real getLoadingOrder(void) const;

SoundScriptInstance* createInstance(Ogre::String templatename, int truck, Ogre::SceneNode *toAttach=NULL, int soundLinkType=SL_DEFAULT, int soundLinkItemId=-1);
SoundScriptInstance* createInstance(Ogre::String templatename, int truck, Ogre::SceneNode *toAttach=NULL);
void clearNonBaseTemplates();

// functions
void trigOnce (int truck, int trig, int linkType = SL_DEFAULT, int linkItemID=-1);
void trigOnce (Beam *b, int trig, int linkType = SL_DEFAULT, int linkItemID=-1);
void trigStart (int truck, int trig, int linkType = SL_DEFAULT, int linkItemID=-1);
void trigStart (Beam *b, int trig, int linkType = SL_DEFAULT, int linkItemID=-1);
void trigStop (int truck, int trig, int linkType = SL_DEFAULT, int linkItemID=-1);
void trigStop (Beam *b, int trig, int linkType = SL_DEFAULT, int linkItemID=-1);
void trigToggle (int truck, int trig, int linkType = SL_DEFAULT, int linkItemID=-1);
void trigToggle (Beam *b, int trig, int linkType = SL_DEFAULT, int linkItemID=-1);
void trigKill (int truck, int trig, int linkType = SL_DEFAULT, int linkItemID = -1);
void trigKill (Beam *b, int trig, int linkType = SL_DEFAULT, int linkItemID = -1);
bool getTrigState(int truck, int trig, int linkType = SL_DEFAULT, int linkItemID=-1);
bool getTrigState(Beam *b, int trig, int linkType = SL_DEFAULT, int linkItemID=-1);
void modulate (int truck, int mod, float value, int linkType = SL_DEFAULT, int linkItemID=-1);
void modulate (Beam *b, int mod, float value, int linkType = SL_DEFAULT, int linkItemID=-1);
void trigOnce (int truck, int trig);
void trigOnce (Beam *b, int trig); // Called 1x
void trigStart (int truck, int trig);
void trigStart (Beam *b, int trig);
void trigStop (int truck, int trig);
void trigStop (Beam *b, int trig);
void trigToggle (Beam *b, int trig); // Called 1x (SS_TRIG_HORN)
void trigKill (int truck, int trig); // Called 1x (SS_TRIG_MAIN_MENU)
bool getTrigState(int truck, int trig); // Called 1x (SS_TRIG_HORN)
void modulate (int truck, int mod, float value);
void modulate (Beam *b, int mod, float value);

void setEnabled(bool state);

Expand All @@ -283,6 +261,8 @@ class SoundScriptManager : public Ogre::ScriptLoader, public RoRSingleton<SoundS

SoundScriptTemplate* createTemplate(Ogre::String name, Ogre::String groupname, Ogre::String filename);
void skipToNextCloseBrace(Ogre::DataStreamPtr& chunk);
void trigToggle (int truck, int trig);
bool getTrigState(Beam *b, int trig);
void skipToNextOpenBrace(Ogre::DataStreamPtr& chunk);

bool disabled;
Expand All @@ -305,9 +285,8 @@ class SoundScriptManager : public Ogre::ScriptLoader, public RoRSingleton<SoundS
int free_gains[SS_MAX_MOD];
SoundScriptInstance *gains[SS_MAX_MOD * MAX_INSTANCES_PER_GROUP];

// state map
// soundLinks, soundItems, trucks, triggers
std::map <int, std::map <int, std::map <int, std::map <int, bool > > > > state_map;
// state map: [trucks][triggers]
std::map <int, std::map <int, bool > > state_map;

SoundManager* sound_manager;
};
Expand Down

0 comments on commit 25914bd

Please sign in to comment.