2009-07-10 10 views
16

AVAudioPlayer çerçevesini kullanıyorum ve her seferinde bir tane yürüten birkaç sesim var. Bir ses bittiğinde, uygulamanın bir şey yapmasını istiyorum. İlk sesin sonunda eylemi yapmak için audioPlayerDidFinishPlaying'i kullanmayı denedim, ancak ikinci ses için bunu kullanamadım çünkü bir yeniden tanımlama hatası aldım. Bir sesin süresini almak için NSTimeInterval kullanabilir miyim? Bir sesin çalınması tamamlandığındaBir ses AVAudioPlayer uygulamasında oynatıldığında bitti mi?

// ViewController.h 
#import <UIKit/UIKit.h> 
#import <AVFoundation/AVFoundation.h> 
#import <AVFoundation/AVAudioPlayer.h> 

@interface ViewController : UIViewController { 
UIButton  *begin; 
UIWindow  *firstTestWindow; 
UIWindow  *secondTestWindow; 
AVAudioPlayer *player; 
NSTimeInterval duration; 
} 

@property (nonatomic, retain) IBOutlet UIButton  *begin; 
@property (nonatomic, retain) IBOutlet UIWindow  *firstTestWindow; 
@property (nonatomic, retain) IBOutlet UIWindow  *secondTestWindow; 
@property (nonatomic, retain)   AVAudioPlayer *player; 
@property (readonly)     NSTimeInterval duration; 


- (IBAction)begin:(id)sender; 
- (IBAction)doTapScreen:(id)sender; 

@end 



//ViewController.m 
#import "ViewController.h" 

@implementation ViewController 

@synthesize begin, player, firstTestWindow, secondTestWindow; 

//first sound 
- (IBAction)begin:(id)sender; { 

    [firstTestWindow makeKeyAndVisible]; 
    NSString *soundFilePath = 
    [[NSBundle mainBundle] pathForResource: @"Tone1" 
            ofType: @"mp3"]; 

    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; 

    AVAudioPlayer *newPlayer = 
    [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL 
              error: nil]; 
    [fileURL release]; 
    self.player = newPlayer; 
    [newPlayer release]; 

    [player prepareToPlay]; 
    [self.player play]; 

} 

//If user does not do anything by the end of the sound go to secondWindow 
- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player 
        successfully: (BOOL) flag { 
           if (flag==YES) { 
    [secondWindow makeKeyAndVisible]; 
    } 
} 

//second sound 
- (IBAction)doTapScreen:(id)sender { 
    //When user touches the screen, either play the sound or go to the next window 
    if (self.player.playing) { 
    [self.player stop]; 
    [thirdWindow makeKeyAndVisible]; 
    } 

    else { 
    NSString *soundFilePath = 
    [[NSBundle mainBundle] pathForResource: @"Tone2" 
       ofType: @"mp3"]; 

    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; 

    AVAudioPlayer *newPlayer = 
    [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL 
              error: nil]; 
    [fileURL release]; 
    self.player = newPlayer; 
    [newPlayer release]; 

    [player prepareToPlay]; 
    [self.player play]; 

} 
} 

cevap

24

, ben uygulama bir şey yapmak istiyorum. Daha sonra kendini temsilci olarak ayarlayın ve audioPlayerDidFinishPlaying:successfully:'a yanıt verin.

Gösterdiğiniz kod snippet'inde adım 2 yaptınız, ancak adım 1 değilsiniz: Kendinizi temsilci olarak ayarlamıyorsunuz. İlk ses sonunda eylemi yapmaya applicationDidFinishLaunching kullanmaya çalıştı

...

Beyin osuruk? Bu yöntemin, ses çalma ile ilgili görebileceğim hiçbir şeyi yok.

… ancak bunu ikinci ses için kullanamadım çünkü bir yeniden tanımlama hatası aldım.

Huh? Yöntem nesnesindeki oynatıcı nesnesini karşılaştırmak yerine yöntemi iki kez mi uyguladınız?

Tam hata mesajını gösterdiyseniz yardımcı olur.

+0

Ah! Evet, kesinlikle applicationDidFinishLaunching değil, audioPlayerDidFinishPlaying demek istemiştim. Afedersiniz. Delegeyi kendime ayarlıyorum ve ilk ses için çalıştı. Ancak sorun, audioPlayerDidFinishPlaying'in çalışmadığı değil, sorun şu ki ikinci bir ses için tekrar nasıl yapılacağını bilmiyorum. İki farklı sesim var. – Evelyn

+0

Bu arada, [player setDelegate: self] 'e koyduğumda, uyarıyı alırım: "ViewController" sınıfı' AVAudioPlayerDelegate 'protokolünü uygulamıyor. " Bu bir problem mi? – Evelyn

+0

Kendinizi her iki sesin delege olarak ayarlamanız gerekir. Ses size bir delege mesajı gönderdiğinde kendini gösterir, böylece elinizdeki seslerle karşılaştırabilirsiniz. –

1

Swift 3:

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 
     print("sound file finished") 
    }