Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
115 changes: 4 additions & 111 deletions ProjectObsidian/ProtoFlux/Audio/AudioAdder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,11 @@

namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Audio
{
public class AudioAdderProxy : ProtoFluxEngineProxy, Awwdio.IAudioDataSource, IWorldAudioDataSource
public class AudioAdderProxy : DualInputAudioGeneratorNodeProxy
{
public IWorldAudioDataSource AudioInput;
public override int ChannelCount => AudioInput?.ChannelCount ?? AudioInput2?.ChannelCount ?? 0;

public IWorldAudioDataSource AudioInput2;

public bool Active;

public bool IsActive => Active;

public int ChannelCount => AudioInput?.ChannelCount ?? AudioInput2?.ChannelCount ?? 0;

public void Read<S>(Span<S> buffer, AudioSimulator simulator) where S : unmanaged, IAudioSample<S>
public override void Read<S>(Span<S> buffer, AudioSimulator simulator)
{
if (!IsActive)
{
Expand Down Expand Up @@ -49,106 +41,7 @@ public void Read<S>(Span<S> buffer, AudioSimulator simulator) where S : unmanage
}
}
[NodeCategory("Obsidian/Audio")]
public class AudioAdder : ProxyVoidNode<FrooxEngineContext, AudioAdderProxy>, IExecutionChangeListener<FrooxEngineContext>
public class AudioAdder : DualInputAudioGeneratorNode<AudioAdderProxy>
{
[ChangeListener]
public readonly ObjectInput<IWorldAudioDataSource> AudioInput;

[ChangeListener]
public readonly ObjectInput<IWorldAudioDataSource> AudioInput2;

public readonly ObjectOutput<IWorldAudioDataSource> AudioOutput;

private ObjectStore<Action<IChangeable>> _enabledChangedHandler;

private ObjectStore<SlotEvent> _activeChangedHandler;

public bool ValueListensToChanges { get; private set; }

private bool ShouldListen(AudioAdderProxy proxy)
{
if (proxy.Enabled)
{
return proxy.Slot.IsActive;
}
return false;
}

protected override void ProxyAdded(AudioAdderProxy proxy, FrooxEngineContext context)
{
base.ProxyAdded(proxy, context);
NodeContextPath path = context.CaptureContextPath();
ProtoFluxNodeGroup group = context.Group;
context.GetEventDispatcher(out var dispatcher);
Action<IChangeable> enabledHandler = delegate
{
dispatcher.ScheduleEvent(path, delegate (FrooxEngineContext c)
{
UpdateListenerState(c);
});
};
SlotEvent activeHandler = delegate
{
dispatcher.ScheduleEvent(path, delegate (FrooxEngineContext c)
{
UpdateListenerState(c);
});
};
proxy.EnabledField.Changed += enabledHandler;
proxy.Slot.ActiveChanged += activeHandler;
_enabledChangedHandler.Write(enabledHandler, context);
_activeChangedHandler.Write(activeHandler, context);
ValueListensToChanges = ShouldListen(proxy);
proxy.Active = ValueListensToChanges;
}

protected override void ProxyRemoved(AudioAdderProxy proxy, FrooxEngineContext context, bool inUseByAnotherInstance)
{
if (!inUseByAnotherInstance)
{
proxy.EnabledField.Changed -= _enabledChangedHandler.Read(context);
proxy.Slot.ActiveChanged -= _activeChangedHandler.Read(context);
_enabledChangedHandler.Clear(context);
_activeChangedHandler.Clear(context);
proxy.Active = false;
}
}

protected void UpdateListenerState(FrooxEngineContext context)
{
AudioAdderProxy proxy = GetProxy(context);
if (proxy != null)
{
bool shouldListen = ShouldListen(proxy);
if (shouldListen != ValueListensToChanges)
{
ValueListensToChanges = shouldListen;
context.Group.MarkChangeTrackingDirty();
proxy.Active = shouldListen;
}
}
}

public void Changed(FrooxEngineContext context)
{
AudioAdderProxy proxy = GetProxy(context);
if (proxy == null)
{
return;
}
proxy.AudioInput = AudioInput.Evaluate(context);
proxy.AudioInput2 = AudioInput2.Evaluate(context);
}

protected override void ComputeOutputs(FrooxEngineContext context)
{
AudioAdderProxy proxy = GetProxy(context);
AudioOutput.Write(proxy, context);
}

public AudioAdder()
{
AudioOutput = new ObjectOutput<IWorldAudioDataSource>(this);
}
}
}
109 changes: 4 additions & 105 deletions ProjectObsidian/ProtoFlux/Audio/AudioClamp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,11 @@

namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Audio
{
public class AudioClampProxy : ProtoFluxEngineProxy, Awwdio.IAudioDataSource, IWorldAudioDataSource
public class AudioClampProxy : SingleInputAudioGeneratorNodeProxy
{
public IWorldAudioDataSource AudioInput;
public override int ChannelCount => AudioInput?.ChannelCount ?? 0;

public bool Active;

public bool IsActive => Active;

public int ChannelCount => AudioInput?.ChannelCount ?? 0;

public void Read<S>(Span<S> buffer, AudioSimulator simulator) where S : unmanaged, IAudioSample<S>
public override void Read<S>(Span<S> buffer, AudioSimulator simulator)
{
if (!IsActive || AudioInput == null || !AudioInput.IsActive)
{
Expand All @@ -39,102 +33,7 @@ public void Read<S>(Span<S> buffer, AudioSimulator simulator) where S : unmanage
}
}
[NodeCategory("Obsidian/Audio")]
public class AudioClamp : ProxyVoidNode<FrooxEngineContext, AudioClampProxy>, IExecutionChangeListener<FrooxEngineContext>
public class AudioClamp : SingleInputAudioGeneratorNode<AudioClampProxy>
{
[ChangeListener]
public readonly ObjectInput<IWorldAudioDataSource> AudioInput;

public readonly ObjectOutput<IWorldAudioDataSource> AudioOutput;

private ObjectStore<Action<IChangeable>> _enabledChangedHandler;

private ObjectStore<SlotEvent> _activeChangedHandler;

public bool ValueListensToChanges { get; private set; }

private bool ShouldListen(AudioClampProxy proxy)
{
if (proxy.Enabled)
{
return proxy.Slot.IsActive;
}
return false;
}

protected override void ProxyAdded(AudioClampProxy proxy, FrooxEngineContext context)
{
base.ProxyAdded(proxy, context);
NodeContextPath path = context.CaptureContextPath();
ProtoFluxNodeGroup group = context.Group;
context.GetEventDispatcher(out var dispatcher);
Action<IChangeable> enabledHandler = delegate
{
dispatcher.ScheduleEvent(path, delegate (FrooxEngineContext c)
{
UpdateListenerState(c);
});
};
SlotEvent activeHandler = delegate
{
dispatcher.ScheduleEvent(path, delegate (FrooxEngineContext c)
{
UpdateListenerState(c);
});
};
proxy.EnabledField.Changed += enabledHandler;
proxy.Slot.ActiveChanged += activeHandler;
_enabledChangedHandler.Write(enabledHandler, context);
_activeChangedHandler.Write(activeHandler, context);
ValueListensToChanges = ShouldListen(proxy);
proxy.Active = ValueListensToChanges;
}

protected override void ProxyRemoved(AudioClampProxy proxy, FrooxEngineContext context, bool inUseByAnotherInstance)
{
if (!inUseByAnotherInstance)
{
proxy.EnabledField.Changed -= _enabledChangedHandler.Read(context);
proxy.Slot.ActiveChanged -= _activeChangedHandler.Read(context);
_enabledChangedHandler.Clear(context);
_activeChangedHandler.Clear(context);
proxy.Active = false;
}
}

protected void UpdateListenerState(FrooxEngineContext context)
{
AudioClampProxy proxy = GetProxy(context);
if (proxy != null)
{
bool shouldListen = ShouldListen(proxy);
if (shouldListen != ValueListensToChanges)
{
ValueListensToChanges = shouldListen;
context.Group.MarkChangeTrackingDirty();
proxy.Active = shouldListen;
}
}
}

public void Changed(FrooxEngineContext context)
{
AudioClampProxy proxy = GetProxy(context);
if (proxy == null)
{
return;
}
proxy.AudioInput = AudioInput.Evaluate(context);
}

protected override void ComputeOutputs(FrooxEngineContext context)
{
AudioClampProxy proxy = GetProxy(context);
AudioOutput.Write(proxy, context);
}

public AudioClamp()
{
AudioOutput = new ObjectOutput<IWorldAudioDataSource>(this);
}
}
}
Loading