Skip to content

Commit

Permalink
Refactored Playback
Browse files Browse the repository at this point in the history
  • Loading branch information
melanchall committed Jan 31, 2025
1 parent 7900406 commit 769e48a
Show file tree
Hide file tree
Showing 22 changed files with 2,154 additions and 1,986 deletions.
303 changes: 18 additions & 285 deletions DryWetMidi.Tests/Multimedia/Playback/PlaybackTests.Asserts.cs

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public void CustomPlayback_PlayCustomObject()
{
var actualMetadata = new List<(MidiEvent, object)>();

using (var playback = new CustomObjectsPlayback(new[] { new CustomTimedObject() }, TempoMap.Default))
using (var playback = new CustomObjectsPlayback(new[] { new CustomTimedObject() }, TempoMap))
{
playback.EventPlayed += (_, e) => actualMetadata.Add((e.Event, e.Metadata));

Expand Down
111 changes: 73 additions & 38 deletions DryWetMidi.Tests/Multimedia/Playback/PlaybackTests.EventCallback.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
using Melanchall.DryWetMidi.Multimedia;
using Melanchall.DryWetMidi.Core;
using NUnit.Framework;
using Melanchall.DryWetMidi.Interaction;
using System.Collections.Generic;

namespace Melanchall.DryWetMidi.Tests.Multimedia
{
Expand All @@ -27,98 +29,131 @@ public sealed partial class PlaybackTests
public void EventCallback_ReturnNull()
{
CheckEventCallback(
eventsToSend: new[]
initialPlaybackObjects: new[]
{
new EventToSend(new ProgramChangeEvent((SevenBitNumber)33), TimeSpan.FromMilliseconds(200)),
new EventToSend(new StopEvent(), TimeSpan.FromMilliseconds(200))
new TimedEvent(new ProgramChangeEvent((SevenBitNumber)33)).SetTime((MetricTimeSpan)TimeSpan.FromMilliseconds(200), TempoMap),
new TimedEvent(new StopEvent()).SetTime((MetricTimeSpan)TimeSpan.FromMilliseconds(400), TempoMap),
},
expectedReceivedEvents: new ReceivedEvent[] { },
changeCallbackAfter: TimeSpan.FromMilliseconds(250),
eventCallback: (e, rt, t) => null,
secondEventCallback: (e, rt, t) => null);
initialEventCallback: (e, rt, t) => null,
actions: new[]
{
new PlaybackChangerBase(TimeSpan.FromMilliseconds(250),
p => p.EventCallback = (e, rt, t) => null),
},
expectedReceivedEvents: new ReceivedEvent[] { });
}

[Retry(RetriesNumber)]
[Test]
public void EventCallback_WithNotes_ReturnNull()
{
CheckEventCallback(
eventsToSend: new[]
initialPlaybackObjects: new[]
{
new EventToSend(new NoteOnEvent(), TimeSpan.Zero),
new EventToSend(new NoteOffEvent(), TimeSpan.FromMilliseconds(200)),
new EventToSend(new ProgramChangeEvent((SevenBitNumber)33), TimeSpan.FromMilliseconds(200))
new TimedEvent(new NoteOnEvent()).SetTime((MetricTimeSpan)TimeSpan.FromMilliseconds(0), TempoMap),
new TimedEvent(new NoteOffEvent()).SetTime((MetricTimeSpan)TimeSpan.FromMilliseconds(200), TempoMap),
new TimedEvent(new ProgramChangeEvent((SevenBitNumber)33)).SetTime((MetricTimeSpan)TimeSpan.FromMilliseconds(233), TempoMap),
},
initialEventCallback: (e, rt, t) => null,
actions: new[]
{
new PlaybackChangerBase(TimeSpan.FromMilliseconds(250),
p => p.EventCallback = (e, rt, t) => null),
},
expectedReceivedEvents: new[]
{
new ReceivedEvent(new NoteOnEvent(), TimeSpan.Zero),
new ReceivedEvent(new NoteOffEvent(), TimeSpan.FromMilliseconds(200))
},
changeCallbackAfter: TimeSpan.FromMilliseconds(250),
eventCallback: (e, rt, t) => null,
secondEventCallback: (e, rt, t) => null);
});
}

[Retry(RetriesNumber)]
[Test]
public void EventCallback_ReturnNull_ReturnOriginal()
{
CheckEventCallback(
eventsToSend: new[]
initialPlaybackObjects: new[]
{
new EventToSend(new ProgramChangeEvent((SevenBitNumber)33), TimeSpan.FromMilliseconds(200)),
new EventToSend(new StopEvent(), TimeSpan.FromMilliseconds(200))
new TimedEvent(new ProgramChangeEvent((SevenBitNumber)33)).SetTime((MetricTimeSpan)TimeSpan.FromMilliseconds(200), TempoMap),
new TimedEvent(new StopEvent()).SetTime((MetricTimeSpan)TimeSpan.FromMilliseconds(400), TempoMap),
},
initialEventCallback: (e, rt, t) => null,
actions: new[]
{
new PlaybackChangerBase(TimeSpan.FromMilliseconds(250),
p => p.EventCallback = (e, rt, t) => e),
},
expectedReceivedEvents: new[]
{
new ReceivedEvent(new StopEvent(), TimeSpan.FromMilliseconds(400))
},
changeCallbackAfter: TimeSpan.FromMilliseconds(250),
eventCallback: (e, rt, t) => null,
secondEventCallback: (e, rt, t) => e);
});
}

[Retry(RetriesNumber)]
[Test]
public void EventCallback_ReturnOriginal_ReturnNull()
{
CheckEventCallback(
eventsToSend: new[]
initialPlaybackObjects: new[]
{
new TimedEvent(new ProgramChangeEvent((SevenBitNumber)33)).SetTime((MetricTimeSpan)TimeSpan.FromMilliseconds(200), TempoMap),
new TimedEvent(new StopEvent()).SetTime((MetricTimeSpan)TimeSpan.FromMilliseconds(400), TempoMap),
},
initialEventCallback: (e, rt, t) => e,
actions: new[]
{
new EventToSend(new ProgramChangeEvent((SevenBitNumber)33), TimeSpan.FromMilliseconds(200)),
new EventToSend(new StopEvent(), TimeSpan.FromMilliseconds(200))
new PlaybackChangerBase(TimeSpan.FromMilliseconds(250),
p => p.EventCallback = (e, rt, t) => null),
},
expectedReceivedEvents: new[]
{
new ReceivedEvent(new ProgramChangeEvent((SevenBitNumber)33), TimeSpan.FromMilliseconds(200))
},
changeCallbackAfter: TimeSpan.FromMilliseconds(250),
eventCallback: (e, rt, t) => e,
secondEventCallback: (e, rt, t) => null);
});
}

[Retry(RetriesNumber)]
[Test]
public void EventCallback_ReturnOriginal_ReturnNew()
{
CheckEventCallback(
eventsToSend: new[]
initialPlaybackObjects: new[]
{
new TimedEvent(new NoteOnEvent()).SetTime((MetricTimeSpan)TimeSpan.FromMilliseconds(0), TempoMap),
new TimedEvent(new NoteOffEvent()).SetTime((MetricTimeSpan)TimeSpan.FromMilliseconds(200), TempoMap),
new TimedEvent(new ProgramChangeEvent((SevenBitNumber)33)).SetTime((MetricTimeSpan)TimeSpan.FromMilliseconds(500), TempoMap),
new TimedEvent(new StopEvent()).SetTime((MetricTimeSpan)TimeSpan.FromMilliseconds(600), TempoMap),
},
initialEventCallback: (e, rt, t) => e,
actions: new[]
{
new EventToSend(new NoteOnEvent(), TimeSpan.Zero),
new EventToSend(new NoteOffEvent(), TimeSpan.FromMilliseconds(200)),
new EventToSend(new ProgramChangeEvent((SevenBitNumber)33), TimeSpan.FromMilliseconds(300)),
new EventToSend(new StopEvent(), TimeSpan.FromMilliseconds(100))
new PlaybackChangerBase(TimeSpan.FromMilliseconds(550),
p => p.EventCallback = EventCallback),
},
expectedReceivedEvents: new[]
{
new ReceivedEvent(new NoteOnEvent(), TimeSpan.Zero),
new ReceivedEvent(new NoteOffEvent(), TimeSpan.FromMilliseconds(200)),
new ReceivedEvent(new ProgramChangeEvent((SevenBitNumber)33), TimeSpan.FromMilliseconds(500)),
new ReceivedEvent(MidiEvent, TimeSpan.FromMilliseconds(600))
},
changeCallbackAfter: TimeSpan.FromMilliseconds(550),
eventCallback: (e, rt, t) => e,
secondEventCallback: EventCallback);
});
}

#endregion

#region Private methods

private void CheckEventCallback(
ICollection<ITimedObject> initialPlaybackObjects,
EventCallback initialEventCallback,
PlaybackChangerBase[] actions,
ICollection<ReceivedEvent> expectedReceivedEvents)
{
CheckPlayback(
useOutputDevice: false,
initialPlaybackObjects: initialPlaybackObjects,
actions: actions,
expectedReceivedEvents: expectedReceivedEvents,
setupPlayback: playback => playback.EventCallback = initialEventCallback);
}

#endregion
Expand Down
Loading

0 comments on commit 769e48a

Please sign in to comment.