|  | @@ -45,6 +45,8 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @property (nonatomic, assign) NSInteger timeCount;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +@property (nonatomic, assign) BOOL isCanceled; // 是否在取消
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  @end
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -110,8 +112,12 @@
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - (void)prepareNativeSongWithUrl:(NSURL *)recordAudioUrl bgMusic:(NSURL *)bgMusicUrl {
 | 
	
		
			
				|  |  | +    @weakObj(self);
 | 
	
		
			
				|  |  |      dispatch_async(self.sourceQueue, ^{
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +        @strongObj(self);
 | 
	
		
			
				|  |  | +        if (!self || self.isCanceled) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          [self loadAuidoFile:recordAudioUrl isBgm:NO];
 | 
	
		
			
				|  |  |          [self loadAuidoFile:bgMusicUrl isBgm:YES];
 | 
	
		
			
				|  |  |          self.sampleRate = self.audioFile.fileFormat.sampleRate;
 | 
	
	
		
			
				|  | @@ -205,7 +211,12 @@
 | 
	
		
			
				|  |  |  // 预计加载buffer
 | 
	
		
			
				|  |  |  - (void)prepareBuffer:(AVAudioFramePosition)startPosition offset:(NSInteger)offsetTime mixStart:(AVAudioFramePosition)mixStartPosition {
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | +    @weakObj(self);
 | 
	
		
			
				|  |  |      dispatch_async(self.sourceQueue, ^{
 | 
	
		
			
				|  |  | +        @strongObj(self);
 | 
	
		
			
				|  |  | +        if (!self || self.isCanceled) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          if (!self.bgAudioFile || !self.audioFile) {
 | 
	
		
			
				|  |  |              return;
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -408,11 +419,15 @@
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - (void)stopPlay {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (self.nodePlayer.isPlaying) {
 | 
	
		
			
				|  |  | -        [self.nodePlayer stop];
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    [self stopTimer];
 | 
	
		
			
				|  |  | +    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 | 
	
		
			
				|  |  | +        if (self.nodePlayer.isPlaying) {
 | 
	
		
			
				|  |  | +            [self.nodePlayer stop];
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [self stopTimer];
 | 
	
		
			
				|  |  | +        if (self.audioEngine.isRunning) {
 | 
	
		
			
				|  |  | +            [self.audioEngine stop];
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - (void)seekToTime:(NSInteger)time {
 | 
	
	
		
			
				|  | @@ -457,8 +472,8 @@
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - (void)freePlayer {
 | 
	
		
			
				|  |  | +    self.isCanceled = YES;
 | 
	
		
			
				|  |  |      [self stopPlay];
 | 
	
		
			
				|  |  | -    [self.audioEngine.mainMixerNode removeTapOnBus:0];
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - (void)startTimer {
 | 
	
	
		
			
				|  | @@ -493,6 +508,9 @@
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - (void)timeFunction {
 | 
	
		
			
				|  |  | +    if (self.isCanceled) {
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      self.totalDuration = [self getTotalTime];
 | 
	
		
			
				|  |  |      NSTimeInterval currentTime = [self getCurrentPlayTime];
 | 
	
		
			
				|  |  |      float progress = currentTime/self.totalDuration;
 | 
	
	
		
			
				|  | @@ -566,6 +584,10 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - (void)dealloc {
 | 
	
		
			
				|  |  |      NSLog(@"---- KSMergeEnginePlayer dealloc");
 | 
	
		
			
				|  |  | +    if (_audioEngine) {
 | 
	
		
			
				|  |  | +        [_audioEngine disconnectNodeInput:self.nodePlayer];
 | 
	
		
			
				|  |  | +        [_audioEngine detachNode:self.nodePlayer];
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      // 停止并清理定时器
 | 
	
		
			
				|  |  |      if (_timer) {
 | 
	
		
			
				|  |  |          [_timer invalidate];
 |