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:
parent
e76defbfd4
commit
53291b570d
3 changed files with 42 additions and 16 deletions
|
@ -729,7 +729,6 @@ NSDictionary *makeRGInfo(PlaylistEntry *pe) {
|
|||
}
|
||||
|
||||
- (void)audioPlayer:(AudioPlayer *)player displayEqualizer:(AudioUnit)eq {
|
||||
|
||||
if(_eq && _eq != eq) {
|
||||
[equalizerWindowController setEQ:nil];
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue