hanumanDev
hanumanDev

Reputation: 6614

AVAudioPlayer UIButton - second touch stop current audio play

I have a UIButton that when touched plays an audio file. At the moment touching the button twice in succession plays the audio file twice instead of stopping it.

I'm looking to have the second click stop the audio file and not play a second instance. any suggestions would be very much appreciated. thanks

-(IBAction) buttonNoisePlay {

        NSString *pathsoundFile = [[NSBundle mainBundle] pathForResource:@"noise" ofType:@"mp4"];
        sound = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:pathsoundFile] error:NULL];
        sound.delegate = self;
        sound.numberOfLoops = -1;
        sound.volume = 1;   

            if(sound == nil || sound.playing == NO)  //if not playing
            {

                    [sound play];
            }
            else
            {
                    [sound stop];
            }
}

Upvotes: 0

Views: 1076

Answers (2)

NMS
NMS

Reputation: 25

hmm, this is what I do & it only plays once:

-(void) playSound: (NSString *) strFileName
{       
    if(audioPlayer == nil || audioPlayer.playing == NO)  //check if it's already playing in case they dbl-tapped (or more) b/c we only want to play it once per found item
    {
        //Get the filename of the sound file:
        NSString *urlAddress = [NSString stringWithFormat:@"%@%@", [[NSBundle mainBundle] resourcePath], strFileName];

        //Get a URL for the sound file
        NSURL *url = [NSURL fileURLWithPath:urlAddress];
        NSError *error;

        //Use AVAudioPlayer to play the sound
        audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
        audioPlayer.numberOfLoops = 0;

        if (audioPlayer == nil)
            NSLog(@"audioPlayer nil Error:%@", [error description]);
        else
            [audioPlayer play];
    }
}

And in the header:

AVAudioPlayer *audioPlayer;

I should probably also be checking for nil before initializing the audioPlayer, so it's only done once... but for now - it works.

Upvotes: 2

NMS
NMS

Reputation: 25

You could do something like this:

-(IBAction) buttonNoisePlay {

    if(sound == nil || sound.playing == NO)  //if not playing
    {
        ...
        //if nil initialize

        [sound play];
    }
    else
    {
        [sound stop];
    }
}

Upvotes: 1

Related Questions