Dominick
Dominick

Reputation: 55

How do I stop a sound when a new sound button is pressed

I'm new to Xcode and I'm having an issue, if you click the sound buttons multiple times they overlap each other. How would I set my code so that if you click a button while a sound is playing it will stop the current sound playing and start the new one.

If you could post the code it would be much appreciated.

Thanks, Dominick

Here is a copy of my current code:

#import "Sound3ViewController.h"

@implementation Sound3ViewController

-(IBAction)playnow:(id)sender;{
soundFile = [NSURL fileURLWithPath:[[NSBundle mainBundle] 
                                    pathForResource:@"winning" 
                                    ofType:@"mp3"]];

sound = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFile error:nil]; 
    sound.delegate = self; 
    [sound play];

}

- (IBAction)play2:(id)sender {
soundFile = [NSURL fileURLWithPath:[[NSBundle mainBundle] 
                                        pathForResource:@"onadrug" 
                                        ofType:@"mp3"]];

sound = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFile error:nil]; 
    sound.delegate = self; 
    [sound play];


}

- (void)dealloc
{
    [super dealloc];
    [sound release];
    [super dealloc];
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    [super viewDidLoad];
}
*/

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}


@end

Upvotes: 0

Views: 4134

Answers (3)

9to5ios
9to5ios

Reputation: 5545

// in .h file 

#import "AVFoundation/AVAudioPlayer.h"
//set delegate
@interface SamplesoundViewController : UIViewController <AVAudioPlayerDelegate>{
AVAudioPlayer *player1;
    AVAudioPlayer *player2;
...
...
}
@property (nonatomic, retain) AVAudioPlayer *player1;
@property (nonatomic, retain) AVAudioPlayer *player2;
-(IBAction)soundfirst;
-(IBAction)soundsecond;
-(IBAction)Newmethodname;



// in .m file
@implementation SamplesoundViewController

@synthesize player1,player2;

-(IBAction)soundfirst{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"soundfilefirst" ofType:@"mp3"];
   player1=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];

    player1.delegate=self;
    [player1 play];
    [self performSelector:@selector(soundsecond) withObject:nil afterDelay:0.90];   
}



-(IBAction)soundsecond{
    [player1 stop];

    NSString *path = [[NSBundle mainBundle] pathForResource:@"Soundfilesecond" ofType:@"mp3"];

    player2=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];

    player2.delegate=self;
    [player2 play];
    [self performSelector:@selector(Newmethodname) withObject:nil afterDelay:1];


}


-(IBAction)Newmethodname{
    [player2 stop];
     //write your code here
}

Upvotes: 0

Jack
Jack

Reputation: 133567

I would suggest you to disallow playing the sound with a variable and schedule an action that allows it again after the duration of the file. Eg:

boolean allowed = true

-(IBAction)playnow:(id)sender
{
    if (allowed) { // <--- ADD THIS
    allowed = false;
    soundFile = [NSURL fileURLWithPath:[[NSBundle mainBundle] 
                                    pathForResource:@"winning" 
                                    ofType:@"mp3"]];
    sound = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFile error:nil]; 
    sound.delegate = self; 
    [sound play];

    NSInvocation *invocation = [[NSInvocation alloc] init];
    [invocation setTarget:self];
    [invocation setSelector:@selector(allowPlaying)];
    [NSTimer scheduledTimerWithTimeInterval:[sound duration] invocation:invocation repeats:NO];
    } // <-- AND THIS
}
-(void)allowPlaying
{
  allow = true;
}

Didn't test it since just wrote on the fly but you've got the general idea..

Upvotes: 1

MusiGenesis
MusiGenesis

Reputation: 75296

I'm new to objC also, so I'm not sure this is correct, but try this:

#import "Sound3ViewController.h"

@implementation Sound3ViewController

-(IBAction)playnow:(id)sender;{
    soundFile = [NSURL fileURLWithPath:[[NSBundle mainBundle] 
                                    pathForResource:@"winning" 
                                    ofType:@"mp3"]];

    // NEW STUFF
    if (sound) {
        if ([sound playing]) {
            [sound stop];
        }
        [sound release];
    }

    sound = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFile error:nil]; 
    sound.delegate = self; 
    [sound play];
}

- (IBAction)play2:(id)sender {
    soundFile = [NSURL fileURLWithPath:[[NSBundle mainBundle] 
                                        pathForResource:@"onadrug" 
                                        ofType:@"mp3"]];

    if (sound) {
        if ([sound playing]) {
            [sound stop];
        }
        [sound release];
    }

    sound = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFile error:nil]; 
    sound.delegate = self; 
    [sound play];


}

- (void)dealloc
{
    [super dealloc];
    if (sound) {
        [sound release];
    }
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    [super viewDidLoad];
}
*/

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}


@end

Upvotes: 0

Related Questions