Marcelo Frajmowicz
Marcelo Frajmowicz

Reputation: 13

How does my app recognize that a song finished?

I´m working on my first app. It plays an mp3 song. Everything works fine, but I need the app to recognize that the sound finished, then change the button “pause” image to the “play” one. I can already do that, but just when the button is pressed, not when song ends.

Another issue is that when the song restarts after stop->play, it doesn´t continue playing at the previous volume setting (got a slider). The player starts at maximum volume. I can change the volume slider position, but I am not able to make the app respect the set volume when restarts.

Any help will be very appreciated! Thnx a lot.

Upvotes: 1

Views: 223

Answers (3)

Shin Kiwata
Shin Kiwata

Reputation: 36

When using "AVAudioPlayerDelegate protocol delegate", please do not forget to set delegate (for example) as follows:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *path = [[NSBundle mainBundle] pathForResource:@"33fr" ofType:@"mp3"];
    NSURL *fileURL = [NSURL fileURLWithPath:path];
    NSError *error = nil;

    myPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];

    if (error) {
         NSLog(@"error = %@", error);
         return;
         }

    [myPlayer setDelegate:self]; <<=== HERE!

}

I uploaded sample code here. Please check it. -> http://yahoo.jp/box/X7Hxfk

Upvotes: 1

Ravindra Bagale
Ravindra Bagale

Reputation: 17655

you can use the AVAudioPlayerDelegate protocol delegate

After the audio player is finished playing the song (if it does so successfully), the audio PlayerDidFinishPlaying:successfully: delegate method will be called in the delegate object of the audio player. We can implement this method like below (this method is defined in the AVAudioPlayerDelegate protocol):

 - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player  successfully:(BOOL)flag
{ 
   if (flag)
{   
 NSLog(@"Audio player stopped correctly.");
  } 
else 
{    NSLog(@"Audio player did not stop correctly."); 
 }  
  if ([player isEqual:self.audioPlayer])
{    self.audioPlayer = nil; 
 }
 else
 {    /* This is not the player */  }
  }

in .h file add delegate like below code

@interface yourViewController : UIViewController <AVAudioPlayerDelegate>

Upvotes: 0

Maxime Vernier
Maxime Vernier

Reputation: 350

I have not done much of Objective-C but it looks like you need to implement a delegate.

I quote: "You implement a delegate to handle interruptions (such as an incoming phone call) and to update the user interface when a sound has finished playing."

I am just reading the AVAudioPlayer Class Reference here: https://developer.apple.com/library/mac/#documentation/AVFoundation/Reference/AVAudioPlayerClassReference/Reference/Reference.html#//apple_ref/doc/uid/TP40008067

Upvotes: 0

Related Questions