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];
}
}
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
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
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. –