using System.Collections;
using Ichni.RhythmGame;
using UnityEngine;
using UnityEngine.InputSystem;
namespace Ichni.Editor
{
///
/// 编辑器的音乐播放控制器。
/// 实现 ISongTimeProvider,作为编辑器的标准时间来源,
/// 在 EditorManager.Awake 中注册到 CoreServices.TimeProvider。
///
public class MusicPlayer : MonoBehaviour, ISongTimeProvider
{
#region [ISongTimeProvider 实现] ISongTimeProvider Implementation
/// 当前播放进度(秒),已扣除 offset,供 CoreServices.TimeProvider 使用
public float SongTime => EditorManager.instance != null ? EditorManager.instance.songInformation.songTime : 0;
/// 当前是否正在播放
public bool IsPlaying => isPlaying;
#endregion
#region [运行时缓存数据] Property Caches
public bool isDebugging;
public bool isPlaying;
public AudioSource audioSource;
private float DspTime => (float)AudioSettings.dspTime;
public AudioHighPassFilter highPassFilter;
public AudioLowPassFilter lowPassFilter;
#endregion
#region [生命周期] Lifecycle
private void Update()
{
if (isDebugging)
{
EditorManager.instance.songInformation.songTime += Time.deltaTime;
return;
}
if (isPlaying)
{
EditorManager.instance.songInformation.songTime =
audioSource.time - EditorManager.instance.songInformation.offset;
}
}
#endregion
#region [播放控制] Playback Control
public void PlayMusic()
{
isPlaying = !isPlaying;
audioSource.time = EditorManager.instance.songInformation.songTime +
EditorManager.instance.songInformation.offset;
if (isPlaying)
{
Trail.FreezeAllTrails(!isPlaying);
audioSource.Play();
}
else PauseMusic();
}
public IEnumerator PlayBackMusic()
{
float startt = audioSource.time - EditorManager.instance.songInformation.offset;
PlayMusic();
yield return new WaitUntil(() => Keyboard.current.rightAltKey.wasReleasedThisFrame);
audioSource.time = startt + EditorManager.instance.songInformation.offset;
PauseMusic();
}
public void PauseMusic()
{
if (isPlaying)
{
EditorManager.instance.songInformation.songTime =
audioSource.time - EditorManager.instance.songInformation.offset;
}
isPlaying = false;
audioSource.Pause();
Trail.FreezeAllTrails(!isPlaying);
}
public void StopMusic()
{
isPlaying = false;
EditorManager.instance.songInformation.songTime = 0;
audioSource.Stop();
}
#endregion
}
}