Skip to content

Commit

Permalink
Bug Fix: Solve outstanding Equalizer bugs
Browse files Browse the repository at this point in the history
This includes setting and unsetting the equalizer DSP chain objects on
track change and advancing on track playback end, and also bugs with
applying equalizer presets to the band configuration items when the
equalizer is disabled or when playback is stopped.

Fixes #420

Signed-off-by: Christopher Snowhill <[email protected]>
  • Loading branch information
kode54 committed Feb 24, 2025
1 parent fa34d46 commit 375b019
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 16 deletions.
1 change: 0 additions & 1 deletion Application/PlaybackController.m
Original file line number Diff line number Diff line change
Expand Up @@ -729,7 +729,6 @@ - (IBAction)tempoUp:(id)sender {
}

- (void)audioPlayer:(AudioPlayer *)player displayEqualizer:(AudioUnit)eq {

if(_eq && _eq != eq) {
[equalizerWindowController setEQ:nil];
}
Expand Down
39 changes: 30 additions & 9 deletions Audio/Chain/DSP/DSPEqualizerNode.m
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,16 @@

static void * kDSPEqualizerNodeContext = &kDSPEqualizerNodeContext;

@interface EQObject : NSObject {
AudioUnit eq;
}
@property AudioUnit eq;
@end

@implementation EQObject
@synthesize eq;
@end

@interface EQHookContainer : NSObject {
NSMutableArray *equalizers;
}
Expand Down Expand Up @@ -60,23 +70,30 @@ - (id)init {

- (void)pushEqualizer:(AudioUnit)eq forPlayer:(AudioPlayer *)audioPlayer {
@synchronized (equalizers) {
[equalizers addObject:@((uintptr_t)eq)];
EQObject *_eq = [[EQObject alloc] init];
_eq.eq = eq;
[equalizers addObject:_eq];
if([equalizers count] == 1) {
[audioPlayer beginEqualizer:eq];
} else {
[audioPlayer refreshEqualizer:eq];
}
}
}

- (void)popEqualizer:(AudioUnit)eq forPlayer:(AudioPlayer *)audioPlayer {
@synchronized (equalizers) {
uintptr_t _eq = [[equalizers objectAtIndex:0] unsignedIntegerValue];
if(eq == (AudioUnit)_eq) {
[equalizers removeObject:@(_eq)];
if([equalizers count]) {
_eq = [[equalizers objectAtIndex:0] unsignedIntegerValue];
[audioPlayer beginEqualizer:(AudioUnit)_eq];
for(EQObject *_eq in equalizers) {
if(_eq.eq == eq) {
[equalizers removeObject:_eq];
break;
}
}
[audioPlayer endEqualizer:eq];
if([equalizers count]) {
EQObject *_eq = [equalizers objectAtIndex:0];
[audioPlayer beginEqualizer:_eq.eq];
}
}
}

Expand All @@ -87,6 +104,8 @@ @implementation DSPEqualizerNode {
BOOL equalizerInitialized;

double equalizerPreamp;

__weak AudioPlayer *audioPlayer;

AudioUnit _eq;

Expand Down Expand Up @@ -148,6 +167,9 @@ - (id _Nullable)initWithController:(id _Nonnull)c previous:(id _Nullable)p laten
float preamp = [defaults floatForKey:@"eqPreamp"];
equalizerPreamp = pow(10.0, preamp / 20.0);

BufferChain *bufferChain = c;
audioPlayer = [bufferChain controller];

[self addObservers];
}
return self;
Expand Down Expand Up @@ -192,8 +214,7 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N
}

- (AudioPlayer *)audioPlayer {
BufferChain *bufferChain = controller;
return [bufferChain controller];
return audioPlayer;
}

- (BOOL)fullInit {
Expand Down
18 changes: 12 additions & 6 deletions Equalizer/EqualizerWindowController.m
Original file line number Diff line number Diff line change
Expand Up @@ -281,26 +281,32 @@ void equalizerLoadPreset(AudioUnit au) {
}

void equalizerApplyPreset(AudioUnit au, const NSDictionary *preset) {
if(au && preset) {
if(preset) {
@synchronized(cog_equalizer_band_settings) {
if(!cog_equalizer_band_settings)
cog_equalizer_band_settings = _cog_equalizer_band_settings();
}

AudioUnitParameterValue paramValue = 0;
if(AudioUnitGetParameter(au, kGraphicEQParam_NumberOfBands, kAudioUnitScope_Global, 0, &paramValue))
return;
if(au) {
AudioUnitParameterValue paramValue = 0;
if(AudioUnitGetParameter(au, kGraphicEQParam_NumberOfBands, kAudioUnitScope_Global, 0, &paramValue))
return;
}

float presetValues[31];
interpolateBands(presetValues, preset);

float preamp = getPreamp(preset);

[[NSUserDefaults standardUserDefaults] setFloat:preamp forKey:[cog_equalizer_band_settings objectAtIndex:0]];
AudioUnitSetParameter(au, kGraphicEQParam_NumberOfBands, kAudioUnitScope_Global, 0, 1, 0);
if(au) {
AudioUnitSetParameter(au, kGraphicEQParam_NumberOfBands, kAudioUnitScope_Global, 0, 1, 0);
}
for(unsigned int i = 0; i < 31; ++i) {
[[NSUserDefaults standardUserDefaults] setFloat:presetValues[i] forKey:[cog_equalizer_band_settings objectAtIndex:i + 1]];
AudioUnitSetParameter(au, i, kAudioUnitScope_Global, 0, presetValues[i], 0);
if(au) {
AudioUnitSetParameter(au, i, kAudioUnitScope_Global, 0, presetValues[i], 0);
}
}
}
}
Expand Down

0 comments on commit 375b019

Please sign in to comment.