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 {
|
- (void)audioPlayer:(AudioPlayer *)player displayEqualizer:(AudioUnit)eq {
|
||||||
|
|
||||||
if(_eq && _eq != eq) {
|
if(_eq && _eq != eq) {
|
||||||
[equalizerWindowController setEQ:nil];
|
[equalizerWindowController setEQ:nil];
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,16 @@ extern void scale_by_volume(float *buffer, size_t count, float volume);
|
||||||
|
|
||||||
static void * kDSPEqualizerNodeContext = &kDSPEqualizerNodeContext;
|
static void * kDSPEqualizerNodeContext = &kDSPEqualizerNodeContext;
|
||||||
|
|
||||||
|
@interface EQObject : NSObject {
|
||||||
|
AudioUnit eq;
|
||||||
|
}
|
||||||
|
@property AudioUnit eq;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation EQObject
|
||||||
|
@synthesize eq;
|
||||||
|
@end
|
||||||
|
|
||||||
@interface EQHookContainer : NSObject {
|
@interface EQHookContainer : NSObject {
|
||||||
NSMutableArray *equalizers;
|
NSMutableArray *equalizers;
|
||||||
}
|
}
|
||||||
|
@ -60,23 +70,30 @@ static EQHookContainer *theContainer = nil;
|
||||||
|
|
||||||
- (void)pushEqualizer:(AudioUnit)eq forPlayer:(AudioPlayer *)audioPlayer {
|
- (void)pushEqualizer:(AudioUnit)eq forPlayer:(AudioPlayer *)audioPlayer {
|
||||||
@synchronized (equalizers) {
|
@synchronized (equalizers) {
|
||||||
[equalizers addObject:@((uintptr_t)eq)];
|
EQObject *_eq = [[EQObject alloc] init];
|
||||||
|
_eq.eq = eq;
|
||||||
|
[equalizers addObject:_eq];
|
||||||
if([equalizers count] == 1) {
|
if([equalizers count] == 1) {
|
||||||
[audioPlayer beginEqualizer:eq];
|
[audioPlayer beginEqualizer:eq];
|
||||||
|
} else {
|
||||||
|
[audioPlayer refreshEqualizer:eq];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)popEqualizer:(AudioUnit)eq forPlayer:(AudioPlayer *)audioPlayer {
|
- (void)popEqualizer:(AudioUnit)eq forPlayer:(AudioPlayer *)audioPlayer {
|
||||||
@synchronized (equalizers) {
|
@synchronized (equalizers) {
|
||||||
uintptr_t _eq = [[equalizers objectAtIndex:0] unsignedIntegerValue];
|
for(EQObject *_eq in equalizers) {
|
||||||
if(eq == (AudioUnit)_eq) {
|
if(_eq.eq == eq) {
|
||||||
[equalizers removeObject:@(_eq)];
|
[equalizers removeObject:_eq];
|
||||||
if([equalizers count]) {
|
break;
|
||||||
_eq = [[equalizers objectAtIndex:0] unsignedIntegerValue];
|
|
||||||
[audioPlayer beginEqualizer:(AudioUnit)_eq];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
[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;
|
BOOL equalizerInitialized;
|
||||||
|
|
||||||
double equalizerPreamp;
|
double equalizerPreamp;
|
||||||
|
|
||||||
|
__weak AudioPlayer *audioPlayer;
|
||||||
|
|
||||||
AudioUnit _eq;
|
AudioUnit _eq;
|
||||||
|
|
||||||
|
@ -148,6 +167,9 @@ static OSStatus eqRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioA
|
||||||
float preamp = [defaults floatForKey:@"eqPreamp"];
|
float preamp = [defaults floatForKey:@"eqPreamp"];
|
||||||
equalizerPreamp = pow(10.0, preamp / 20.0);
|
equalizerPreamp = pow(10.0, preamp / 20.0);
|
||||||
|
|
||||||
|
BufferChain *bufferChain = c;
|
||||||
|
audioPlayer = [bufferChain controller];
|
||||||
|
|
||||||
[self addObservers];
|
[self addObservers];
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
|
@ -192,8 +214,7 @@ static OSStatus eqRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioA
|
||||||
}
|
}
|
||||||
|
|
||||||
- (AudioPlayer *)audioPlayer {
|
- (AudioPlayer *)audioPlayer {
|
||||||
BufferChain *bufferChain = controller;
|
return audioPlayer;
|
||||||
return [bufferChain controller];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)fullInit {
|
- (BOOL)fullInit {
|
||||||
|
|
|
@ -281,15 +281,17 @@ void equalizerLoadPreset(AudioUnit au) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void equalizerApplyPreset(AudioUnit au, const NSDictionary *preset) {
|
void equalizerApplyPreset(AudioUnit au, const NSDictionary *preset) {
|
||||||
if(au && preset) {
|
if(preset) {
|
||||||
@synchronized(cog_equalizer_band_settings) {
|
@synchronized(cog_equalizer_band_settings) {
|
||||||
if(!cog_equalizer_band_settings)
|
if(!cog_equalizer_band_settings)
|
||||||
cog_equalizer_band_settings = _cog_equalizer_band_settings();
|
cog_equalizer_band_settings = _cog_equalizer_band_settings();
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioUnitParameterValue paramValue = 0;
|
if(au) {
|
||||||
if(AudioUnitGetParameter(au, kGraphicEQParam_NumberOfBands, kAudioUnitScope_Global, 0, ¶mValue))
|
AudioUnitParameterValue paramValue = 0;
|
||||||
return;
|
if(AudioUnitGetParameter(au, kGraphicEQParam_NumberOfBands, kAudioUnitScope_Global, 0, ¶mValue))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
float presetValues[31];
|
float presetValues[31];
|
||||||
interpolateBands(presetValues, preset);
|
interpolateBands(presetValues, preset);
|
||||||
|
@ -297,10 +299,14 @@ void equalizerApplyPreset(AudioUnit au, const NSDictionary *preset) {
|
||||||
float preamp = getPreamp(preset);
|
float preamp = getPreamp(preset);
|
||||||
|
|
||||||
[[NSUserDefaults standardUserDefaults] setFloat:preamp forKey:[cog_equalizer_band_settings objectAtIndex:0]];
|
[[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) {
|
for(unsigned int i = 0; i < 31; ++i) {
|
||||||
[[NSUserDefaults standardUserDefaults] setFloat:presetValues[i] forKey:[cog_equalizer_band_settings objectAtIndex:i + 1]];
|
[[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