Frage

Ich bin mit dem AVAudioPlayer Rahmen, und ich habe mehrere Töne, die einen nach dem anderen spielen. Wenn ein Ton fertig abgespielt wird, möchte ich die Anwendung etwas zu tun. Ich habe versucht, audioPlayerDidFinishPlaying zu verwenden, um die Aktion am Ende des ersten Ton zu tun, aber ich konnte sie nicht für den zweiten Ton verwenden, weil ich eine Neudefinition Fehler bekam. Kann ich NSTimeInterval verwenden, um die Dauer eines Sound zu bekommen?

//  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];

}
}
War es hilfreich?

Lösung

  

Wenn ein Soundwiedergabe beendet ist, möchte ich die Anwendung etwas zu tun.

Dann setzen Sie sich als Delegierter und reagieren auf audioPlayerDidFinishPlaying:successfully:.

Im Code-Snippet Sie zeigte, Sie 2 Schritt getan haben, aber nicht Schritt 1:. Sie sind nicht selbst als Delegierter Einstellung

  

Ich habe versucht, applicationDidFinishLaunching zu verwenden, um die Aktion am Ende des ersten Ton zu tun ...

Gehirn fart? Diese Methode hat nichts, was ich sehen kann, mit Spiel Klang zu tun.

  

..., aber ich konnte das nicht für den zweiten Ton verwenden, weil ich einen Neudefinition Fehler bekam.

Hä? Haben Sie die Methode implementieren zweimal oder etwas anstatt nur das Spielerobjekt in dem Verfahren Körper zu vergleichen?

Es würde helfen, wenn Sie die genaue Fehlermeldung zeigen Ihnen.

Andere Tipps

Swift 3:

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        print("sound file finished")
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top