diff --git a/Audio/Chain/ConverterNode.h b/Audio/Chain/ConverterNode.h index 7f671bda3..360d740e2 100644 --- a/Audio/Chain/ConverterNode.h +++ b/Audio/Chain/ConverterNode.h @@ -45,6 +45,8 @@ double sampleRatio; + BOOL observersAdded; + float volumeScale; void *floatBuffer; diff --git a/Audio/Chain/ConverterNode.m b/Audio/Chain/ConverterNode.m index 1a3ff53ee..27dd75076 100644 --- a/Audio/Chain/ConverterNode.m +++ b/Audio/Chain/ConverterNode.m @@ -66,8 +66,6 @@ static void *kConverterNodeContext = &kConverterNodeContext; extrapolateBuffer = NULL; extrapolateBufferSize = 0; - [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.volumeScaling" options:0 context:kConverterNodeContext]; - #ifdef LOG_CHAINS [self initLogFiles]; #endif @@ -76,6 +74,20 @@ static void *kConverterNodeContext = &kConverterNodeContext; return self; } +- (void)addObservers { + if(!observersAdded) { + [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.volumeScaling" options:(NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew) context:kConverterNodeContext]; + observersAdded = YES; + } +} + +- (void)removeObservers { + if(observersAdded) { + [[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:@"values.volumeScaling" context:kConverterNodeContext]; + observersAdded = NO; + } +} + void scale_by_volume(float *buffer, size_t count, float volume) { if(volume != 1.0) { size_t unaligned = (uintptr_t)buffer & 15; @@ -334,6 +346,7 @@ void scale_by_volume(float *buffer, size_t count, float volume) { if(nodeChannelConfig) { [chunk setChannelConfig:nodeChannelConfig]; } + [self addObservers]; scale_by_volume(floatBuffer, ioNumberPackets / sizeof(float), volumeScale); [chunk setStreamTimestamp:streamTimestamp]; [chunk setStreamTimeRatio:streamTimeRatio]; @@ -488,7 +501,7 @@ static float db_to_scale(float db) { - (void)dealloc { DLog(@"Converter dealloc"); - [[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:@"values.volumeScaling" context:kConverterNodeContext]; + [self removeObservers]; paused = NO; [self cleanUp];