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 <kode54@gmail.com>
This commit is contained in:
Christopher Snowhill 2025-02-23 21:16:46 -08:00
parent e76defbfd4
commit 53291b570d
3 changed files with 42 additions and 16 deletions

View file

@ -729,7 +729,6 @@ NSDictionary *makeRGInfo(PlaylistEntry *pe) {
}
- (void)audioPlayer:(AudioPlayer *)player displayEqualizer:(AudioUnit)eq {
if(_eq && _eq != eq) {
[equalizerWindowController setEQ:nil];
}

View file

@ -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];
}
}
}
@ -88,6 +105,8 @@ static EQHookContainer *theContainer = nil;
double equalizerPreamp;
__weak AudioPlayer *audioPlayer;
AudioUnit _eq;
AudioTimeStamp timeStamp;
@ -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 {

View file

@ -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();
}
if(au) {
AudioUnitParameterValue paramValue = 0;
if(AudioUnitGetParameter(au, kGraphicEQParam_NumberOfBands, kAudioUnitScope_Global, 0, &paramValue))
return;
}
float presetValues[31];
interpolateBands(presetValues, preset);
@ -297,12 +299,16 @@ void equalizerApplyPreset(AudioUnit au, const NSDictionary *preset) {
float preamp = getPreamp(preset);
[[NSUserDefaults standardUserDefaults] setFloat:preamp forKey:[cog_equalizer_band_settings objectAtIndex: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]];
if(au) {
AudioUnitSetParameter(au, i, kAudioUnitScope_Global, 0, presetValues[i], 0);
}
}
}
}
@implementation EqPresetBehaviorArrayController