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

}
}
È stato utile?

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")
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top