More refactors

This commit is contained in:
zumorica
2020-05-20 15:15:17 +02:00
parent fede057bc4
commit 400a71f8a1
4 changed files with 69 additions and 12 deletions

View File

@@ -33,7 +33,7 @@ namespace Content.Client.GameObjects.Components.Instruments
[CanBeNull] [CanBeNull]
private IMidiRenderer _renderer; private IMidiRenderer _renderer;
private int _instrumentProgram = 1; private byte _instrumentProgram = 1;
[ViewVariables] [ViewVariables]
private readonly Queue<ValueTuple<MidiEvent, double>> _midiQueue = new Queue<(MidiEvent, double)>(); private readonly Queue<ValueTuple<MidiEvent, double>> _midiQueue = new Queue<(MidiEvent, double)>();
@@ -66,7 +66,7 @@ namespace Content.Client.GameObjects.Components.Instruments
/// Changes the instrument the midi renderer will play. /// Changes the instrument the midi renderer will play.
/// </summary> /// </summary>
[ViewVariables(VVAccess.ReadWrite)] [ViewVariables(VVAccess.ReadWrite)]
public int InstrumentProgram public byte InstrumentProgram
{ {
get => _instrumentProgram; get => _instrumentProgram;
set set
@@ -91,10 +91,23 @@ namespace Content.Client.GameObjects.Components.Instruments
[ViewVariables] [ViewVariables]
public bool IsInputOpen => _renderer?.Status == MidiRendererStatus.Input; public bool IsInputOpen => _renderer?.Status == MidiRendererStatus.Input;
/// <summary>
/// Whether the midi renderer is alive or not.
/// </summary>
[ViewVariables]
public bool IsRendererAlive => _renderer != null;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
IoCManager.InjectDependencies(this); IoCManager.InjectDependencies(this);
}
protected void SetupRenderer()
{
if (IsRendererAlive)
return;
_renderer = _midiManager.GetNewRenderer(); _renderer = _midiManager.GetNewRenderer();
if (_renderer != null) if (_renderer != null)
@@ -105,16 +118,22 @@ namespace Content.Client.GameObjects.Components.Instruments
} }
} }
protected void EndRenderer()
{
Timer.Spawn(1000, () => { _renderer?.Dispose(); });
_renderer = null;
}
protected override void Shutdown() protected override void Shutdown()
{ {
base.Shutdown(); base.Shutdown();
_renderer?.Dispose(); EndRenderer();
} }
public override void ExposeData(ObjectSerializer serializer) public override void ExposeData(ObjectSerializer serializer)
{ {
base.ExposeData(serializer); base.ExposeData(serializer);
serializer.DataField(ref _instrumentProgram, "program", 1); serializer.DataField(ref _instrumentProgram, "program", (byte)1);
} }
public override void HandleNetworkMessage(ComponentMessage message, INetChannel channel, ICommonSession session = null) public override void HandleNetworkMessage(ComponentMessage message, INetChannel channel, ICommonSession session = null)
@@ -130,7 +149,7 @@ namespace Content.Client.GameObjects.Components.Instruments
{ {
case InstrumentMidiEventMessage midiEventMessage: case InstrumentMidiEventMessage midiEventMessage:
// If we're the ones sending the MidiEvents, we ignore this message. // If we're the ones sending the MidiEvents, we ignore this message.
if (IsInputOpen || IsMidiOpen) break; if (!IsRendererAlive || IsInputOpen || IsMidiOpen) break;
for (var i = 0; i < midiEventMessage.MidiEvent.Length; i++) for (var i = 0; i < midiEventMessage.MidiEvent.Length; i++)
{ {
//_midiQueue.Enqueue((midiEventMessage.MidiEvent[i], (i == 0 ? 0 : 0) + _gameTiming.CurTime.TotalSeconds - midiEventMessage.Timestamp[i])); //_midiQueue.Enqueue((midiEventMessage.MidiEvent[i], (i == 0 ? 0 : 0) + _gameTiming.CurTime.TotalSeconds - midiEventMessage.Timestamp[i]));
@@ -146,12 +165,19 @@ namespace Content.Client.GameObjects.Components.Instruments
if (IsInputOpen) CloseInput(); if (IsInputOpen) CloseInput();
if (IsMidiOpen) CloseMidi(); if (IsMidiOpen) CloseMidi();
break; break;
case InstrumentStartMidiMessage _:
SetupRenderer();
break;
} }
} }
/// <inheritdoc cref="MidiRenderer.OpenInput"/> /// <inheritdoc cref="MidiRenderer.OpenInput"/>
public bool OpenInput() public bool OpenInput()
{ {
SetupRenderer();
SendNetworkMessage(new InstrumentStartMidiMessage());
if (_renderer != null && _renderer.OpenInput()) if (_renderer != null && _renderer.OpenInput())
{ {
_renderer.OnMidiEvent += RendererOnMidiEvent; _renderer.OnMidiEvent += RendererOnMidiEvent;
@@ -169,13 +195,16 @@ namespace Content.Client.GameObjects.Components.Instruments
return false; return false;
} }
_renderer.OnMidiEvent -= RendererOnMidiEvent; EndRenderer();
return true; return true;
} }
/// <inheritdoc cref="MidiRenderer.OpenMidi(string)"/> /// <inheritdoc cref="MidiRenderer.OpenMidi(string)"/>
public bool OpenMidi(string filename) public bool OpenMidi(string filename)
{ {
SetupRenderer();
SendNetworkMessage(new InstrumentStartMidiMessage());
if (_renderer == null || !_renderer.OpenMidi(filename)) if (_renderer == null || !_renderer.OpenMidi(filename))
{ {
return false; return false;
@@ -193,7 +222,7 @@ namespace Content.Client.GameObjects.Components.Instruments
return false; return false;
} }
_renderer.OnMidiEvent -= RendererOnMidiEvent; EndRenderer();
return true; return true;
} }
@@ -206,7 +235,7 @@ namespace Content.Client.GameObjects.Components.Instruments
_midiQueue.Enqueue((midiEvent, _gameTiming.CurTime.TotalSeconds)); _midiQueue.Enqueue((midiEvent, _gameTiming.CurTime.TotalSeconds));
} }
public void Update(float delta) public override void Update(float delta)
{ {
_timer -= delta; _timer -= delta;

View File

@@ -18,12 +18,17 @@ namespace Content.Server.GameObjects.Components.Instruments
public class InstrumentComponent : SharedInstrumentComponent, public class InstrumentComponent : SharedInstrumentComponent,
IDropped, IHandSelected, IHandDeselected, IActivate, IUse, IThrown IDropped, IHandSelected, IHandDeselected, IActivate, IUse, IThrown
{ {
public const int MidiEventsPerSecond = 10;
/// <summary> /// <summary>
/// The client channel currently playing the instrument, or null if there's none. /// The client channel currently playing the instrument, or null if there's none.
/// </summary> /// </summary>
private ICommonSession _instrumentPlayer; private ICommonSession _instrumentPlayer;
private bool _handheld; private bool _handheld;
private float _timer = 0f;
private int _midiEventCount = 1;
[ViewVariables] [ViewVariables]
private BoundUserInterface _userInterface; private BoundUserInterface _userInterface;
@@ -57,6 +62,12 @@ namespace Content.Server.GameObjects.Components.Instruments
case InstrumentMidiEventMessage midiEventMsg: case InstrumentMidiEventMessage midiEventMsg:
SendNetworkMessage(midiEventMsg); SendNetworkMessage(midiEventMsg);
break; break;
case InstrumentStartMidiMessage startMidi:
SendNetworkMessage(startMidi);
break;
case InstrumentStopMidiMessage stopMidi:
SendNetworkMessage(stopMidi);
break;
} }
} }
@@ -124,5 +135,10 @@ namespace Content.Server.GameObjects.Components.Instruments
{ {
_userInterface.Open(session); _userInterface.Open(session);
} }
public override void Update(float delta)
{
base.Update(delta);
}
} }
} }

View File

@@ -9,6 +9,10 @@ namespace Content.Shared.GameObjects.Components.Instruments
{ {
public override string Name => "Instrument"; public override string Name => "Instrument";
public override uint? NetID => ContentNetIDs.INSTRUMENTS; public override uint? NetID => ContentNetIDs.INSTRUMENTS;
public virtual void Update(float delta)
{
}
} }
@@ -20,6 +24,14 @@ namespace Content.Shared.GameObjects.Components.Instruments
{ {
} }
/// <summary>
/// This message is sent to the client to start the synth.
/// </summary>
[Serializable, NetSerializable]
public class InstrumentStartMidiMessage : ComponentMessage
{
}
/// <summary> /// <summary>
/// This message carries a MidiEvent to be played on clients. /// This message carries a MidiEvent to be played on clients.
/// </summary> /// </summary>

View File

@@ -1,15 +1,15 @@
using Content.Client.GameObjects.Components.Instruments; using Content.Shared.GameObjects.Components.Instruments;
using Robust.Shared.GameObjects; using Robust.Shared.GameObjects;
using Robust.Shared.GameObjects.Systems; using Robust.Shared.GameObjects.Systems;
namespace Content.Client.GameObjects.EntitySystems namespace Content.Shared.GameObjects.EntitySystems
{ {
public class InstrumentSystem : EntitySystem public class InstrumentSystem : EntitySystem
{ {
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
EntityQuery = new TypeEntityQuery(typeof(InstrumentComponent)); EntityQuery = new TypeEntityQuery(typeof(SharedInstrumentComponent));
} }
public override void Update(float frameTime) public override void Update(float frameTime)
@@ -18,7 +18,7 @@ namespace Content.Client.GameObjects.EntitySystems
foreach (var entity in RelevantEntities) foreach (var entity in RelevantEntities)
{ {
entity.GetComponent<InstrumentComponent>().Update(frameTime); entity.GetComponent<SharedInstrumentComponent>().Update(frameTime);
} }
} }
} }