AVAudioPlayer fade volume out

前端 未结 13 2083
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-12 12:07

I have an AVAudioPlayer playing some audio (duh!)

The audio is initiated when the user presses a button. When they release it I want the audio to fade out.

I

13条回答
  •  星月不相逢
    2020-12-12 12:19

    I tackled this problem using an NSOperation subclass so fading the volume doesn't block the main thread. It also allows fades to be queued and and forgotten about. This is especially useful for playing one shot sounds with fade-in and fade-out effects as they are dealloced after the last fade is completed.

    // Example of MXAudioPlayerFadeOperation in NSOperationQueue 
     NSOperationQueue *audioFaderQueue = [[NSOperationQueue alloc] init];
      [audioFaderQueue setMaxConcurrentOperationCount:1]; // Execute fades serially.
    
      NSString *filePath = [[NSBundle mainBundle] pathForResource:@"bg" ofType:@"mp3"]; // path to bg.mp3
      AVAudioPlayer *player = [[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath] error:NULL] autorelease];
      [player setNumberOfLoops:-1];
      [player setVolume:0.0];
    
      // Note that delay is delay after last fade due to the Operation Queue working serially.
      MXAudioPlayerFadeOperation *fadeIn = [[MXAudioPlayerFadeOperation alloc] initFadeWithAudioPlayer:player toVolume:1.0 overDuration:3.0];
      [fadeIn setDelay:2.0];
      MXAudioPlayerFadeOperation *fadeDown = [[MXAudioPlayerFadeOperation alloc] initFadeWithAudioPlayer:player toVolume:0.1 overDuration:3.0];
      [fadeDown setDelay:0.0];
      MXAudioPlayerFadeOperation *fadeUp = [[MXAudioPlayerFadeOperation alloc] initFadeWithAudioPlayer:player toVolume:1.0 overDuration:4.0];
      [fadeUp setDelay:0.0];
      MXAudioPlayerFadeOperation *fadeOut = [[MXAudioPlayerFadeOperation alloc] initFadeWithAudioPlayer:player toVolume:0.0 overDuration:3.0];
      [fadeOut setDelay:2.0];
    
      [audioFaderQueue addOperation:fadeIn]; // 2.0s - 5.0s
      [audioFaderQueue addOperation:fadeDown]; // 5.0s - 8.0s
      [audioFaderQueue addOperation:fadeUp]; // 8.0s - 12.0s
      [audioFaderQueue addOperation:fadeOut]; // 14.0s - 17.0s
    
      [fadeIn release];
      [fadeDown release];
      [fadeUp release];
      [fadeOut release];
    

    For MXAudioPlayerFadeOperation class code see this post.

提交回复
热议问题