1
0
Fork 0

Mark AudioClip as nullable

This commit is contained in:
ivan tkachenko 2026-01-11 03:17:21 +02:00
parent afb3e34e71
commit f83f2a72ba
2 changed files with 58 additions and 18 deletions

View File

@ -63,8 +63,8 @@ namespace MuzikaGromche
["Beats"] = audioTrack.Beats,
["LoopOffset"] = audioTrack.LoopOffset,
["Ext"] = audioTrack.Ext,
["FileDurationIntro"] = audioTrack.LoadedIntro.length,
["FileDurationLoop"] = audioTrack.LoadedLoop.length,
["FileDurationIntro"] = audioTrack.LoadedIntro?.length ?? 0f,
["FileDurationLoop"] = audioTrack.LoadedLoop?.length ?? 0f,
["FileNameIntro"] = audioTrack.FileNameIntro,
["FileNameLoop"] = audioTrack.FileNameLoop,
["BeatsOffset"] = audioTrack.BeatsOffset,

View File

@ -1259,21 +1259,47 @@ namespace MuzikaGromche
public float WindUpTimer { get; }
// Estimated number of beats per minute. Not used for light show, but might come in handy.
public float Bpm => 60f / (LoadedLoop.length / Beats);
public float Bpm
{
get
{
if (LoadedLoop == null || LoadedLoop.length <= 0f)
{
return 0f;
}
else
{
return 60f / (LoadedLoop.length / Beats);
}
}
}
// How many beats the loop segment has. The default strategy is to switch color of lights on each beat.
public int Beats { get; }
// Number of beats between WindUpTimer and where looped segment starts (not the loop audio).
public int LoopOffset { get; }
public float LoopOffsetInSeconds => (float)LoopOffset / (float)Beats * LoadedLoop.length;
public float LoopOffsetInSeconds
{
get
{
if (LoadedLoop == null || LoadedLoop.length <= 0f)
{
return 0f;
}
else
{
return (float)LoopOffset / (float)Beats * LoadedLoop.length;
}
}
}
// MPEG is basically mp3, and it can produce gaps at the start.
// WAV is OK, but takes a lot of space. Try OGGVORBIS instead.
public AudioType AudioType { get; }
public AudioClip LoadedIntro { get; internal set; }
public AudioClip LoadedLoop { get; internal set; }
public AudioClip? LoadedIntro { get; internal set; }
public AudioClip? LoadedLoop { get; internal set; }
public string FileNameIntro { get; }
public string FileNameLoop { get; }
@ -1290,7 +1316,20 @@ namespace MuzikaGromche
public float BeatsOffset { get; }
// Offset of beats, in seconds. Bigger offset => colors will change later.
public float BeatsOffsetInSeconds => BeatsOffset / Beats * LoadedLoop.length;
public float BeatsOffsetInSeconds
{
get
{
if (LoadedLoop == null || LoadedLoop.length <= 0f)
{
return 0f;
}
else
{
return BeatsOffset / (float)Beats * LoadedLoop.length;
}
}
}
public float FadeOutBeat { get; }
public float FadeOutDuration { get; }
@ -1329,8 +1368,8 @@ namespace MuzikaGromche
int IAudioTrack.Beats => Track.Beats;
int IAudioTrack.LoopOffset => Track.LoopOffset;
AudioType IAudioTrack.AudioType => Track.AudioType;
AudioClip IAudioTrack.LoadedIntro { get => Track.LoadedIntro; set => Track.LoadedIntro = value; }
AudioClip IAudioTrack.LoadedLoop { get => Track.LoadedLoop; set => Track.LoadedLoop = value; }
AudioClip? IAudioTrack.LoadedIntro { get => Track.LoadedIntro; set => Track.LoadedIntro = value; }
AudioClip? IAudioTrack.LoadedLoop { get => Track.LoadedLoop; set => Track.LoadedLoop = value; }
string IAudioTrack.FileNameIntro => Track.FileNameIntro;
string IAudioTrack.FileNameLoop => Track.FileNameLoop;
float IAudioTrack.BeatsOffset => Track.BeatsOffset;
@ -1364,8 +1403,8 @@ namespace MuzikaGromche
public int LoopOffset { get; init; } = 0;
public AudioType AudioType { get; init; } = AudioType.MPEG;
public AudioClip LoadedIntro { get; set; } = null!;
public AudioClip LoadedLoop { get; set; } = null!;
public AudioClip? LoadedIntro { get; set; } = null;
public AudioClip? LoadedLoop { get; set; } = null;
private string? FileNameIntroOverride = null;
public string FileNameIntro
@ -1442,7 +1481,7 @@ namespace MuzikaGromche
void ISelectableTrack.Debug()
{
Plugin.Log.LogDebug($"Track \"{Name}\", Intro={LoadedIntro.length:N4}, Loop={LoadedLoop.length:N4}");
Plugin.Log.LogDebug($"Track \"{Name}\", Intro={LoadedIntro?.length:N4}, Loop={LoadedLoop?.length:N4}");
}
}
@ -1472,7 +1511,7 @@ namespace MuzikaGromche
Plugin.Log.LogDebug($"Track Group \"{Name}\", Count={Tracks.Length}");
foreach (var (track, index) in Tracks.Select((x, i) => (x, i)))
{
Plugin.Log.LogDebug($" Track {index} \"{track.Name}\", Intro={track.LoadedIntro.length:N4}, Loop={track.LoadedLoop.length:N4}");
Plugin.Log.LogDebug($" Track {index} \"{track.Name}\", Intro={track.LoadedIntro?.length:N4}, Loop={track.LoadedLoop?.length:N4}");
}
}
}
@ -1839,7 +1878,7 @@ namespace MuzikaGromche
float timeSinceStartOfLoop = time - offset;
var adjustedTimeNormalized = timeSinceStartOfLoop / LoopLength;
var adjustedTimeNormalized = (LoopLength <= 0f) ? 0f : timeSinceStartOfLoop / LoopLength;
var beat = adjustedTimeNormalized * Beats;
@ -1887,9 +1926,10 @@ namespace MuzikaGromche
LyricsRandomPerLoop = LyricsRandom.Next();
}
this.track = track;
AudioState = new(track.LoadedIntro.length);
WindUpLoopingState = new(track.WindUpTimer, track.LoadedLoop.length, track.Beats);
LoopLoopingState = new(track.WindUpTimer + track.LoopOffsetInSeconds, track.LoadedLoop.length, track.Beats);
AudioState = new(track.LoadedIntro?.length ?? 0f);
var loadedLoopLength = track.LoadedLoop?.length ?? 0f;
WindUpLoopingState = new(track.WindUpTimer, loadedLoopLength, track.Beats);
LoopLoopingState = new(track.WindUpTimer + track.LoopOffsetInSeconds, loadedLoopLength, track.Beats);
}
public List<BaseEvent> Update(AudioSource intro, AudioSource loop)
@ -3074,7 +3114,7 @@ namespace MuzikaGromche
var introAudioSource = behaviour.IntroAudioSource;
var loopAudioSource = behaviour.LoopAudioSource;
if (behaviour.CurrentTrack == null)
if (behaviour.CurrentTrack == null || behaviour.CurrentTrack.LoadedIntro == null || behaviour.CurrentTrack.LoadedLoop == null)
{
#if DEBUG
Plugin.Log.LogError("CurrentTrack is not set!");