objective c - Xcode se detiene en prepareToPlay
objective-c avaudioplayer (2)
Al usar AVAudioPlayer para agregar sonido a una aplicación que funciona, se detiene / bloquea en prepareToPlay. Tenga en cuenta que también se detiene / se bloquea en el juego. Al pulsar "Continuar ejecución del programa" varias veces, la aplicación se reanuda. Este problema solo ocurre cuando se ejecuta el programa en el simulador.
Utilizando Xcode 4.6
Fragmentos de código:
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
Rastro de pila
0 __cxa_throw
21 -[AVAudioPlayer prepareToPlay]
22 -[ViewController viewDidLoad]
.
.
.
El problema era que normalmente me desarrollo con un punto de interrupción establecido en "Todas las excepciones", y la excepción real lanzada fue __cxa_throw. Lo que aparentemente resulta estar en las bibliotecas de C ++ que se utilizan para implementar AVAudioPlayer. Al cambiar el punto de interrupción a "Todas las excepciones de Objective-C", el programa funcionó bien. (Esto se puede hacer editando el punto de interrupción y cambiando el campo Excepción a Objective-C).
Yo tuve este problema también. La solución anterior funciona, pero creo que hay una mejor manera de solucionarlo.
Los errores que el autor sugiere ignorar indican que el mac está intentando enviar audio a un dispositivo que no funciona. Supongo que el código está escrito en C, por lo que cambiar las excepciones a "solo objetivo-c" silencia la excepción.
La solución real es hacer que el dispositivo de audio vuelva a funcionar. Para mí, la razón de la falla fue que estaba cambiando algunas entradas y salidas de audio, pero (parece) el simulador de IOS había recordado la configuración anterior. Así que cuando probé los varios pasos en este hilo:
Error ''! Dat'' al intentar establecer la frecuencia de muestreo de los dispositivos de audio (nulo)
Conseguí que el audio volviera a funcionar y dejó de emitir excepciones.