From 5e3568698b5163108ade8fd8fe2fedfadd52a227 Mon Sep 17 00:00:00 2001 From: bree Date: Thu, 27 Feb 2025 16:33:59 +0100 Subject: [PATCH] More cleanup, and oop I made it render in integer audio, instead of float --- .../Audio/Renderers/AudioRenderer.cs | 8 ++-- .../Audio/Renderers/BASSRenderer.cs | 2 +- .../Extensions/MIDI/MIDIConverter.cs | 45 ++++++++++--------- OmniConverter/Extensions/Settings.cs | 19 +++----- 4 files changed, 37 insertions(+), 37 deletions(-) diff --git a/OmniConverter/Extensions/Audio/Renderers/AudioRenderer.cs b/OmniConverter/Extensions/Audio/Renderers/AudioRenderer.cs index d204168..c055e4e 100644 --- a/OmniConverter/Extensions/Audio/Renderers/AudioRenderer.cs +++ b/OmniConverter/Extensions/Audio/Renderers/AudioRenderer.cs @@ -46,13 +46,13 @@ public abstract class AudioEngine : IDisposable { protected bool _disposed = false; protected bool _init = false; - protected WaveFormat _waveFormat = new(48000, 32, 2); + protected WaveFormat _waveFormat; protected Settings _cachedSettings; public AudioEngine(Settings settings, bool defaultInit = true) { _cachedSettings = settings; - _waveFormat = new(settings.Synth.SampleRate, 32, 2); + _waveFormat = new(settings.Synth.SampleRate, 32, 2, AudioEncoding.IeeeFloat); _init = defaultInit; } @@ -77,8 +77,8 @@ public abstract class AudioRenderer : ISampleSource public string UniqueID { get; protected set; } = IDGenerator.GetID(); public bool CanSeek { get; protected set; } = false; - public WaveFormat WaveFormat { get; protected set; } = new(48000, 32, 2); - public bool Initialized { get; protected set; } = false; + public WaveFormat WaveFormat { get; protected set; } + public bool Initialized { get; protected set; } public bool Disposed { get; protected set; } = false; public ulong ActiveVoices { get; protected set; } = 0; public float RenderingTime { get; protected set; } = 0.0f; diff --git a/OmniConverter/Extensions/Audio/Renderers/BASSRenderer.cs b/OmniConverter/Extensions/Audio/Renderers/BASSRenderer.cs index 02fb8fc..7781887 100644 --- a/OmniConverter/Extensions/Audio/Renderers/BASSRenderer.cs +++ b/OmniConverter/Extensions/Audio/Renderers/BASSRenderer.cs @@ -45,7 +45,7 @@ . .#+ -+- -++. */ - if (Bass.Init(Bass.NoSoundDevice, _cachedSettings.WaveFormat.SampleRate, DeviceInitFlags.Default)) + if (Bass.Init(Bass.NoSoundDevice, _waveFormat.SampleRate, DeviceInitFlags.Default)) { _bassArray = InitializeSoundFonts(); diff --git a/OmniConverter/Extensions/MIDI/MIDIConverter.cs b/OmniConverter/Extensions/MIDI/MIDIConverter.cs index f3c899e..db257b7 100644 --- a/OmniConverter/Extensions/MIDI/MIDIConverter.cs +++ b/OmniConverter/Extensions/MIDI/MIDIConverter.cs @@ -32,8 +32,9 @@ public enum ConvStatus Crash } - private Stopwatch _convElapsedTime = new Stopwatch(); private AudioEngine? _audioRenderer; + + private Stopwatch _convElapsedTime = new Stopwatch(); private MIDIValidator _validator; private CancellationTokenSource _cancToken; private ParallelOptions _parallelOptions; @@ -341,6 +342,8 @@ private void PerMIDIConversion() throw new OperationCanceledException(); var midi = _midis[nMidi]; + var waveFormat = _audioRenderer.GetWaveFormat(); + midi.EnablePooling(); // Begin conversion @@ -369,7 +372,7 @@ private void PerMIDIConversion() if (loaded) { - using (var msm = new MultiStreamMerger(_cachedSettings.WaveFormat)) + using (var msm = new MultiStreamMerger(waveFormat)) { using (var eventsProcesser = new EventsProcesser(_audioRenderer, evs, midi)) { @@ -377,7 +380,7 @@ private void PerMIDIConversion() Dispatcher.UIThread.Post(() => midiPanel = new TaskStatus(midi.Name, _panelRef, eventsProcesser)); - var cvThread = Task.Run(() => eventsProcesser.Process(msm.GetWriter(), _cachedSettings.WaveFormat, _cancToken.Token, f => _validator.AddEvent())); + var cvThread = Task.Run(() => eventsProcesser.Process(msm.GetWriter(), _cancToken.Token, f => _validator.AddEvent())); while (!cvThread.IsCompleted) { @@ -413,16 +416,16 @@ private void PerMIDIConversion() IWaveSource MStream; Limiter BAC; - if (_audLimiter && _cachedSettings.WaveFormat.BitsPerSample == 32) + if (_audLimiter && waveFormat.BitsPerSample == 32) { Debug.PrintToConsole(Debug.LogType.Message, "LoudMax enabled."); BAC = new Limiter(msm, 0.1); - MStream = BAC.ToWaveSource(_cachedSettings.WaveFormat.BitsPerSample); + MStream = BAC.ToWaveSource(waveFormat.BitsPerSample); } - else MStream = msm.ToWaveSource(_cachedSettings.WaveFormat.BitsPerSample); + else MStream = msm.ToWaveSource(waveFormat.BitsPerSample); FileStream FOpen = File.Open(outputFile1, FileMode.Create); - WaveWriter FDestination = new WaveWriter(FOpen, _cachedSettings.WaveFormat); + WaveWriter FDestination = new WaveWriter(FOpen, waveFormat); Debug.PrintToConsole(Debug.LogType.Message, "Output file is open."); int FRead = 0; @@ -511,11 +514,12 @@ private void PerTrackConversion() string folder = _outputPath; var midiData = midi.GetIterateTracksTimeBased(); + var waveFormat = _audioRenderer.GetWaveFormat(); _validator.SetTotalMIDIEvents(midi.TotalEventCount); _validator.SetTotalTracks(midiData.Count()); - using (MultiStreamMerger msm = new(_cachedSettings.WaveFormat)) + using (MultiStreamMerger msm = new(waveFormat)) { // Per track! if (_separateTrackFiles) @@ -556,7 +560,7 @@ private void PerTrackConversion() ISampleWriter sampleWriter; - using (MultiStreamMerger trackMsm = new(_cachedSettings.WaveFormat)) + using (MultiStreamMerger trackMsm = new(waveFormat)) { Debug.PrintToConsole(Debug.LogType.Message, $"ConvertWorker => T{track}, {midi.Length.TotalSeconds}"); @@ -592,7 +596,7 @@ private void PerTrackConversion() { Dispatcher.UIThread.Post(() => trackPanel = new TaskStatus($"Track {track}", _panelRef, eventsProcesser)); - cvThread = Task.Run(() => eventsProcesser.Process(sampleWriter, _cachedSettings.WaveFormat, _cancToken.Token, f => + cvThread = Task.Run(() => eventsProcesser.Process(sampleWriter, _cancToken.Token, f => { _validator.AddEvent(); return _validator.AddMIDIEvent(); @@ -630,17 +634,17 @@ private void PerTrackConversion() trackMsm.Position = 0; IWaveSource exportSource; - if (_audLimiter && _cachedSettings.WaveFormat.BitsPerSample == 32) + if (_audLimiter && waveFormat.BitsPerSample == 32) { Debug.PrintToConsole(Debug.LogType.Message, "LoudMax enabled."); var BAC = new Limiter(trackMsm, 0.1); - exportSource = BAC.ToWaveSource(_cachedSettings.WaveFormat.BitsPerSample); + exportSource = BAC.ToWaveSource(waveFormat.BitsPerSample); } - else exportSource = trackMsm.ToWaveSource(_cachedSettings.WaveFormat.BitsPerSample); + else exportSource = trackMsm.ToWaveSource(waveFormat.BitsPerSample); using (var targetFile = File.Open(outputFile1, FileMode.Create, FileAccess.Write)) { - WaveWriter fileWriter = new WaveWriter(targetFile, _cachedSettings.WaveFormat); + WaveWriter fileWriter = new WaveWriter(targetFile, waveFormat); Debug.PrintToConsole(Debug.LogType.Message, "Output file is open."); int bufRead = 0; @@ -712,17 +716,17 @@ private void PerTrackConversion() // Prepare wave source IWaveSource? MStream = null; - if (_audLimiter && _cachedSettings.WaveFormat.BitsPerSample == 32) + if (_audLimiter && waveFormat.BitsPerSample == 32) { Debug.PrintToConsole(Debug.LogType.Message, "LoudMax enabled."); var BAC = new Limiter(msm, 0.1); - MStream = BAC.ToWaveSource(_cachedSettings.WaveFormat.BitsPerSample); + MStream = BAC.ToWaveSource(waveFormat.BitsPerSample); } - else MStream = msm.ToWaveSource(_cachedSettings.WaveFormat.BitsPerSample); + else MStream = msm.ToWaveSource(waveFormat.BitsPerSample); using (var targetFile = File.Open(outputFile1, FileMode.Create, FileAccess.Write)) { - WaveWriter fileWriter = new WaveWriter(targetFile, _cachedSettings.WaveFormat); + WaveWriter fileWriter = new WaveWriter(targetFile, waveFormat); Debug.PrintToConsole(Debug.LogType.Message, "Output file is open."); int FRead = 0; @@ -863,7 +867,7 @@ protected override void Dispose(bool disposing) _disposed = true; } - public void Process(ISampleWriter output, WaveFormat waveFormat, CancellationToken cancToken, Func? f = null) + public void Process(ISampleWriter output, CancellationToken cancToken, Func? f = null) { var r = new Random(); @@ -880,12 +884,13 @@ public void Process(ISampleWriter output, WaveFormat waveFormat, CancellationTok try { - _midiRenderer = _cachedSettings.GetRenderer(); + _midiRenderer = _cachedSettings.GetRenderer(_audioRenderer); if (_midiRenderer != null) { // _midiRenderer.SystemReset(); + var waveFormat = _midiRenderer.WaveFormat; float[] buffer = new float[256 * waveFormat.BlockAlign]; long prevWriteTime = 0; double deltaTime = 0; diff --git a/OmniConverter/Extensions/Settings.cs b/OmniConverter/Extensions/Settings.cs index 72271ef..cfb2bc6 100644 --- a/OmniConverter/Extensions/Settings.cs +++ b/OmniConverter/Extensions/Settings.cs @@ -250,39 +250,34 @@ public class Settings : ICloneable [JsonProperty("SoundFonts")] public ObservableCollection SoundFontsList = []; - private AudioEngine? _cachedEngine = null; - private WaveFormat? _waveFormat = null; - - public WaveFormat? WaveFormat { get { return _waveFormat; } } - public AudioEngine? GetAudioEngine() { - _waveFormat = new WaveFormat(Synth.SampleRate, 32, 2, AudioEncoding.IeeeFloat); + AudioEngine? audioEngine = null; switch (Renderer) { case EngineID.XSynth: - _cachedEngine = new XSynthEngine(this); + audioEngine = new XSynthEngine(this); break; case EngineID.FluidSynth: - _cachedEngine = new FluidSynthEngine(this); + audioEngine = new FluidSynthEngine(this); break; case EngineID.BASS: - _cachedEngine = new BASSEngine(this); + audioEngine = new BASSEngine(this); break; default: break; } - return _cachedEngine; + return audioEngine; } - public AudioRenderer? GetRenderer() + public AudioRenderer? GetRenderer(AudioEngine? audioEngine) { - switch (_cachedEngine) + switch (audioEngine) { case XSynthEngine xsynth: return new XSynthRenderer(xsynth);