Skip to content

Commit 3bf133a

Browse files
ProGMKurtGokhan
andauthored
Audio audio-volume and audio-pitch css properties (#109)
* wip: added audio-volume and audio-pitch css properties * fix: feedback after testing in the editor * fix: more testing in the editor * fix(audio): compound form * dont store volume and pitch in state --------- Co-authored-by: Gokhan Kurt <[email protected]>
1 parent dd1b55a commit 3bf133a

File tree

11 files changed

+51
-14
lines changed

11 files changed

+51
-14
lines changed

Editor/Renderer/EditorContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ protected override IReactComponent CreateComponentInternal(string tag, string te
9999
return res;
100100
}
101101

102-
public override void PlayAudio(AudioClip clip)
102+
public override void PlayAudio(AudioClip clip, float volume, float pitch)
103103
{
104104
EditorSFX.PlayClip(clip);
105105
}

Runtime/Core/ReactContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ public virtual ScriptSource CreateStaticScript(string path)
168168
return src;
169169
}
170170

171-
public abstract void PlayAudio(AudioClip clip);
171+
public abstract void PlayAudio(AudioClip clip, float volume, float pitch);
172172

173173
public void Start(Action afterStart = null)
174174
{

Runtime/Frameworks/Noop/NoopContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,6 @@ protected override IReactComponent CreatePseudoComponentInternal(string tag)
6767
return tc;
6868
}
6969

70-
public override void PlayAudio(AudioClip clip) { }
70+
public override void PlayAudio(AudioClip clip, float volume, float pitch) { }
7171
}
7272
}

Runtime/Frameworks/UGUI/General/UGUIContext.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,11 @@ protected override IReactComponent CreatePseudoComponentInternal(string tag)
155155
return tc;
156156
}
157157

158-
public override void PlayAudio(AudioClip clip)
158+
public override void PlayAudio(AudioClip clip, float volume, float pitch)
159159
{
160160
var source = (Host as HostComponent).GetOrAddComponent<AudioSource>();
161-
source.PlayOneShot(clip);
161+
source.pitch = pitch;
162+
source.PlayOneShot(clip, volume);
162163
}
163164

164165
public GameObject CreateNativeObject(string name, params Type[] components)

Runtime/Frameworks/UIToolkit/General/ReactRendererUIToolkit.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,11 @@ protected override ReactContext CreateContext(ScriptSource script)
4040
return ctx;
4141
}
4242

43-
public void PlayAudio(AudioClip clip)
43+
public void PlayAudio(AudioClip clip, float volume, float pitch)
4444
{
4545
var source = GetComponent<AudioSource>();
46-
source.PlayOneShot(clip);
46+
source.pitch = pitch;
47+
source.PlayOneShot(clip, volume);
4748
}
4849

4950
protected override IMediaProvider CreateMediaProvider()

Runtime/Frameworks/UIToolkit/General/UIToolkitContext.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class UIToolkitContext : ReactContext
1212
public new class Options : ReactContext.Options
1313
{
1414
public VisualElement HostElement;
15-
public Action<AudioClip> OnAudioPlayback;
15+
public Action<AudioClip, float, float> OnAudioPlayback;
1616
public override bool CalculatesLayout => false;
1717
}
1818

@@ -69,7 +69,7 @@ public static Dictionary<string, Func<string, string, UIToolkitContext, IReactCo
6969
{ "hover", typeof(HoverStateHandler) },
7070
};
7171

72-
private Action<AudioClip> OnAudioPlayback = null;
72+
private Action<AudioClip, float, float> OnAudioPlayback = null;
7373

7474
public VisualElement HostElement { get; }
7575

@@ -115,9 +115,9 @@ protected override IReactComponent CreatePseudoComponentInternal(string tag)
115115
return tc;
116116
}
117117

118-
public override void PlayAudio(AudioClip clip)
118+
public override void PlayAudio(AudioClip clip, float volume, float pitch)
119119
{
120-
OnAudioPlayback?.Invoke(clip);
120+
OnAudioPlayback?.Invoke(clip, volume, pitch);
121121
}
122122
}
123123
}

Runtime/Styling/NodeStyle.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ public class NodeStyle
122122
public ICssValueList<AudioReference> audioClip => GetStyleValue(StyleProperties.audioClip);
123123
public ICssValueList<int> audioIterationCount => GetStyleValue(StyleProperties.audioIterationCount);
124124
public ICssValueList<float> audioDelay => GetStyleValue(StyleProperties.audioDelay);
125+
public ICssValueList<float> audioVolume => GetStyleValue(StyleProperties.audioVolume);
126+
public ICssValueList<float> audioPitch => GetStyleValue(StyleProperties.audioPitch);
125127

126128
#endregion
127129

Runtime/Styling/Properties/StyleProperties.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ public static class StyleProperties
113113
public static readonly ValueListStyleProperty<AudioReference> audioClip = new ValueListStyleProperty<AudioReference>("audioClip");
114114
public static readonly ValueListStyleProperty<int> audioIterationCount = new ValueListStyleProperty<int>("audioIterationCount", 1);
115115
public static readonly ValueListStyleProperty<float> audioDelay = new ValueListStyleProperty<float>("audioDelay");
116+
public static readonly ValueListStyleProperty<float> audioVolume = new ValueListStyleProperty<float>("audioVolume", 1f, true, baseConverter: AllConverters.PercentageConverter);
117+
public static readonly ValueListStyleProperty<float> audioPitch = new ValueListStyleProperty<float>("audioPitch", 1f);
116118

117119
public static readonly Dictionary<string, IStyleProperty> PropertyMap = new Dictionary<string, IStyleProperty>(StringComparer.InvariantCultureIgnoreCase)
118120
{
@@ -233,10 +235,14 @@ public static class StyleProperties
233235
{ "audioClip", audioClip },
234236
{ "audioDelay", audioDelay },
235237
{ "audioIterationCount", audioIterationCount },
238+
{ "audioVolume", audioVolume },
239+
{ "audioPitch", audioPitch },
236240

237241
{ "audio-clip", audioClip },
238242
{ "audio-delay", audioDelay },
239243
{ "audio-iteration-count", audioIterationCount },
244+
{ "audio-volume", audioVolume },
245+
{ "audio-pitch", audioPitch },
240246

241247
{ "border-image-source", borderImageSource },
242248
{ "border-image-slice", borderImageSlice },

Runtime/Styling/Shorthands/AudioShorthand.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ protected override List<IStyleProperty> ModifyInternal(IDictionary<IStylePropert
2222
var clips = new IComputedValue[count];
2323
var delays = new IComputedValue[count];
2424
var iterations = new IComputedValue[count];
25+
var volumes = new IComputedValue[count];
2526

2627
for (int ci = 0; ci < count; ci++)
2728
{
@@ -33,6 +34,7 @@ protected override List<IStyleProperty> ModifyInternal(IDictionary<IStylePropert
3334
var countSet = false;
3435
var delaySet = false;
3536
var clipSet = false;
37+
var volumeSet = false;
3638

3739
for (int i = 0; i < splits.Count; i++)
3840
{
@@ -49,6 +51,17 @@ protected override List<IStyleProperty> ModifyInternal(IDictionary<IStylePropert
4951
continue;
5052
}
5153

54+
if (AllConverters.PercentageConverter.TryParse(split, out var fvolume))
55+
{
56+
if (!volumeSet)
57+
{
58+
volumes[ci] = fvolume;
59+
volumeSet = true;
60+
}
61+
else return null;
62+
continue;
63+
}
64+
5265
if (AllConverters.DurationConverter.TryParse(split, out var f))
5366
{
5467
if (!delaySet)
@@ -75,11 +88,13 @@ protected override List<IStyleProperty> ModifyInternal(IDictionary<IStylePropert
7588
if (!clipSet) return null;
7689
if (!delaySet) delays[ci] = new ComputedConstant(0f);
7790
if (!countSet) iterations[ci] = new ComputedConstant(1);
91+
if (!volumeSet) volumes[ci] = new ComputedConstant(1f);
7892
}
7993

8094
collection[StyleProperties.audioClip] = StyleProperties.audioClip.Converter.FromList(clips);
8195
collection[StyleProperties.audioDelay] = StyleProperties.audioDelay.Converter.FromList(delays);
8296
collection[StyleProperties.audioIterationCount] = StyleProperties.audioIterationCount.Converter.FromList(iterations);
97+
collection[StyleProperties.audioVolume] = StyleProperties.audioVolume.Converter.FromList(volumes);
8398

8499
return ModifiedProperties;
85100
}

Runtime/Styling/StyleState.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -652,8 +652,10 @@ private bool UpdateAudio()
652652
var clip = Current.audioClip;
653653
var delay = Current.audioDelay;
654654
var iterationCount = Current.audioIterationCount;
655+
var volume = Current.audioVolume;
656+
var pitch = Current.audioPitch;
655657

656-
var maxLength = Mathf.Max(delay.Count, iterationCount.Count, clip.Count);
658+
var maxLength = Mathf.Max(delay.Count, iterationCount.Count, clip.Count, volume.Count, pitch.Count);
657659

658660
if (audioStates == null) audioStates = new AudioState[maxLength];
659661

@@ -664,12 +666,14 @@ private bool UpdateAudio()
664666

665667
var state = audioStates[i] = audioStates[i] ?? new AudioState();
666668

669+
var curVolume = volume.Get(i, 1);
670+
var curPitch = pitch.Get(i, 1);
667671

668672
Action tryPlayClip = () => {
669673
if (state.Loaded && state.ShouldStart)
670674
{
671675
state.ShouldStart = false;
672-
Context.PlayAudio(state.Clip);
676+
Context.PlayAudio(state.Clip, curVolume, curPitch);
673677
}
674678
};
675679

0 commit comments

Comments
 (0)