Improved timing

This commit is contained in:
zumorica
2020-05-20 17:48:36 +02:00
parent 731ab22568
commit 6db9ac7247
2 changed files with 25 additions and 14 deletions

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using Content.Shared.GameObjects.Components.Instruments; using Content.Shared.GameObjects.Components.Instruments;
using JetBrains.Annotations; using JetBrains.Annotations;
using NFluidsynth; using NFluidsynth;
@@ -21,7 +22,7 @@ namespace Content.Client.GameObjects.Components.Instruments
[RegisterComponent] [RegisterComponent]
public class InstrumentComponent : SharedInstrumentComponent public class InstrumentComponent : SharedInstrumentComponent
{ {
public const float TimeBetweenNetMessages = 0.5f; public const float TimeBetweenNetMessages = 1.0f;
/// <summary> /// <summary>
/// Called when a midi song stops playing. /// Called when a midi song stops playing.
@@ -116,7 +117,7 @@ namespace Content.Client.GameObjects.Components.Instruments
{ {
_renderer.MidiProgram = _instrumentProgram; _renderer.MidiProgram = _instrumentProgram;
_renderer.TrackingEntity = Owner; _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(); }); Timer.Spawn(1000, () => { _renderer?.Dispose(); });
_renderer = null; _renderer = null;
_midiQueue.Clear();
} }
protected override void Shutdown() protected override void Shutdown()
@@ -147,24 +149,28 @@ 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 (!IsRendererAlive || IsInputOpen || IsMidiOpen) break; 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++) for (var i = 0; i < midiEventMessage.MidiEvent.Length; i++)
{ {
var ev = midiEventMessage.MidiEvent[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); ev.Timestamp = _gameTiming.CurTime + delta + TimeSpan.FromSeconds(TimeBetweenNetMessages*1.25);
_midiQueue.Enqueue(ev); _midiQueue.Enqueue(ev);
_lastEvent = ev.Timestamp; _lastEvent = ev.Timestamp;
//var j = i; //var j = i;
//Timer.Spawn((int) ((TimeBetweenNetMessages)*1.5f)*1000, //Timer.Spawn((int)ev.Timestamp.Subtract(_gameTiming.CurTime).TotalMilliseconds,
// () => _renderer.SendMidiEvent(midiEventMessage.MidiEvent[j])); // () => _renderer?.SendMidiEvent(midiEventMessage.MidiEvent[j]));
} }
break; break;
case InstrumentStopMidiMessage _: case InstrumentStopMidiMessage _:
_renderer?.StopAllNotes(); _renderer?.StopAllNotes();
if (IsInputOpen) CloseInput(); EndRenderer();
if (IsMidiOpen) CloseMidi();
break; break;
case InstrumentStartMidiMessage _: case InstrumentStartMidiMessage _:
@@ -258,10 +264,15 @@ namespace Content.Client.GameObjects.Components.Instruments
private void UpdatePlaying(float delta) private void UpdatePlaying(float delta)
{ {
if(_renderer == null || _midiQueue.Count == 0) return; while (true)
{
if (_renderer == null || _midiQueue.Count == 0) return;
var midiEvent = _midiQueue.Dequeue(); var midiEvent = _midiQueue.Dequeue();
_renderer.SendMidiEvent(midiEvent); _renderer.SendMidiEvent(midiEvent);
_timer = _midiQueue.Count != 0 ? (float) (midiEvent.Timestamp.Subtract(_gameTiming.CurTime).TotalSeconds) : 0; // ???? TODO: fix this _timer = _midiQueue.Count != 0 ? (MathF.Max((float) midiEvent.Timestamp.Subtract(_gameTiming.CurTime).TotalSeconds, 0f)) : 0;
if (_timer <= 0f) continue;
break;
}
} }
private void SendAllMidiMessages() private void SendAllMidiMessages()

View File

@@ -69,15 +69,15 @@ namespace Content.Server.GameObjects.Components.Instruments
if (!_playing) if (!_playing)
return; return;
if(++_midiEventCount <= MaxMidiEventsPerSecond) if(++_midiEventCount <= MaxMidiEventsPerSecond)
SendNetworkMessage(new InstrumentMidiEventMessage(midiEventMsg.MidiEvent)); SendNetworkMessage(midiEventMsg);
break; break;
case InstrumentStartMidiMessage startMidi: case InstrumentStartMidiMessage startMidi:
_playing = true; _playing = true;
SendNetworkMessage(new InstrumentStartMidiMessage()); SendNetworkMessage(startMidi);
break; break;
case InstrumentStopMidiMessage stopMidi: case InstrumentStopMidiMessage stopMidi:
_playing = false; _playing = false;
SendNetworkMessage(new InstrumentStopMidiMessage()); SendNetworkMessage(stopMidi);
break; break;
} }
} }