Использование AVAudioPlayer в UIViewController - PullRequest
1 голос
/ 16 февраля 2011

У меня есть подкласс UIViewController для игры с AVAudioPlayer для воспроизведения песни в фоновом режиме. В моем методе viewDidLoad у меня есть следующий код:

[super viewDidLoad];

...

[NSTimer scheduledTimerWithInterval: 0.03 target: self selector: @selector(gameLoop) userInfo: nil repeats: YES];

NSString *path = @"path-to-song";
self->audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath: path] error: NULL];
audioPlayer.delegate = self;
audioPlayer.numberOfLoops = - 1;
[audioPlayer play];

gameLoop - это метод, который содержит основную логику игры. Когда я запускаю приложение на своем тестирующем устройстве, звук воспроизводится, но кажется, что он завис, и gameLoop не работает нормально. Если я удаляю весь код AVAudioPlayer, игра отлично работает в противном случае. Кажется, здесь есть какая-то проблема с потоками, о которой я не знаю. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

Попробуйте переместить код AVAudioPlayer в метод и запустить его в фоновом потоке, например:

- (void)playSong:(NSURL*)atURL
{
   self->audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: atURL error: NULL];
   audioPlayer.delegate = self;
   audioPlayer.numberOfLoops = - 1;
   [audioPlayer play];
}

- (void)viewDidLoad
{
   [super viewDidLoad];

   ...

   NSURL* url = [NSURL fileURLWithPath: @"path-to-song"]
   [self performSelectorInBackground: @selector(playSong:) withObject: url];
}
0 голосов
/ 16 февраля 2011

Удалить повторы по таймеру: Да, чтобы повторять: НЕТ. Может быть, это проблема. Потому что ваш метод gameLoop будет вызываться через каждые 0,3 секунды

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...