From 6db9ac7247715608968c0acb60188e7d955d7d39 Mon Sep 17 00:00:00 2001 From: zumorica Date: Wed, 20 May 2020 17:48:36 +0200 Subject: [PATCH] Improved timing --- .../Instruments/InstrumentComponent.cs | 33 ++++++++++++------- .../Instruments/InstrumentComponent.cs | 6 ++-- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/Content.Client/GameObjects/Components/Instruments/InstrumentComponent.cs b/Content.Client/GameObjects/Components/Instruments/InstrumentComponent.cs index 59b77de12d..fe10eb1dec 100644 --- a/Content.Client/GameObjects/Components/Instruments/InstrumentComponent.cs +++ b/Content.Client/GameObjects/Components/Instruments/InstrumentComponent.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Content.Shared.GameObjects.Components.Instruments; using JetBrains.Annotations; using NFluidsynth; @@ -21,7 +22,7 @@ namespace Content.Client.GameObjects.Components.Instruments [RegisterComponent] public class InstrumentComponent : SharedInstrumentComponent { - public const float TimeBetweenNetMessages = 0.5f; + public const float TimeBetweenNetMessages = 1.0f; /// /// Called when a midi song stops playing. @@ -116,7 +117,7 @@ namespace Content.Client.GameObjects.Components.Instruments { _renderer.MidiProgram = _instrumentProgram; _renderer.TrackingEntity = Owner; - _renderer.OnMidiPlayerFinished += () => { OnMidiPlaybackEnded?.Invoke(); }; + _renderer.OnMidiPlayerFinished += () => { OnMidiPlaybackEnded?.Invoke(); EndRenderer(); SendNetworkMessage(new InstrumentStopMidiMessage()); }; } } @@ -124,6 +125,7 @@ namespace Content.Client.GameObjects.Components.Instruments { Timer.Spawn(1000, () => { _renderer?.Dispose(); }); _renderer = null; + _midiQueue.Clear(); } protected override void Shutdown() @@ -147,24 +149,28 @@ namespace Content.Client.GameObjects.Components.Instruments case InstrumentMidiEventMessage midiEventMessage: // If we're the ones sending the MidiEvents, we ignore this message. if (!IsRendererAlive || IsInputOpen || IsMidiOpen) break; + Logger.Info($"NEW BATCH!!! LENGTH:{midiEventMessage.MidiEvent.Length} QUEUED:{_midiQueue.Count} LAST:{_lastEvent}"); for (var i = 0; i < midiEventMessage.MidiEvent.Length; i++) { var ev = midiEventMessage.MidiEvent[i]; - var delta = i != 0 ? ev.Timestamp.Subtract(midiEventMessage.MidiEvent[i-1].Timestamp) : _lastEvent.HasValue ? ev.Timestamp.Subtract(_lastEvent.Value) : TimeSpan.Zero; + var delta = i != 0 ? + ev.Timestamp.Subtract(midiEventMessage.MidiEvent[i-1].Timestamp) : _lastEvent.HasValue ? ev.Timestamp.Subtract(_lastEvent.Value) : TimeSpan.Zero; ev.Timestamp = _gameTiming.CurTime + delta + TimeSpan.FromSeconds(TimeBetweenNetMessages*1.25); _midiQueue.Enqueue(ev); _lastEvent = ev.Timestamp; //var j = i; - //Timer.Spawn((int) ((TimeBetweenNetMessages)*1.5f)*1000, - // () => _renderer.SendMidiEvent(midiEventMessage.MidiEvent[j])); + //Timer.Spawn((int)ev.Timestamp.Subtract(_gameTiming.CurTime).TotalMilliseconds, + // () => _renderer?.SendMidiEvent(midiEventMessage.MidiEvent[j])); } + + + break; case InstrumentStopMidiMessage _: _renderer?.StopAllNotes(); - if (IsInputOpen) CloseInput(); - if (IsMidiOpen) CloseMidi(); + EndRenderer(); break; case InstrumentStartMidiMessage _: @@ -258,10 +264,15 @@ namespace Content.Client.GameObjects.Components.Instruments private void UpdatePlaying(float delta) { - if(_renderer == null || _midiQueue.Count == 0) return; - var midiEvent = _midiQueue.Dequeue(); - _renderer.SendMidiEvent(midiEvent); - _timer = _midiQueue.Count != 0 ? (float) (midiEvent.Timestamp.Subtract(_gameTiming.CurTime).TotalSeconds) : 0; // ???? TODO: fix this + while (true) + { + if (_renderer == null || _midiQueue.Count == 0) return; + var midiEvent = _midiQueue.Dequeue(); + _renderer.SendMidiEvent(midiEvent); + _timer = _midiQueue.Count != 0 ? (MathF.Max((float) midiEvent.Timestamp.Subtract(_gameTiming.CurTime).TotalSeconds, 0f)) : 0; + if (_timer <= 0f) continue; + break; + } } private void SendAllMidiMessages() diff --git a/Content.Server/GameObjects/Components/Instruments/InstrumentComponent.cs b/Content.Server/GameObjects/Components/Instruments/InstrumentComponent.cs index 32768d10ae..1fd5e8eff6 100644 --- a/Content.Server/GameObjects/Components/Instruments/InstrumentComponent.cs +++ b/Content.Server/GameObjects/Components/Instruments/InstrumentComponent.cs @@ -69,15 +69,15 @@ namespace Content.Server.GameObjects.Components.Instruments if (!_playing) return; if(++_midiEventCount <= MaxMidiEventsPerSecond) - SendNetworkMessage(new InstrumentMidiEventMessage(midiEventMsg.MidiEvent)); + SendNetworkMessage(midiEventMsg); break; case InstrumentStartMidiMessage startMidi: _playing = true; - SendNetworkMessage(new InstrumentStartMidiMessage()); + SendNetworkMessage(startMidi); break; case InstrumentStopMidiMessage stopMidi: _playing = false; - SendNetworkMessage(new InstrumentStopMidiMessage()); + SendNetworkMessage(stopMidi); break; } }