2013-03-13 28 views
21

Używanie AVAudioPlayer do dodawania dźwięku do działającej aplikacji zatrzymuje się/zawiesza w readyToPlay. Pamiętaj, że również zatrzymuje się/zawiesza się podczas gry. Kilkakrotne naciśnięcie "Kontynuuj wykonywanie programu" powoduje wznowienie aplikacji. Ten problem występuje tylko podczas uruchamiania programu w symulatorze.Zatrzymanie Xcode na readyToPlay

Korzystanie Xcode 4.6 Fragmenty

Kod:

ViewController.h

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

@interface ViewController : UIViewController <AVAudioPlayerDelegate> 

@end 

ViewController.m

#import "ViewController.h" 

@interface ViewController() 
{ 
} 

@property (nonatomic, strong) AVAudioPlayer *audioPlayer; 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self initilizeAudio]; 
} 

- (void)initilizeAudio 
{ 
    NSError *error = nil; 
    NSURL *audioURL = [[NSBundle mainBundle] URLForResource:@"Background" withExtension:@"mp3"]; 

    self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioURL error:&error]; 
    if (error) 
    { 
     NSLog(@"Error in audioPlayer: %@", [error localizedDescription]); 
    } 
    else 
    { 
     [self.audioPlayer setDelegate:self]; 
     [self.audioPlayer prepareToPlay]; 
    } 
} 

@end 

Ślad stosu

0 __cxa_throw 
21 -[AVAudioPlayer prepareToPlay] 
22 -[ViewController viewDidLoad] 
. 
. 
. 
+5

Najwyraźniej nie mogę już odpowiadać na moje własne pytania. więc zapewniając odpowiedź w komentarzu. Problem polegał na tym, że normalnie rozwijałem się z punktem przerwania ustawionym na "Wszystkie wyjątki", a rzeczywisty wyrzucony wyjątek to __cxa_throw. Co najwyraźniej okazało się być w bibliotekach C++, które są używane do implementacji AVAudioPlayer. Zmieniając punkt przerwania na "Wszystkie wyjątki od obiektu C" program działał poprawnie. (Można to zrobić edytując punkt przerwania i zmieniając pole Wyjątek na Cel-C.) – zermat

+1

Zgodnie z [Ten post na Meta] (http://meta.stackexchange.com/a/17467) musisz poczekać na 8 godzin, jeśli masz mniej niż 100 powtórzeń. Możesz przyjąć własną odpowiedź 48 godzin później. – Sebastian

Odpowiedz

66

Problem polegał na tym, że normalnie rozwijałem się z punktem przerwania ustawionym na "Wszystkie wyjątki", a rzeczywisty wyrzucony wyjątek to __cxa_throw. Co najwyraźniej okazało się być w bibliotekach C++, które są używane do implementacji AVAudioPlayer. Zmieniając punkt przerwania na "Wszystkie wyjątki od obiektu C" program działał poprawnie. (Można to zrobić poprzez edycję przerwania i zmieniając pole Wyjątkiem Objective-C.

+1

Niesamowite, cieszę się, że napisałeś to, bo drapałem się po tym! – LilMoke

+1

Ty sir, uratowałeś mój dzień! Nie mogę ci wystarczająco podziękować! Miałem dokładnie ten sam problem i doprowadzało mnie to do szału. :-) – thomas

+0

Dzięki! Rozwiązał mój problem! – Marky

4

miałem ten problem też. Rozwiązanie powyższego dzieła, ale myślę, że nie ma lepszego sposobu, aby go naprawić.

błędy autor sugeruje ignorowanie wskazują, że mac próbuje wysłać audio do urządzenia, które nie działa.Myślę, że kod jest napisany w C, więc zwrot wyjątków do "tylko obiektywne-c" wycisza wyjątek

Prawdziwa poprawka polega na ponownym uruchomieniu urządzenia audio, dla mnie przyczyną niepowodzenia było przełączenie wejścia i wyjścia audio, ale (jak się wydaje) symulator IOS zapamiętał stare ustawienia . Więc kiedy próbowałem różne kroki w tym wątku:

Error '!dat' trying to set the (null) audio devices' sample rate

mam dźwięk znów działa, i to przestało rzucać żadnych wyjątków.

+0

Nie jest to raczej problem, że nie ma sprzętu audio na symulatorze i to wydaje się powodować pośredni wyjątek C++, który może (powinien) być ignorowany (mój mechanizm zasugerował w zaakceptowanej odpowiedzi). – Drux

Powiązane problemy