From fcec44982c1570fbd703ddfb6bdc92a14322336d Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Sat, 3 May 2025 01:23:19 -0700 Subject: [PATCH] Converter Node: Change volume scale observer This should fix an exception being thrown because the observer wasn't registered, or known to be registered. Only register it when it will be used, and only unregister it if it was registered. Signed-off-by: Christopher Snowhill --- Audio/Chain/ConverterNode.h | 2 ++ Audio/Chain/ConverterNode.m | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) 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];