Skip to content
This repository was archived by the owner on Jan 5, 2024. It is now read-only.

Commit 5bedacc

Browse files
committed
basic bus routing, panningstrengthmultiplier, properly use fmod_2d
see changelog for deets
1 parent 28b3ae0 commit 5bedacc

File tree

7 files changed

+186
-105
lines changed

7 files changed

+186
-105
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
7070

7171
- New `SLTerrain` INI property `OrbitDirection`, which defines which direction is considered to be orbit, for the sake of brain-path-to-orbit, dropship spawn/return location, etc. Can be any of `Up`, `Down`, `Left` or `Right`. Defaults to `Up`.
7272

73+
- New FMOD and SoundContainer features:
74+
The game is now divided into SFX, UI, and Music busses which all route into the Master bus.
75+
The SFX bus has compression added for a better listening experience, and a safety volume limiter has been added to the Master bus.
76+
Aside from volume being attenuated, sounds will now also be lowpass filtered as distance increases.
77+
New `SoundContainer` INI and Lua (R/W) property `BusRouting`, which denotes which bus the SoundContainer routes to. Available busses: `SFX, UI, Music`. Defaults to `SFX`.
78+
`Enum` binding for `SoundContainer.BusRouting`: `SFX = 0, UI = 1, MUSIC = 2`.
79+
New `SoundContainer` INI and Lua (R/W) property `PanningStrengthMultiplier`, which will multiply the strength of 3D panning. This can be used to achieve for example a psuedo-Immobile effect where attenuation effects are still applied but the sound does not move from the center. Strongly recommended to keep between 0.0 and 1.0.
80+
7381
</details>
7482

7583
<details><summary><b>Changed</b></summary>

Entities/SoundContainer.cpp

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ namespace RTE {
1111
{"Ignore Play", SoundContainer::SoundOverlapMode::IGNORE_PLAY}
1212
};
1313

14+
const std::unordered_map<std::string, SoundContainer::BusRouting> SoundContainer::c_BusRoutingMap = {
15+
{"SFX", SoundContainer::BusRouting::SFX},
16+
{"UI", SoundContainer::BusRouting::UI},
17+
{"Music", SoundContainer::BusRouting::MUSIC}
18+
};
19+
1420
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1521

1622
void SoundContainer::Clear() {
@@ -19,8 +25,10 @@ namespace RTE {
1925
m_PlayingChannels.clear();
2026
m_SoundOverlapMode = SoundOverlapMode::OVERLAP;
2127

28+
m_BusRouting = BusRouting::SFX;
2229
m_Immobile = false;
2330
m_AttenuationStartDistance = c_DefaultAttenuationStartDistance;
31+
m_PanningStrengthMultiplier = 1.0F;
2432
m_Loops = 0;
2533
m_SoundPropertiesUpToDate = false;
2634

@@ -43,8 +51,10 @@ namespace RTE {
4351
m_PlayingChannels.clear();
4452
m_SoundOverlapMode = reference.m_SoundOverlapMode;
4553

54+
m_BusRouting = reference.m_BusRouting;
4655
m_Immobile = reference.m_Immobile;
4756
m_AttenuationStartDistance = reference.m_AttenuationStartDistance;
57+
m_PanningStrengthMultiplier = reference.m_PanningStrengthMultiplier;
4858
m_Loops = reference.m_Loops;
4959

5060
m_Priority = reference.m_Priority;
@@ -83,8 +93,21 @@ namespace RTE {
8393
}
8494
}
8595
});
96+
MatchProperty("BusRouting", {
97+
std::string busRoutingString = reader.ReadPropValue();
98+
if (c_BusRoutingMap.find(busRoutingString) != c_BusRoutingMap.end()) {
99+
m_BusRouting = c_BusRoutingMap.find(busRoutingString)->second;
100+
} else {
101+
try {
102+
m_BusRouting = static_cast<BusRouting>(std::stoi(busRoutingString));
103+
} catch (const std::exception &) {
104+
reader.ReportError("Tried to route to non-existent sound bus " + busRoutingString);
105+
}
106+
}
107+
});
86108
MatchProperty("Immobile", { reader >> m_Immobile; });
87109
MatchProperty("AttenuationStartDistance", { reader >> m_AttenuationStartDistance; });
110+
MatchProperty("PanningStrengthMultiplier", { reader >> m_PanningStrengthMultiplier; });
88111
MatchProperty("LoopSetting", { reader >> m_Loops; });
89112
MatchProperty("Priority", {
90113
reader >> m_Priority;
@@ -100,7 +123,7 @@ namespace RTE {
100123
}
101124

102125
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
103-
126+
104127
int SoundContainer::Save(Writer &writer) const {
105128
Entity::Save(writer);
106129

@@ -117,11 +140,14 @@ namespace RTE {
117140
} else {
118141
RTEAbort("Tried to write invalid SoundOverlapMode when saving SoundContainer.");
119142
}
120-
143+
writer.NewProperty("BusRouting");
144+
writer << m_BusRouting;
121145
writer.NewProperty("Immobile");
122146
writer << m_Immobile;
123147
writer.NewProperty("AttenuationStartDistance");
124148
writer << m_AttenuationStartDistance;
149+
writer.NewProperty("PanningStrengthMultiplier");
150+
writer << m_PanningStrengthMultiplier;
125151
writer.NewProperty("LoopSetting");
126152
writer << m_Loops;
127153

@@ -216,7 +242,7 @@ namespace RTE {
216242
for (SoundSet::SoundData *soundData : flattenedSoundData) {
217243
FMOD_MODE soundMode = (m_Loops == 0) ? FMOD_LOOP_OFF : FMOD_LOOP_NORMAL;
218244
if (m_Immobile) {
219-
soundMode |= FMOD_3D_HEADRELATIVE;
245+
soundMode |= FMOD_2D;
220246
m_AttenuationStartDistance = c_SoundMaxAudibleDistance;
221247
} else if (g_AudioMan.GetSoundPanningEffectStrength() == 1.0F) {
222248
soundMode |= FMOD_3D_INVERSEROLLOFF;

Entities/SoundContainer.h

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@ namespace RTE {
1919
SerializableOverrideMethods;
2020
ClassInfoGetters;
2121

22+
/// <summary>
23+
/// The FMOD channelgroup/bus this sound routes through.
24+
/// </summary>
25+
enum BusRouting {
26+
SFX = 0, // Default diegetic bus for general game SFX.
27+
UI = 1, // Menu sounds and other things that shouldn't be affected by diegetic sound processing.
28+
MUSIC = 2 // Self-explanatory music bus.
29+
};
30+
2231
/// <summary>
2332
/// How the SoundContainer should behave when it tries to play again while already playing.
2433
/// </summary>
@@ -48,13 +57,14 @@ namespace RTE {
4857
int Create(const SoundContainer &reference);
4958

5059
/// <summary>
51-
/// Creates a SoundContainer and adds a sound, optionally setting whether it's immobile or affected by global pitch.
60+
/// Creates a SoundContainer and adds a sound, optionally setting immobility, being affected by global pitch, and bus routing.
5261
/// </summary>
5362
/// <param name="soundFilePath">The path to a sound to add to the first SoundSet of this SoundContainer.</param>
5463
/// <param name="immobile">Whether this SoundContainer's sounds will be treated as immobile, i.e. they won't be affected by 3D sound manipulation.</param>
5564
/// <param name="affectedByGlobalPitch">Whether this SoundContainer's sounds' frequency will be affected by the global pitch.</param>
65+
/// <param name="busRouting">Bus to route this sound to.</param>
5666
/// <returns>An error return value signaling success or any particular failure. Anything below 0 is an error signal.</returns>
57-
int Create(const std::string &soundFilePath, bool immobile = false, bool affectedByGlobalPitch = true) { m_TopLevelSoundSet.AddSound(soundFilePath, true); SetImmobile(immobile); SetAffectedByGlobalPitch(affectedByGlobalPitch); return 0; }
67+
int Create(const std::string &soundFilePath, bool immobile = false, bool affectedByGlobalPitch = true, BusRouting busRouting = BusRouting::SFX) { m_TopLevelSoundSet.AddSound(soundFilePath, true); SetImmobile(immobile); SetAffectedByGlobalPitch(affectedByGlobalPitch); SetBusRouting(busRouting); return 0; }
5868
#pragma endregion
5969

6070
#pragma region Destruction
@@ -157,6 +167,19 @@ namespace RTE {
157167
#pragma endregion
158168

159169
#pragma region Sound Property Getters and Setters
170+
171+
/// <summary>
172+
/// Gets the bus this sound routes to.
173+
/// </summary>
174+
/// <returns>The bus this sound routes to.</returns>
175+
BusRouting GetBusRouting() const { return m_BusRouting; }
176+
177+
/// <summary>
178+
/// Sets the bus this sound routes to.
179+
/// </summary>
180+
/// <param name="newBusRoute">The new bus for this sound to route to.</param>
181+
void SetBusRouting(BusRouting newBusRoute) { m_BusRouting = newBusRoute; }
182+
160183
/// <summary>
161184
/// Gets whether the sounds in this SoundContainer should be considered immobile, i.e. always play at the listener's position.
162185
/// </summary>
@@ -181,6 +204,18 @@ namespace RTE {
181204
/// <param name="attenuationStartDistance">The new attenuation start distance.</param>
182205
void SetAttenuationStartDistance(float attenuationStartDistance) { m_AttenuationStartDistance = (attenuationStartDistance < 0) ? c_DefaultAttenuationStartDistance : attenuationStartDistance; m_SoundPropertiesUpToDate = false; }
183206

207+
/// <summary>
208+
/// Gets the panning strength multiplier of this SoundContainer.
209+
/// </summary>
210+
/// <returns>A float with the panning strength multiplier.</returns>
211+
float GetPanningStrengthMultiplier() const { return m_PanningStrengthMultiplier; }
212+
213+
/// <summary>
214+
/// Sets the panning strength multiplier of this SoundContainer.
215+
/// </summary>
216+
/// <param name="panningStrengthMultiplier">The new panning strength multiplier.</param>
217+
void SetPanningStrengthMultiplier(float panningStrengthMultiplier) { m_PanningStrengthMultiplier = panningStrengthMultiplier; m_SoundPropertiesUpToDate = false; }
218+
184219
/// <summary>
185220
/// Gets the looping setting of this SoundContainer.
186221
/// </summary>
@@ -349,14 +384,18 @@ namespace RTE {
349384

350385
static Entity::ClassInfo m_sClass; //!< ClassInfo for this class.
351386
static const std::unordered_map<std::string, SoundOverlapMode> c_SoundOverlapModeMap; //!< A map of strings to SoundOverlapModes to support string parsing for the SoundOverlapMode enum. Populated in the implementing cpp file.
352-
387+
static const std::unordered_map<std::string, BusRouting> c_BusRoutingMap; //!< A map of strings to BusRoutings to support string parsing for the BusRouting enum. Populated in the implementing cpp file.
388+
353389
SoundSet m_TopLevelSoundSet; //The top level SoundSet that handles all SoundData and sub SoundSets in this SoundContainer.
354390

355391
std::unordered_set<int> m_PlayingChannels; //!< The channels this SoundContainer is currently using.
356392
SoundOverlapMode m_SoundOverlapMode; //!< The SoundOverlapMode for this SoundContainer, used to determine how it should handle overlapping play calls.
357-
358-
bool m_Immobile; //!< Whether this SoundContainer's sounds should be treated as immobile, i.e. not affected by 3D sound effects. Mostly used for GUI sounds and the like.
393+
394+
BusRouting m_BusRouting; //!< What bus this sound routes to.
395+
396+
bool m_Immobile; //!< Whether this SoundContainer's sounds should be treated as immobile, i.e. not affected by 3D sound effects.
359397
float m_AttenuationStartDistance; //!< The distance away from the AudioSystem listener to start attenuating this sound. Attenuation follows FMOD 3D Inverse roll-off model.
398+
float m_PanningStrengthMultiplier; //!< Multiplier for panning strength, 0.0 to 1.0.
360399
int m_Loops; //!< Number of loops (repeats) the SoundContainer's sounds should play when played. 0 means it plays once, -1 means it plays until stopped.
361400
bool m_SoundPropertiesUpToDate = false; //!< Whether this SoundContainer's sounds' modes and properties are up to date. Used primarily to handle discrepancies that can occur when loading from ini if the line ordering isn't ideal.
362401

GUI/GUISound.cpp

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -39,74 +39,74 @@ namespace RTE {
3939
void GUISound::Initialize() {
4040
// Interface sounds should not be pitched to reinforce the appearance of time decoupling between simulation and UI.
4141

42-
m_SplashSound.Create("Base.rte/Sounds/GUIs/MetaStart.flac", true, false);
42+
m_SplashSound.Create("Base.rte/Sounds/GUIs/MetaStart.flac", true, false, SoundContainer::BusRouting::UI);
4343

44-
m_EnterMenuSound.Create("Base.rte/Sounds/GUIs/MenuEnter.flac", true, false);
44+
m_EnterMenuSound.Create("Base.rte/Sounds/GUIs/MenuEnter.flac", true, false, SoundContainer::BusRouting::UI);
4545

46-
m_ExitMenuSound.Create("Base.rte/Sounds/GUIs/MenuExit1.flac", true, false);
46+
m_ExitMenuSound.Create("Base.rte/Sounds/GUIs/MenuExit1.flac", true, false, SoundContainer::BusRouting::UI);
4747
m_ExitMenuSound.GetTopLevelSoundSet().AddSound("Base.rte/Sounds/GUIs/MenuExit2.flac", true);
4848

49-
m_FocusChangeSound.Create("Base.rte/Sounds/GUIs/FocusChange.flac", true, false);
49+
m_FocusChangeSound.Create("Base.rte/Sounds/GUIs/FocusChange.flac", true, false, SoundContainer::BusRouting::UI);
5050

51-
m_SelectionChangeSound.Create("Base.rte/Sounds/GUIs/SelectionChange.flac", true, false);
51+
m_SelectionChangeSound.Create("Base.rte/Sounds/GUIs/SelectionChange.flac", true, false, SoundContainer::BusRouting::UI);
5252

53-
m_ItemChangeSound.Create("Base.rte/Sounds/GUIs/ItemChange.flac", true, false);
53+
m_ItemChangeSound.Create("Base.rte/Sounds/GUIs/ItemChange.flac", true, false, SoundContainer::BusRouting::UI);
5454

55-
m_ButtonPressSound.Create("Base.rte/Sounds/GUIs/ButtonPress.flac", true, false);
55+
m_ButtonPressSound.Create("Base.rte/Sounds/GUIs/ButtonPress.flac", true, false, SoundContainer::BusRouting::UI);
5656

57-
m_BackButtonPressSound.Create("Base.rte/Sounds/GUIs/BackButtonPress.flac", true, false);
57+
m_BackButtonPressSound.Create("Base.rte/Sounds/GUIs/BackButtonPress.flac", true, false, SoundContainer::BusRouting::UI);
5858

59-
m_ConfirmSound.Create("Base.rte/Sounds/GUIs/MenuExit1.flac", true, false);
59+
m_ConfirmSound.Create("Base.rte/Sounds/GUIs/MenuExit1.flac", true, false, SoundContainer::BusRouting::UI);
6060

61-
m_UserErrorSound.Create("Base.rte/Sounds/GUIs/UserError.flac", true, false);
61+
m_UserErrorSound.Create("Base.rte/Sounds/GUIs/UserError.flac", true, false, SoundContainer::BusRouting::UI);
6262

63-
m_TestSound.Create("Base.rte/Sounds/GUIs/Test.flac", true, false);
63+
m_TestSound.Create("Base.rte/Sounds/GUIs/Test.flac", true, false, SoundContainer::BusRouting::UI);
6464

65-
m_PieMenuEnterSound.Create("Base.rte/Sounds/GUIs/PieMenuEnter.flac", true, false);
65+
m_PieMenuEnterSound.Create("Base.rte/Sounds/GUIs/PieMenuEnter.flac", true, false, SoundContainer::BusRouting::UI);
6666

67-
m_PieMenuExitSound.Create("Base.rte/Sounds/GUIs/PieMenuExit.flac", true, false);
67+
m_PieMenuExitSound.Create("Base.rte/Sounds/GUIs/PieMenuExit.flac", true, false, SoundContainer::BusRouting::UI);
6868

69-
// m_HoverChangeSound.Create("Base.rte/Sounds/GUIs/SelectionChange.flac", true, false);
69+
// m_HoverChangeSound.Create("Base.rte/Sounds/GUIs/SelectionChange.flac", true, false, SoundContainer::BusRouting::UI);
7070
m_HoverChangeSound = m_SelectionChangeSound;
7171

72-
m_HoverDisabledSound.Create("Base.rte/Sounds/GUIs/PlacementBlip.flac", true, false);
72+
m_HoverDisabledSound.Create("Base.rte/Sounds/GUIs/PlacementBlip.flac", true, false, SoundContainer::BusRouting::UI);
7373

74-
m_SlicePickedSound.Create("Base.rte/Sounds/GUIs/SlicePicked.flac", true, false);
74+
m_SlicePickedSound.Create("Base.rte/Sounds/GUIs/SlicePicked.flac", true, false, SoundContainer::BusRouting::UI);
7575

76-
// m_DisabledPickedSound.Create("Base.rte/Sounds/GUIs/PieMenuExit.flac", true, false);
76+
// m_DisabledPickedSound.Create("Base.rte/Sounds/GUIs/PieMenuExit.flac", true, false, SoundContainer::BusRouting::UI);
7777
m_DisabledPickedSound = m_PieMenuExitSound;
7878

79-
m_FundsChangedSound.Create("Base.rte/Sounds/GUIs/FundsChanged1.flac", true, false);
79+
m_FundsChangedSound.Create("Base.rte/Sounds/GUIs/FundsChanged1.flac", true, false, SoundContainer::BusRouting::UI);
8080
m_FundsChangedSound.GetTopLevelSoundSet().AddSound("Base.rte/Sounds/GUIs/FundsChanged2.flac", true);
8181
m_FundsChangedSound.GetTopLevelSoundSet().AddSound("Base.rte/Sounds/GUIs/FundsChanged3.flac", true);
8282
m_FundsChangedSound.GetTopLevelSoundSet().AddSound("Base.rte/Sounds/GUIs/FundsChanged4.flac", true);
8383
m_FundsChangedSound.GetTopLevelSoundSet().AddSound("Base.rte/Sounds/GUIs/FundsChanged5.flac", true);
8484
m_FundsChangedSound.GetTopLevelSoundSet().AddSound("Base.rte/Sounds/GUIs/FundsChanged6.flac", true);
8585
m_FundsChangedSound.SetSoundOverlapMode(SoundContainer::SoundOverlapMode::RESTART);
8686

87-
m_ActorSwitchSound.Create("Base.rte/Sounds/GUIs/ActorSwitch.flac", true, false);
87+
m_ActorSwitchSound.Create("Base.rte/Sounds/GUIs/ActorSwitch.flac", true, false, SoundContainer::BusRouting::UI);
8888

89-
m_BrainSwitchSound.Create("Base.rte/Sounds/GUIs/BrainSwitch.flac", true, false);
89+
m_BrainSwitchSound.Create("Base.rte/Sounds/GUIs/BrainSwitch.flac", true, false, SoundContainer::BusRouting::UI);
9090

91-
m_CameraTravelSound.Create("Base.rte/Sounds/GUIs/CameraTravel1.flac", true, false);
91+
m_CameraTravelSound.Create("Base.rte/Sounds/GUIs/CameraTravel1.flac", true, false, SoundContainer::BusRouting::UI);
9292
m_CameraTravelSound.GetTopLevelSoundSet().AddSound("Base.rte/Sounds/GUIs/CameraTravel2.flac", true);
9393
m_CameraTravelSound.GetTopLevelSoundSet().AddSound("Base.rte/Sounds/GUIs/CameraTravel3.flac", true);
9494

95-
// m_AreaPickedSound.Create("Base.rte/Sounds/GUIs/MenuEnter.flac", true, false);
95+
// m_AreaPickedSound.Create("Base.rte/Sounds/GUIs/MenuEnter.flac", true, false, SoundContainer::BusRouting::UI);
9696
m_AreaPickedSound = m_ConfirmSound;
9797

98-
// m_ObjectPickedSound.Create("Base.rte/Sounds/GUIs/MenuEnter.flac", true, false);
98+
// m_ObjectPickedSound.Create("Base.rte/Sounds/GUIs/MenuEnter.flac", true, false, SoundContainer::BusRouting::UI);
9999
m_ObjectPickedSound = m_ConfirmSound;
100100

101-
// m_PurchaseMadeSound.Create("Base.rte/Sounds/GUIs/MenuEnter.flac", true, false);
101+
// m_PurchaseMadeSound.Create("Base.rte/Sounds/GUIs/MenuEnter.flac", true, false, SoundContainer::BusRouting::UI);
102102
m_PurchaseMadeSound = m_ConfirmSound;
103103

104-
m_PlacementBlip.Create("Base.rte/Sounds/GUIs/PlacementBlip.flac", true, false);
104+
m_PlacementBlip.Create("Base.rte/Sounds/GUIs/PlacementBlip.flac", true, false, SoundContainer::BusRouting::UI);
105105

106-
m_PlacementThud.Create("Base.rte/Sounds/GUIs/PlacementThud1.flac", true, false);
106+
m_PlacementThud.Create("Base.rte/Sounds/GUIs/PlacementThud1.flac", true, false, SoundContainer::BusRouting::UI);
107107
m_PlacementThud.GetTopLevelSoundSet().AddSound("Base.rte/Sounds/GUIs/PlacementThud2.flac", true);
108108

109-
m_PlacementGravel.Create("Base.rte/Sounds/GUIs/PlacementGravel1.flac", true, false);
109+
m_PlacementGravel.Create("Base.rte/Sounds/GUIs/PlacementGravel1.flac", true, false, SoundContainer::BusRouting::UI);
110110
m_PlacementGravel.GetTopLevelSoundSet().AddSound("Base.rte/Sounds/GUIs/PlacementGravel2.flac", true);
111111
m_PlacementGravel.GetTopLevelSoundSet().AddSound("Base.rte/Sounds/GUIs/PlacementGravel3.flac", true);
112112
m_PlacementGravel.GetTopLevelSoundSet().AddSound("Base.rte/Sounds/GUIs/PlacementGravel4.flac", true);

Lua/LuaBindingsEntities.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1366,8 +1366,10 @@ namespace RTE {
13661366
.def(luabind::constructor<>())
13671367

13681368
.property("SoundOverlapMode", &SoundContainer::GetSoundOverlapMode, &SoundContainer::SetSoundOverlapMode)
1369+
.property("BusRouting", &SoundContainer::GetBusRouting, &SoundContainer::SetBusRouting)
13691370
.property("Immobile", &SoundContainer::IsImmobile, &SoundContainer::SetImmobile)
13701371
.property("AttenuationStartDistance", &SoundContainer::GetAttenuationStartDistance, &SoundContainer::SetAttenuationStartDistance)
1372+
.property("PanningStrengthMultiplier", &SoundContainer::GetPanningStrengthMultiplier, &SoundContainer::SetPanningStrengthMultiplier)
13711373
.property("Loops", &SoundContainer::GetLoopSetting, &SoundContainer::SetLoopSetting)
13721374
.property("Priority", &SoundContainer::GetPriority, &SoundContainer::SetPriority)
13731375
.property("AffectedByGlobalPitch", &SoundContainer::IsAffectedByGlobalPitch, &SoundContainer::SetAffectedByGlobalPitch)
@@ -1389,7 +1391,13 @@ namespace RTE {
13891391
.def("Restart", (bool (SoundContainer:: *)()) &SoundContainer::Restart)
13901392
.def("Restart", (bool (SoundContainer:: *)(int player)) &SoundContainer::Restart)
13911393
.def("FadeOut", &SoundContainer::FadeOut)
1392-
1394+
1395+
.enum_("BusRouting")[
1396+
luabind::value("SFX", SoundContainer::BusRouting::SFX),
1397+
luabind::value("UI", SoundContainer::BusRouting::UI),
1398+
luabind::value("MUSIC", SoundContainer::BusRouting::MUSIC)
1399+
]
1400+
13931401
.enum_("SoundOverlapMode")[
13941402
luabind::value("OVERLAP", SoundContainer::SoundOverlapMode::OVERLAP),
13951403
luabind::value("RESTART", SoundContainer::SoundOverlapMode::RESTART),

0 commit comments

Comments
 (0)