Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Audio audio-volume and audio-pitch css properties #109

Merged
merged 5 commits into from
Jun 1, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Editor/Renderer/EditorContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ protected override IReactComponent CreateComponentInternal(string tag, string te
return res;
}

public override void PlayAudio(AudioClip clip)
public override void PlayAudio(AudioClip clip, float volume, float pitch)
{
EditorSFX.PlayClip(clip);
}
Expand Down
2 changes: 1 addition & 1 deletion Runtime/Core/ReactContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ public virtual ScriptSource CreateStaticScript(string path)
return src;
}

public abstract void PlayAudio(AudioClip clip);
public abstract void PlayAudio(AudioClip clip, float volume, float pitch);

public void Start(Action afterStart = null)
{
Expand Down
2 changes: 1 addition & 1 deletion Runtime/Frameworks/Noop/NoopContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,6 @@ protected override IReactComponent CreatePseudoComponentInternal(string tag)
return tc;
}

public override void PlayAudio(AudioClip clip) { }
public override void PlayAudio(AudioClip clip, float volume, float pitch) { }
}
}
5 changes: 3 additions & 2 deletions Runtime/Frameworks/UGUI/General/UGUIContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -155,10 +155,11 @@ protected override IReactComponent CreatePseudoComponentInternal(string tag)
return tc;
}

public override void PlayAudio(AudioClip clip)
public override void PlayAudio(AudioClip clip, float volume, float pitch)
{
var source = (Host as HostComponent).GetOrAddComponent<AudioSource>();
source.PlayOneShot(clip);
source.pitch = pitch;
source.PlayOneShot(clip, volume);
}

public GameObject CreateNativeObject(string name, params Type[] components)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,11 @@ protected override ReactContext CreateContext(ScriptSource script)
return ctx;
}

public void PlayAudio(AudioClip clip)
public void PlayAudio(AudioClip clip, float volume, float pitch)
{
var source = GetComponent<AudioSource>();
source.PlayOneShot(clip);
source.pitch = pitch;
source.PlayOneShot(clip, volume);
}

protected override IMediaProvider CreateMediaProvider()
Expand Down
8 changes: 4 additions & 4 deletions Runtime/Frameworks/UIToolkit/General/UIToolkitContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class UIToolkitContext : ReactContext
public new class Options : ReactContext.Options
{
public VisualElement HostElement;
public Action<AudioClip> OnAudioPlayback;
public Action<AudioClip, float, float> OnAudioPlayback;
public override bool CalculatesLayout => false;
}

Expand Down Expand Up @@ -69,7 +69,7 @@ public static Dictionary<string, Func<string, string, UIToolkitContext, IReactCo
{ "hover", typeof(HoverStateHandler) },
};

private Action<AudioClip> OnAudioPlayback = null;
private Action<AudioClip, float, float> OnAudioPlayback = null;

public VisualElement HostElement { get; }

Expand Down Expand Up @@ -115,9 +115,9 @@ protected override IReactComponent CreatePseudoComponentInternal(string tag)
return tc;
}

public override void PlayAudio(AudioClip clip)
public override void PlayAudio(AudioClip clip, float volume, float pitch)
{
OnAudioPlayback?.Invoke(clip);
OnAudioPlayback?.Invoke(clip, volume, pitch);
}
}
}
2 changes: 2 additions & 0 deletions Runtime/Styling/NodeStyle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,8 @@ public class NodeStyle
public ICssValueList<AudioReference> audioClip => GetStyleValue(StyleProperties.audioClip);
public ICssValueList<int> audioIterationCount => GetStyleValue(StyleProperties.audioIterationCount);
public ICssValueList<float> audioDelay => GetStyleValue(StyleProperties.audioDelay);
public ICssValueList<float> audioVolume => GetStyleValue(StyleProperties.audioVolume);
public ICssValueList<float> audioPitch => GetStyleValue(StyleProperties.audioPitch);

#endregion

Expand Down
6 changes: 6 additions & 0 deletions Runtime/Styling/Properties/StyleProperties.cs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,8 @@ public static class StyleProperties
public static readonly ValueListStyleProperty<AudioReference> audioClip = new ValueListStyleProperty<AudioReference>("audioClip");
public static readonly ValueListStyleProperty<int> audioIterationCount = new ValueListStyleProperty<int>("audioIterationCount", 1);
public static readonly ValueListStyleProperty<float> audioDelay = new ValueListStyleProperty<float>("audioDelay");
public static readonly ValueListStyleProperty<float> audioVolume = new ValueListStyleProperty<float>("audioVolume", 1f, true, baseConverter: AllConverters.PercentageConverter);
public static readonly ValueListStyleProperty<float> audioPitch = new ValueListStyleProperty<float>("audioPitch", 1f);

public static readonly Dictionary<string, IStyleProperty> PropertyMap = new Dictionary<string, IStyleProperty>(StringComparer.InvariantCultureIgnoreCase)
{
Expand Down Expand Up @@ -233,10 +235,14 @@ public static class StyleProperties
{ "audioClip", audioClip },
{ "audioDelay", audioDelay },
{ "audioIterationCount", audioIterationCount },
{ "audioVolume", audioVolume },
{ "audioPitch", audioPitch },

{ "audio-clip", audioClip },
{ "audio-delay", audioDelay },
{ "audio-iteration-count", audioIterationCount },
{ "audio-volume", audioVolume },
{ "audio-pitch", audioPitch },

{ "border-image-source", borderImageSource },
{ "border-image-slice", borderImageSlice },
Expand Down
15 changes: 15 additions & 0 deletions Runtime/Styling/Shorthands/AudioShorthand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ protected override List<IStyleProperty> ModifyInternal(IDictionary<IStylePropert
var clips = new IComputedValue[count];
var delays = new IComputedValue[count];
var iterations = new IComputedValue[count];
var volumes = new IComputedValue[count];

for (int ci = 0; ci < count; ci++)
{
Expand All @@ -33,6 +34,7 @@ protected override List<IStyleProperty> ModifyInternal(IDictionary<IStylePropert
var countSet = false;
var delaySet = false;
var clipSet = false;
var volumeSet = false;

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

if (AllConverters.PercentageConverter.TryParse(split, out var fvolume))
{
if (!volumeSet)
{
volumes[ci] = fvolume;
volumeSet = true;
}
else return null;
continue;
}

if (AllConverters.DurationConverter.TryParse(split, out var f))
{
if (!delaySet)
Expand All @@ -75,11 +88,13 @@ protected override List<IStyleProperty> ModifyInternal(IDictionary<IStylePropert
if (!clipSet) return null;
if (!delaySet) delays[ci] = new ComputedConstant(0f);
if (!countSet) iterations[ci] = new ComputedConstant(1);
if (!volumeSet) volumes[ci] = new ComputedConstant(1f);
}

collection[StyleProperties.audioClip] = StyleProperties.audioClip.Converter.FromList(clips);
collection[StyleProperties.audioDelay] = StyleProperties.audioDelay.Converter.FromList(delays);
collection[StyleProperties.audioIterationCount] = StyleProperties.audioIterationCount.Converter.FromList(iterations);
collection[StyleProperties.audioVolume] = StyleProperties.audioVolume.Converter.FromList(volumes);

return ModifiedProperties;
}
Expand Down
10 changes: 8 additions & 2 deletions Runtime/Styling/StyleState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ private class AudioState
public bool Loaded;
public bool Loading;
public UnityEngine.AudioClip Clip;
public float Volume;
public float Pitch;
public bool ShouldStart;
public int CurrentLoop = 0;
}
Expand Down Expand Up @@ -652,8 +654,10 @@ private bool UpdateAudio()
var clip = Current.audioClip;
var delay = Current.audioDelay;
var iterationCount = Current.audioIterationCount;
var volume = Current.audioVolume;
var pitch = Current.audioPitch;

var maxLength = Mathf.Max(delay.Count, iterationCount.Count, clip.Count);
var maxLength = Mathf.Max(delay.Count, iterationCount.Count, clip.Count, volume.Count, pitch.Count);

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

Expand All @@ -669,7 +673,7 @@ private bool UpdateAudio()
if (state.Loaded && state.ShouldStart)
{
state.ShouldStart = false;
Context.PlayAudio(state.Clip);
Context.PlayAudio(state.Clip, state.Volume, state.Pitch);
}
};

Expand All @@ -683,6 +687,8 @@ private bool UpdateAudio()

clip.Get(i, AudioReference.None).Get(Context, (cl) => {
state.Clip = cl;
state.Volume = volume.Get(i, 1);
state.Pitch = pitch.Get(i, 1);
state.Loaded = true;
state.Loading = false;

Expand Down
10 changes: 9 additions & 1 deletion Tests/Runtime/Animations/AudioTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public IEnumerator ParsingWorksCorrectly()
{
var view = Q("#test");

view.Style.Set("audio", $"url({TestHelpers.ClickUrl}) 3s 5, url(https://example.com/file.ogg) infinite 2s, url(res:something)");
view.Style.Set("audio", $"url({TestHelpers.ClickUrl}) 3s 5, url(https://example.com/file.ogg) infinite 2s, url(res:something), url(res:something) 50%");
yield return null;

var st = view.ComputedStyle;
Expand All @@ -35,13 +35,21 @@ public IEnumerator ParsingWorksCorrectly()
Assert.AreEqual(1, st.audioIterationCount.Get(2));


Assert.AreEqual(AssetReferenceType.Resource, st.audioClip.Get(3).Type);
Assert.AreEqual("something", st.audioClip.Get(3).Value);
Assert.AreEqual(0, st.audioDelay.Get(3));
Assert.AreEqual(1, st.audioIterationCount.Get(3));
Assert.AreEqual(0.5f, st.audioVolume.Get(3));


view.Style.Set("audio", "none");
yield return null;

st = view.ComputedStyle;
Assert.AreEqual(null, st.audioClip.Get(0));
Assert.AreEqual(0, st.audioDelay.Get(0));
Assert.AreEqual(1, st.audioIterationCount.Get(0, 1));
Assert.AreEqual(1, st.audioVolume.Get(0, 1));

}
}
Expand Down