AVAudioEngine продолжает работать, несмотря на то, что контроллер представления уволен

У меня есть мой код, настроенный с помощью узла узла игрока и узла ввода. Я также настроил это, чтобы иметь дело с перебоями или определенными изменениями в функциональности.

Однако с этими изменениями возникает большая проблема, и это то, что если контроллер представления не работает, он не только больше не освобождает память для моего приложения, но и узел игрока продолжает играть. Если я вернусь к представлению с узлом проигрывателя и нажму стоп, это не сработает. Я даже могу снова активировать плеер, и он будет играть вместе с игроком, которого невозможно остановить.

-(void)setupAudioOne
{
NSError *error;
BOOL success = NO;

[self initAVAudioSession];

_isSessionInterrupted = NO;
_isConfigChangePending = NO;

_player = [[AVAudioPlayerNode alloc] init];
_inputOne = [[AVAudioInputNode alloc] init];
_setReverb = [[AVAudioUnitReverb alloc] init];



NSURL *hiphopOneURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Hip Hop 1" ofType:@"caf"]];
AVAudioFile *hiphopOneFile = [[AVAudioFile alloc] initForReading:hiphopOneURL error:&error];
_playerLoopBuffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:[hiphopOneFile processingFormat] frameCapacity:(AVAudioFrameCount)[hiphopOneFile length]];
success = [hiphopOneFile readIntoBuffer:_playerLoopBuffer error:&error];
NSAssert(success, @"couldn't read buffer bitch, %@", [error localizedDescription]);

_isRecording = NO;


[self createEngineAndAttachNodes];
[self makeEngineConnections];

_setReverb.wetDryMix = 75;
[_setReverb loadFactoryPreset:AVAudioUnitReverbPresetMediumHall];

//get notifications from the engine if there's a hardware config change
[[NSNotificationCenter defaultCenter] addObserverForName:AVAudioEngineConfigurationChangeNotification object:nil 
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
    // if we've received this change rewire everything

    _isConfigChangePending = YES;

    if (!_isSessionInterrupted) {
        NSLog(@"Received a %@ notification!", AVAudioEngineConfigurationChangeNotification);
        NSLog(@"Re-wiring connections and starting once again");
        [self makeEngineConnections];
        [self startEngine];
    }
    else {
        NSLog(@"Session is interrupted, deffering changes");
    }

    //post notification
    if ([self.delegate respondsToSelector:@selector(engineConfigurationHasChanged)]) {
        [self.delegate engineConfigurationHasChanged];
    }
}];
[self startEngine];


}

Проблемная область находится в нижней части кода, где я пытаюсь получать уведомления от движка, если есть изменение конфигурации оборудования. Если я удаляю этот код, то при удалении представления также будет использоваться вся память, используемая движком. Но это также означает, что если кто-то, скажем, подключает наушники, приложение вылетает. Поэтому мне нужен код, который вы видите, но мне нужно изменить его, чтобы в случае отклонения представления приложение высвобождало используемую память.

Любой совет?

0 ответов