Fare un'azione quando un rumore ha finito di giocare in AVAudioPlayer?
-
12-09-2019 - |
Domanda
Sto usando il quadro AVAudioPlayer, e ho diversi suoni che giocano uno alla volta. Quando un suono è finito di giocare, voglio l'applicazione di fare qualcosa. Ho cercato di usare audioPlayerDidFinishPlaying per fare l'azione alla fine del primo suono, ma non ho potuto utilizzare che per il secondo suono perché ho avuto un errore di ridefinizione. Posso usare NSTimeInterval per ottenere la durata di un suono?
// 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];
}
}
Soluzione
Quando un suono è finito di giocare, voglio l'applicazione di fare qualcosa.
Quindi impostare se stessi come il delegato e rispondere agli audioPlayerDidFinishPlaying:successfully:
.
Nel frammento di codice che avete mostrato, hai fatto il passaggio 2, ma non passo 1:. Non stai impostando te stesso come il delegato
Ho cercato di usare
applicationDidFinishLaunching
per fare l'azione alla fine del primo suono ...
Cervello scoreggia? Questo metodo ha niente che posso vedere a che fare con i suoni di gioco.
..., ma non ho potuto utilizzare che per il secondo suono perché ho avuto un errore di ridefinizione.
Eh? Hai implementare il metodo due volte o qualcosa invece di confronto tra l'oggetto giocatore nel corpo del metodo?
Sarebbe utile se hai mostrato il messaggio di errore esatto che hai.
Altri suggerimenti
Swift 3:
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
print("sound file finished")
}