Skip to content

Commit f1c7eee

Browse files
Merge pull request o3de#17490 from Porcupine-Factory/feature/miniaudio-volume-control
2 parents 09ffc17 + 73bca6f commit f1c7eee

23 files changed

+883
-395
lines changed

Gems/MiniAudio/Code/Include/MiniAudio/MiniAudioListenerBus.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ namespace MiniAudio
2222
virtual void SetPosition(const AZ::Vector3& position) = 0;
2323
virtual AZ::u32 GetChannelCount() const = 0;
2424

25+
//! Global volume controls
26+
virtual float GetGlobalVolumePercentage() const = 0;
27+
virtual void SetGlobalVolumePercentage(float globalVolume) = 0;
28+
virtual float GetGlobalVolumeDecibels() const = 0;
29+
virtual void SetGlobalVolumeDecibels(float globalVolumeDecibels) = 0;
30+
2531
//! Cone controls for directional attenuation
2632
virtual float GetInnerAngleInRadians() const = 0;
2733
virtual void SetInnerAngleInRadians(float innerAngleInRadians) = 0;
@@ -31,8 +37,10 @@ namespace MiniAudio
3137
virtual void SetOuterAngleInRadians(float outerAngleInRadians) = 0;
3238
virtual float GetOuterAngleInDegrees() const = 0;
3339
virtual void SetOuterAngleInDegrees(float outerAngleInDegrees) = 0;
34-
virtual float GetOuterVolume() const = 0;
35-
virtual void SetOuterVolume(float outerVolume) = 0;
40+
virtual float GetOuterVolumePercentage() const = 0;
41+
virtual void SetOuterVolumePercentage(float outerVolume) = 0;
42+
virtual float GetOuterVolumeDecibels() const = 0;
43+
virtual void SetOuterVolumeDecibels(float outerVolume) = 0;
3644
};
3745

3846
using MiniAudioListenerRequestBus = AZ::EBus<MiniAudioListenerRequests>;

Gems/MiniAudio/Code/Include/MiniAudio/MiniAudioPlaybackBus.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,17 @@ namespace MiniAudio
2222

2323
virtual void Play() = 0;
2424
virtual void Stop() = 0;
25-
virtual void SetVolume(float volume) = 0;
2625
virtual void SetLooping(bool loop) = 0;
2726
virtual bool IsLooping() const = 0;
2827
virtual void SetSoundAsset(AZ::Data::Asset<SoundAsset> soundAsset) = 0;
2928
virtual AZ::Data::Asset<SoundAsset> GetSoundAsset() const = 0;
3029

30+
//! Volume controls
31+
virtual void SetVolumePercentage(float volume) = 0;
32+
virtual float GetVolumePercentage() const = 0;
33+
virtual void SetVolumeDecibels(float volumeDecibels) = 0;
34+
virtual float GetVolumeDecibels() const = 0;
35+
3136
//! Custom setter for scripting
3237
virtual void SetSoundAssetRef(const SoundAssetRef& soundAssetRef) = 0;
3338
//! Custom getter for scripting
@@ -42,8 +47,10 @@ namespace MiniAudio
4247
virtual void SetOuterAngleInRadians(float outerAngleInRadians) = 0;
4348
virtual float GetOuterAngleInDegrees() const = 0;
4449
virtual void SetOuterAngleInDegrees(float outerAngleInDegrees) = 0;
45-
virtual float GetOuterVolume() const = 0;
46-
virtual void SetOuterVolume(float outerVolume) = 0;
50+
virtual float GetOuterVolumePercentage() const = 0;
51+
virtual void SetOuterVolumePercentage(float outerVolume) = 0;
52+
virtual float GetOuterVolumeDecibels() const = 0;
53+
virtual void SetOuterVolumeDecibels(float outerVolumeDecibels) = 0;
4754
virtual bool GetFixedDirecion() const = 0;
4855
virtual void SetFixedDirecion(bool fixedDirection) = 0;
4956
virtual float GetDirectionalAttenuationFactor() const = 0;

Gems/MiniAudio/Code/Source/Clients/MiniAudioImplementation.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ AZ_PUSH_DISABLE_WARNING(4701 4244 4456 4457 4245, "-Wuninitialized")
1818
extern "C" {
1919

2020
#define STB_VORBIS_HEADER_ONLY
21-
#include <stb_vorbis.c> // Enables Vorbis decoding.
21+
#include <stb_vorbis.c> // Enables Vorbis decoding.
2222
}
2323

2424
#define MINIAUDIO_IMPLEMENTATION
@@ -28,7 +28,6 @@ extern "C" {
2828
// The stb_vorbis implementation must come after the implementation of miniaudio.
2929
#undef STB_VORBIS_HEADER_ONLY
3030
#include <stb_vorbis.c>
31-
3231
}
3332

3433
AZ_POP_DISABLE_WARNING

Gems/MiniAudio/Code/Source/Clients/MiniAudioListenerComponent.cpp

Lines changed: 55 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -29,46 +29,74 @@ namespace MiniAudio
2929

3030
if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
3131
{
32-
serializeContext->Class<MiniAudioListenerComponent, BaseClass>()
33-
->Version(1);
32+
serializeContext->Class<MiniAudioListenerComponent, BaseClass>()->Version(1);
3433
}
3534

3635
if (auto behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
3736
{
38-
behaviorContext->ConstantProperty("MiniAudioListenerComponentTypeId",
39-
BehaviorConstant(AZ::Uuid(MiniAudioListenerComponentTypeId)))
37+
behaviorContext
38+
->ConstantProperty("MiniAudioListenerComponentTypeId", BehaviorConstant(AZ::Uuid(MiniAudioListenerComponentTypeId)))
4039
->Attribute(AZ::Script::Attributes::Module, "MiniAudio")
4140
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common);
4241

43-
AZ::BehaviorParameterOverrides GetChannelCountParam = {"Channel Count", "Get Channel Count"};
44-
AZ::BehaviorParameterOverrides GetInnerConeAngleInRadiansParam = {"Inner Cone Angle In Radians", "Get Inner Cone Angle In Radians"};
45-
AZ::BehaviorParameterOverrides SetInnerConeAngleInRadiansParam = {"Inner Cone Angle In Radians", "Set Inner Cone Angle In Radians"};
46-
AZ::BehaviorParameterOverrides GetInnerConeAngleInDegreesParam = {"Inner Cone Angle In Degrees", "Get Inner Cone Angle In Degrees"};
47-
AZ::BehaviorParameterOverrides SetInnerConeAngleInDegreesParam = {"Inner Cone Angle In Degrees", "Set Inner Cone Angle In Degrees"};
48-
AZ::BehaviorParameterOverrides GetOuterConeAngleInRadiansParam = {"Outer Cone Angle In Radians", "Get Outer Cone Angle In Radians"};
49-
AZ::BehaviorParameterOverrides SetOuterConeAngleInRadiansParam = {"Outer Cone Angle In Radians", "Set Outer Cone Angle In Radians"};
50-
AZ::BehaviorParameterOverrides GetOuterConeAngleInDegreesParam = {"Outer Cone Angle In Degrees", "Get Outer Cone Angle In Degrees"};
51-
AZ::BehaviorParameterOverrides SetOuterConeAngleInDegreesParam = {"Outer Cone Angle In Degrees", "Set Outer Cone Angle In Degrees"};
52-
AZ::BehaviorParameterOverrides GetOuterVolumeParam = {"Outer Volume", "Get Percent Volume Outside Outer Cone"};
53-
AZ::BehaviorParameterOverrides SetOuterVolumeParam = {"Outer Volume", "Set Percent Volume Outside Outer Cone"};
42+
AZ::BehaviorParameterOverrides GetChannelCountParam = { "Channel Count", "Get Channel Count" };
43+
AZ::BehaviorParameterOverrides GetGlobalVolumeParam = { "Global Volume", "Get Global Volume Percent" };
44+
AZ::BehaviorParameterOverrides SetGlobalVolumeParam = { "Global Volume", "Set Global Volume Percent" };
45+
AZ::BehaviorParameterOverrides GetGlobalVolumeDecibelsParam = { "Global Volume Decibels", "Get Global Volume Decibels" };
46+
AZ::BehaviorParameterOverrides SetGlobalVolumeDecibelsParam = { "Global Volume Decibels", "Set Global Volume Decibels" };
47+
AZ::BehaviorParameterOverrides GetInnerConeAngleInRadiansParam = { "Inner Cone Angle In Radians",
48+
"Get Inner Cone Angle In Radians" };
49+
AZ::BehaviorParameterOverrides SetInnerConeAngleInRadiansParam = { "Inner Cone Angle In Radians",
50+
"Set Inner Cone Angle In Radians" };
51+
AZ::BehaviorParameterOverrides GetInnerConeAngleInDegreesParam = { "Inner Cone Angle In Degrees",
52+
"Get Inner Cone Angle In Degrees" };
53+
AZ::BehaviorParameterOverrides SetInnerConeAngleInDegreesParam = { "Inner Cone Angle In Degrees",
54+
"Set Inner Cone Angle In Degrees" };
55+
AZ::BehaviorParameterOverrides GetOuterConeAngleInRadiansParam = { "Outer Cone Angle In Radians",
56+
"Get Outer Cone Angle In Radians" };
57+
AZ::BehaviorParameterOverrides SetOuterConeAngleInRadiansParam = { "Outer Cone Angle In Radians",
58+
"Set Outer Cone Angle In Radians" };
59+
AZ::BehaviorParameterOverrides GetOuterConeAngleInDegreesParam = { "Outer Cone Angle In Degrees",
60+
"Get Outer Cone Angle In Degrees" };
61+
AZ::BehaviorParameterOverrides SetOuterConeAngleInDegreesParam = { "Outer Cone Angle In Degrees",
62+
"Set Outer Cone Angle In Degrees" };
63+
AZ::BehaviorParameterOverrides GetOuterVolumeParam = { "Outer Volume", "Get Volume Percent Outside Outer Cone" };
64+
AZ::BehaviorParameterOverrides SetOuterVolumeParam = { "Outer Volume", "Set Volume Percent Outside Outer Cone" };
65+
AZ::BehaviorParameterOverrides GetOuterVolumeDecibelsParam = { "Outer Volume Decibels",
66+
"Get Volume Decibels Outside Outer Cone" };
67+
AZ::BehaviorParameterOverrides SetOuterVolumeDecibelsParam = { "Outer Volume Decibels",
68+
"Set Volume Decibels Outside Outer Cone" };
5469
behaviorContext->EBus<MiniAudioListenerRequestBus>("MiniAudioListenerRequestBus")
5570
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
5671
->Attribute(AZ::Script::Attributes::Module, "audio")
5772
->Attribute(AZ::Script::Attributes::Category, "MiniAudio Listener")
5873
->Event("SetPosition", &MiniAudioListenerRequests::SetPosition)
5974
->Event("SetFollowEntity", &MiniAudioListenerRequests::SetFollowEntity)
60-
->Event("GetChannelCount", &MiniAudioListenerRequests::GetChannelCount, {GetChannelCountParam})
61-
->Event("GetInnerConeAngleInRadians", &MiniAudioListenerRequests::GetInnerAngleInRadians, {GetInnerConeAngleInRadiansParam})
62-
->Event("SetInnerConeAngleInRadians", &MiniAudioListenerRequests::SetInnerAngleInRadians, {SetInnerConeAngleInRadiansParam})
63-
->Event("GetInnerConeAngleInDegrees", &MiniAudioListenerRequests::GetInnerAngleInDegrees, {GetInnerConeAngleInDegreesParam})
64-
->Event("SetInnerConeAngleInDegrees", &MiniAudioListenerRequests::SetInnerAngleInDegrees, {SetInnerConeAngleInDegreesParam})
65-
->Event("GetOuterConeAngleInRadians", &MiniAudioListenerRequests::GetOuterAngleInRadians, {GetOuterConeAngleInRadiansParam})
66-
->Event("SetOuterConeAngleInRadians", &MiniAudioListenerRequests::SetOuterAngleInRadians, {SetOuterConeAngleInRadiansParam})
67-
->Event("GetOuterConeAngleInDegrees", &MiniAudioListenerRequests::GetOuterAngleInDegrees, {GetOuterConeAngleInDegreesParam})
68-
->Event("SetOuterConeAngleInDegrees", &MiniAudioListenerRequests::SetOuterAngleInDegrees, {SetOuterConeAngleInDegreesParam})
69-
->Event("GetOuterVolume", &MiniAudioListenerRequests::GetOuterVolume, {GetOuterVolumeParam})
70-
->Event("SetOuterVolume", &MiniAudioListenerRequests::SetOuterVolume, {SetOuterVolumeParam})
71-
;
75+
->Event("GetChannelCount", &MiniAudioListenerRequests::GetChannelCount, { GetChannelCountParam })
76+
->Event("GetGlobalVolumePercentage", &MiniAudioListenerRequests::GetGlobalVolumePercentage, { GetGlobalVolumeParam })
77+
->Event("SetGlobalVolumePercentage", &MiniAudioListenerRequests::SetGlobalVolumePercentage, { SetGlobalVolumeParam })
78+
->Event("GetGlobalVolumeDecibels", &MiniAudioListenerRequests::GetGlobalVolumeDecibels, { GetGlobalVolumeDecibelsParam })
79+
->Event("SetGlobalVolumeDecibels", &MiniAudioListenerRequests::SetGlobalVolumeDecibels, { SetGlobalVolumeDecibelsParam })
80+
->Event(
81+
"GetInnerConeAngleInRadians", &MiniAudioListenerRequests::GetInnerAngleInRadians, { GetInnerConeAngleInRadiansParam })
82+
->Event(
83+
"SetInnerConeAngleInRadians", &MiniAudioListenerRequests::SetInnerAngleInRadians, { SetInnerConeAngleInRadiansParam })
84+
->Event(
85+
"GetInnerConeAngleInDegrees", &MiniAudioListenerRequests::GetInnerAngleInDegrees, { GetInnerConeAngleInDegreesParam })
86+
->Event(
87+
"SetInnerConeAngleInDegrees", &MiniAudioListenerRequests::SetInnerAngleInDegrees, { SetInnerConeAngleInDegreesParam })
88+
->Event(
89+
"GetOuterConeAngleInRadians", &MiniAudioListenerRequests::GetOuterAngleInRadians, { GetOuterConeAngleInRadiansParam })
90+
->Event(
91+
"SetOuterConeAngleInRadians", &MiniAudioListenerRequests::SetOuterAngleInRadians, { SetOuterConeAngleInRadiansParam })
92+
->Event(
93+
"GetOuterConeAngleInDegrees", &MiniAudioListenerRequests::GetOuterAngleInDegrees, { GetOuterConeAngleInDegreesParam })
94+
->Event(
95+
"SetOuterConeAngleInDegrees", &MiniAudioListenerRequests::SetOuterAngleInDegrees, { SetOuterConeAngleInDegreesParam })
96+
->Event("GetOuterVolumePercentage", &MiniAudioListenerRequests::GetOuterVolumePercentage, { GetOuterVolumeParam })
97+
->Event("SetOuterVolumePercentage", &MiniAudioListenerRequests::SetOuterVolumePercentage, { SetOuterVolumeParam })
98+
->Event("GetOuterVolumeDecibels", &MiniAudioListenerRequests::GetOuterVolumeDecibels, { GetOuterVolumeDecibelsParam })
99+
->Event("SetOuterVolumeDecibels", &MiniAudioListenerRequests::SetOuterVolumeDecibels, { SetOuterVolumeDecibelsParam });
72100

73101
behaviorContext->Class<MiniAudioListenerComponent>()->RequestBus("MiniAudioListenerRequestBus");
74102
}

Gems/MiniAudio/Code/Source/Clients/MiniAudioListenerComponentConfig.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ namespace MiniAudio
2020
->Version(1)
2121
->Field("Follow Entity", &MiniAudioListenerComponentConfig::m_followEntity)
2222
->Field("Listener Index", &MiniAudioListenerComponentConfig::m_listenerIndex)
23+
->Field("Global Volume", &MiniAudioListenerComponentConfig::m_globalVolume)
2324
->Field("Inner Cone Angle", &MiniAudioListenerComponentConfig::m_innerAngleInDegrees)
2425
->Field("Outer Cone Angle", &MiniAudioListenerComponentConfig::m_outerAngleInDegrees)
25-
->Field("Outer Volume", &MiniAudioListenerComponentConfig::m_outerVolume)
26-
;
26+
->Field("Outer Volume", &MiniAudioListenerComponentConfig::m_outerVolume);
2727
}
2828
}
2929
} // namespace MiniAudio

Gems/MiniAudio/Code/Source/Clients/MiniAudioListenerComponentConfig.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ namespace MiniAudio
2929

3030
AZ::u32 m_listenerIndex = 0;
3131

32+
//! Global volume
33+
float m_globalVolume = 100.0f;
3234
//! Inner cone angle
3335
float m_innerAngleInRadians = 3.f/5.f * AZ::Constants::TwoPi;
3436
float m_innerAngleInDegrees = AZ::RadToDeg(m_innerAngleInRadians);

Gems/MiniAudio/Code/Source/Clients/MiniAudioListenerComponentController.cpp

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ namespace MiniAudio
2121
{
2222
}
2323

24-
MiniAudioListenerComponentController::MiniAudioListenerComponentController(
25-
const MiniAudioListenerComponentConfig& config)
24+
MiniAudioListenerComponentController::MiniAudioListenerComponentController(const MiniAudioListenerComponentConfig& config)
2625
{
2726
m_config = config;
2827
}
@@ -66,6 +65,28 @@ namespace MiniAudio
6665
return m_config;
6766
}
6867

68+
float MiniAudioListenerComponentController::GetGlobalVolumePercentage() const
69+
{
70+
return MiniAudioInterface::Get()->GetGlobalVolume() * 100.f;
71+
}
72+
73+
void MiniAudioListenerComponentController::SetGlobalVolumePercentage(float globalVolume)
74+
{
75+
m_config.m_globalVolume = globalVolume;
76+
MiniAudioInterface::Get()->SetGlobalVolume(m_config.m_globalVolume / 100.f);
77+
}
78+
79+
float MiniAudioListenerComponentController::GetGlobalVolumeDecibels() const
80+
{
81+
return ma_volume_linear_to_db(MiniAudioInterface::Get()->GetGlobalVolume());
82+
}
83+
84+
void MiniAudioListenerComponentController::SetGlobalVolumeDecibels(float globalVolumeDecibels)
85+
{
86+
m_config.m_globalVolume = ma_volume_db_to_linear(globalVolumeDecibels) * 100.f;
87+
MiniAudioInterface::Get()->SetGlobalVolume(m_config.m_globalVolume / 100.f);
88+
}
89+
6990
void MiniAudioListenerComponentController::SetFollowEntity(const AZ::EntityId& followEntity)
7091
{
7192
m_config.m_followEntity = followEntity;
@@ -125,17 +146,28 @@ namespace MiniAudio
125146
OnConfigurationUpdated();
126147
}
127148

128-
float MiniAudioListenerComponentController::GetOuterVolume() const
149+
float MiniAudioListenerComponentController::GetOuterVolumePercentage() const
129150
{
130151
return m_config.m_outerVolume;
131152
}
132153

133-
void MiniAudioListenerComponentController::SetOuterVolume(float outerVolume)
154+
void MiniAudioListenerComponentController::SetOuterVolumePercentage(float outerVolume)
134155
{
135156
m_config.m_outerVolume = AZ::GetClamp(outerVolume, 0.f, 100.f);
136157
OnConfigurationUpdated();
137158
}
138159

160+
float MiniAudioListenerComponentController::GetOuterVolumeDecibels() const
161+
{
162+
return ma_volume_linear_to_db(m_config.m_outerVolume / 100.f);
163+
}
164+
165+
void MiniAudioListenerComponentController::SetOuterVolumeDecibels(float outerVolumeDecibels)
166+
{
167+
m_config.m_outerVolume = ma_volume_db_to_linear(outerVolumeDecibels) * 100.f;
168+
OnConfigurationUpdated();
169+
}
170+
139171
void MiniAudioListenerComponentController::SetPosition(const AZ::Vector3& position)
140172
{
141173
if (ma_engine* engine = MiniAudioInterface::Get()->GetSoundEngine())
@@ -155,7 +187,12 @@ namespace MiniAudio
155187
{
156188
if (ma_engine* engine = MiniAudioInterface::Get()->GetSoundEngine())
157189
{
158-
ma_engine_listener_set_position(engine, m_config.m_listenerIndex, world.GetTranslation().GetX(), world.GetTranslation().GetY(), world.GetTranslation().GetZ());
190+
ma_engine_listener_set_position(
191+
engine,
192+
m_config.m_listenerIndex,
193+
world.GetTranslation().GetX(),
194+
world.GetTranslation().GetY(),
195+
world.GetTranslation().GetZ());
159196

160197
const AZ::Vector3 forward = world.GetBasisY();
161198
const AZ::Vector3 up = world.GetBasisZ();
@@ -170,7 +207,8 @@ namespace MiniAudio
170207
if (m_config.m_followEntity.IsValid())
171208
{
172209
m_entityMovedHandler.Disconnect();
173-
AZ::TransformBus::Event(m_config.m_followEntity, &AZ::TransformBus::Events::BindTransformChangedEventHandler, m_entityMovedHandler);
210+
AZ::TransformBus::Event(
211+
m_config.m_followEntity, &AZ::TransformBus::Events::BindTransformChangedEventHandler, m_entityMovedHandler);
174212

175213
AZ::Transform worldTm = AZ::Transform::CreateIdentity();
176214
AZ::TransformBus::EventResult(worldTm, m_entityComponentIdPair.GetEntityId(), &AZ::TransformBus::Events::GetWorldTM);
@@ -183,7 +221,13 @@ namespace MiniAudio
183221

184222
if (ma_engine* engine = MiniAudioInterface::Get()->GetSoundEngine())
185223
{
186-
ma_engine_listener_set_cone(engine, m_config.m_listenerIndex, m_config.m_innerAngleInRadians, m_config.m_outerAngleInRadians, (m_config.m_outerVolume/100.f));
224+
MiniAudioInterface::Get()->SetGlobalVolume(m_config.m_globalVolume / 100.f);
225+
ma_engine_listener_set_cone(
226+
engine,
227+
m_config.m_listenerIndex,
228+
m_config.m_innerAngleInRadians,
229+
m_config.m_outerAngleInRadians,
230+
(m_config.m_outerVolume / 100.f));
187231
}
188232
}
189233
} // namespace MiniAudio

0 commit comments

Comments
 (0)