-
-
Notifications
You must be signed in to change notification settings - Fork 83
/
BassEqualizer.cs
134 lines (115 loc) · 4.32 KB
/
BassEqualizer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
using BreadPlayer.Core.Common;
using BreadPlayer.Core.Engines.Interfaces;
using BreadPlayer.Core.Models;
using BreadPlayer.Interfaces;
using ManagedBass;
using ManagedBass.Fx;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
namespace BreadPlayer.Core.Engines.BASSEngine
{
public class BassEqualizer : Equalizer
{
private int _handle;
private DSPProcedure _myDspAddr; // make it global, so that the GC can not remove it
private PeakEQParameters _eq;
private int _fxEq;
public BassEqualizer(int coreHandle)
{
_handle = coreHandle;
var version = BassFx.Version;
IsPreampAvailable = true;
Bands = new ObservableCollection<IEqualizerBand>();
Presets = new ObservableCollection<EqualizerSettings>((IEnumerable<EqualizerSettings>)new ConfigSaver().GetSettings());
EqualizerSettings = InitializeSwitch.EqualizerSettingsHelper.LoadEqualizerSettings("CustomEq").settings;
Name = EqualizerSettings.Name;
SelectedPreset = Presets.IndexOf(Presets.FirstOrDefault(t => t.Name == EqualizerSettings.Name));
IsEnabled = EqualizerSettings == null || EqualizerSettings.IsEnabled;
Init();
this.PropertyChanged += OnPropertyChanged;
}
private void OnPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if(e.PropertyName == "SelectedPreset")
{
ChangePreset(SelectedPreset);
}
}
public void ReInit(int coreHandle)
{
DeInit();
_handle = coreHandle;
var version = BassFx.Version;
_myDspAddr = SetPreamp;
Bass.ChannelSetDSP(_handle, _myDspAddr, IntPtr.Zero, 0);
Init();
}
public override void DeInit()
{
Bass.ChannelRemoveFX(_handle, _fxEq);
}
public override void Dispose()
{
DeInit();
Bands.Clear();
_handle = -1;
_fxEq = -1;
}
public override IEqualizerBand GetEqualizerBand(bool isActive, float centerValue, float bandwithValue, float gainValue)
{
return null;
}
public override void Init(bool setToDefaultValues = false)
{
// Set peaking equalizer effect with no bands
_eq = new PeakEQParameters();
_fxEq = Bass.ChannelSetFX(_handle, EffectType.PeakEQ, 0);
_eq.fQ = 0f;
_eq.fBandwidth = 2.5f;
_eq.lChannel = FXChannelFlags.All;
//init equalizer bands
Bands = new ObservableCollection<IEqualizerBand>();
var gainValues = !setToDefaultValues && EqualizerSettings != null ? EqualizerSettings.GainValues : null;
for (int i = 0; i < EqDefaultValues.Length; i++)
{
_eq.lBand = i;
_eq.fCenter = EqDefaultValues[i][0];
var res = Bass.FXSetParameters(_fxEq, _eq);
var band = new BassEqualizerBand(_fxEq, i, EqDefaultValues[i][0], EqDefaultValues[i][1], IsEnabled);
if (band == null)
{
continue;
}
if (gainValues != null && gainValues.TryGetValue(band.BandCaption, out float savedValue))
{
band.Gain = savedValue;
}
band.PropertyChanged += (sender, e) =>
{
if (e.PropertyName == "Gain")
{
SaveEqualizerSettings();
}
};
Bands.Add(band);
}
}
#region unsafe Methods
private unsafe void SetPreamp(int handle, int channel, IntPtr buffer, int length, IntPtr user)
{
if (Preamp == 1f || length == 0 || buffer == IntPtr.Zero)
{
return;
}
var pointer = (float*)buffer;
var n = length / 4; // float is 4 bytes
for (int i = 0; i < n; ++i)
{
pointer[i] *= Preamp;
}
}
#endregion unsafe Methods
}
}