Как остановить звук при нажатии новой кнопки звука - PullRequest
0 голосов
/ 10 апреля 2011

Я новичок в Xcode и у меня возникла проблема, если вы нажимаете кнопки звука несколько раз, они перекрывают друг друга. Как бы я установил свой код таким образом, чтобы при нажатии кнопки во время воспроизведения звука воспроизведение текущего звука прекращалось и запускалось новое.

Если бы вы могли опубликовать код, он был бы очень признателен.

Спасибо, Доминик

Вот копия моего текущего кода:

#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

Ответы [ 3 ]

0 голосов
/ 10 апреля 2011

Я также новичок в objC, поэтому я не уверен, что это правильно, но попробуйте это:

#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
0 голосов
/ 26 марта 2012
// 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
}
0 голосов
/ 10 апреля 2011

Я бы посоветовал вам запретить воспроизведение звука с переменной и запланировать действие, позволяющее повторить его после окончания действия файла.Например:

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;
}

Не проверял, так как просто написал на лету, но у вас есть общее представление ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...