103 lines
2.6 KiB
C#
103 lines
2.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Timers;
|
|
using Timer = System.Timers.Timer;
|
|
namespace BITKit
|
|
{
|
|
public enum PlayerState
|
|
{
|
|
None,
|
|
Playing,
|
|
Paused,
|
|
}
|
|
public enum PlayerType
|
|
{
|
|
None,
|
|
Player,
|
|
Recorder,
|
|
}
|
|
public interface IPlayer<TSource>
|
|
{
|
|
void Start();
|
|
void Pause();
|
|
void Stop();
|
|
int GetIndex();
|
|
float GetTime();
|
|
void SetIndex(int index);
|
|
void SetTime(float time);
|
|
PlayerState GetPlayState();
|
|
}
|
|
public class Player<T>
|
|
{
|
|
public int frameRate = 30;
|
|
public PlayerState state;
|
|
protected List<T> list = new();
|
|
public bool isPlaying;
|
|
public event Action onStart;
|
|
public event Action onStop;
|
|
protected T current;
|
|
Timer timer = new() { AutoReset = true };
|
|
public void Start()
|
|
{
|
|
if (isPlaying is false)
|
|
{
|
|
list ??= new();
|
|
timer ??= new();
|
|
isPlaying = true;
|
|
timer.Interval = TimeSpan.FromSeconds(1f / (float)frameRate).Milliseconds;
|
|
timer.Elapsed += Update;
|
|
timer.Start();
|
|
state = PlayerState.Playing;
|
|
OnStart();
|
|
onStart?.Invoke();
|
|
}
|
|
}
|
|
public void Stop()
|
|
{
|
|
if (isPlaying)
|
|
{
|
|
timer.Stop();
|
|
timer.Elapsed -= Update;
|
|
isPlaying = false;
|
|
state = 0;
|
|
OnStop();
|
|
onStop?.Invoke();
|
|
}
|
|
}
|
|
public void Cancel()
|
|
{
|
|
timer?.Stop();
|
|
list?.Clear();
|
|
onStop?.Invoke();
|
|
timer = null;
|
|
isPlaying = false;
|
|
state = 0;
|
|
}
|
|
public void PlayOrPause()
|
|
{
|
|
switch (state)
|
|
{
|
|
case PlayerState.None:
|
|
Start();
|
|
break;
|
|
case PlayerState.Playing:
|
|
state = PlayerState.Paused;
|
|
break;
|
|
case PlayerState.Paused:
|
|
state = PlayerState.Playing;
|
|
break;
|
|
}
|
|
}
|
|
public void Set(T t)
|
|
{
|
|
current = t;
|
|
}
|
|
void Update(object sender, ElapsedEventArgs e)
|
|
{
|
|
OnUpdate();
|
|
}
|
|
protected virtual void OnUpdate() { }
|
|
protected virtual void OnStart() { }
|
|
protected virtual void OnStop() { }
|
|
}
|
|
} |