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); + } } } }