From 53291b570d9f175264facb34e6fb499fbd94ed0c Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Sun, 23 Feb 2025 21:16:46 -0800 Subject: [PATCH] Bug Fix: Solve outstanding Equalizer bugs 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 --- Application/PlaybackController.m | 1 - Audio/Chain/DSP/DSPEqualizerNode.m | 39 ++++++++++++++++++++------- Equalizer/EqualizerWindowController.m | 18 ++++++++----- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/Application/PlaybackController.m b/Application/PlaybackController.m index 03a55c648..425858097 100644 --- a/Application/PlaybackController.m +++ b/Application/PlaybackController.m @@ -729,7 +729,6 @@ NSDictionary *makeRGInfo(PlaylistEntry *pe) { } - (void)audioPlayer:(AudioPlayer *)player displayEqualizer:(AudioUnit)eq { - if(_eq && _eq != eq) { [equalizerWindowController setEQ:nil]; } diff --git a/Audio/Chain/DSP/DSPEqualizerNode.m b/Audio/Chain/DSP/DSPEqualizerNode.m index 597ffd104..4a8cd109e 100644 --- a/Audio/Chain/DSP/DSPEqualizerNode.m +++ b/Audio/Chain/DSP/DSPEqualizerNode.m @@ -24,6 +24,16 @@ extern void scale_by_volume(float *buffer, size_t count, float volume); static void * kDSPEqualizerNodeContext = &kDSPEqualizerNodeContext; +@interface EQObject : NSObject { + AudioUnit eq; +} +@property AudioUnit eq; +@end + +@implementation EQObject +@synthesize eq; +@end + @interface EQHookContainer : NSObject { NSMutableArray *equalizers; } @@ -60,23 +70,30 @@ static EQHookContainer *theContainer = nil; - (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]; + } } } @@ -87,6 +104,8 @@ static EQHookContainer *theContainer = nil; BOOL equalizerInitialized; double equalizerPreamp; + + __weak AudioPlayer *audioPlayer; AudioUnit _eq; @@ -148,6 +167,9 @@ static OSStatus eqRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioA float preamp = [defaults floatForKey:@"eqPreamp"]; equalizerPreamp = pow(10.0, preamp / 20.0); + BufferChain *bufferChain = c; + audioPlayer = [bufferChain controller]; + [self addObservers]; } return self; @@ -192,8 +214,7 @@ static OSStatus eqRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioA } - (AudioPlayer *)audioPlayer { - BufferChain *bufferChain = controller; - return [bufferChain controller]; + return audioPlayer; } - (BOOL)fullInit { diff --git a/Equalizer/EqualizerWindowController.m b/Equalizer/EqualizerWindowController.m index 9026263ea..a9e658972 100644 --- a/Equalizer/EqualizerWindowController.m +++ b/Equalizer/EqualizerWindowController.m @@ -281,15 +281,17 @@ 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, ¶mValue)) - return; + if(au) { + AudioUnitParameterValue paramValue = 0; + if(AudioUnitGetParameter(au, kGraphicEQParam_NumberOfBands, kAudioUnitScope_Global, 0, ¶mValue)) + return; + } float presetValues[31]; interpolateBands(presetValues, preset); @@ -297,10 +299,14 @@ void equalizerApplyPreset(AudioUnit au, const NSDictionary *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); + } } } }