0

I'm wondering how to free memory in this simple program that plays a file through a buffer and then stops it.

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

_player = [[AVAudioPlayerNode 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];  

_engine = [[AVAudioEngine alloc] init];  
[_engine attachNode:_player];  

AVAudioMixerNode *mainMixer = [_engine mainMixerNode];  

AVAudioFormat *stereoFormat = [[AVAudioFormat alloc] initStandardFormatWithSampleRate:44100 channels:2];  

[_engine connect:_player to:mainMixer fromBus:0 toBus:0 format:stereoFormat];  

[self startEngine];  
}  

Above is the general setup of the engine and the player node. Then we implement the player with a play button:

- (IBAction)play:(id)sender {  
if (!self.playerIsPlaying)  
{  
    [self setupAudioOne];  
    [_player scheduleBuffer:_playerLoopBuffer atTime:nil options:AVAudioPlayerNodeBufferLoops completionHandler:nil];  
    [_player play];  
}  
}

And finally we stop the player with a stop button:

- (IBAction)stopHipHopOne:(id)sender {  

if (self.playerIsPlaying) {  
    [_player stop];  
} 

playerIsPlaying is just a simple BOOL that determines if the _player is playing.

So basically my question is, when you hit the stop button as this program is written now, no memory will be freed. Surely there is a simple line of code that I can add to the stop button that frees up the memory the engine and player is using?

Any thoughts?

Joshua Browne
  • 185
  • 2
  • 13

1 Answers1

2

Yes, there is. After stopping the player node, you can call:

[_engine disconnectNodeInput:_player];
[_engine detachNode:_player];

I saw you're also keeping a reference to the audio buffer, so you might want to nil that one as well. Let me know if that doesn't work for you. Something else could be leaking.

Alex Machado
  • 1,171
  • 1
  • 12
  • 22