AVAudioPlayer работает один раз - PullRequest
       6

AVAudioPlayer работает один раз

1 голос
/ 16 сентября 2009

Пытаюсь создать список воспроизведения музыкальных файлов, которые НЕ являются частью библиотеки iphone пользователя, поэтому я использую AVAudioPlayer и сам создаю функцию списка воспроизведения. Он работает на первом проходе (имеется в виду первая песня). Когда первая песня заканчивается и она начинает играть, вторая AVAudioPlayer вылетает в prepareToPlay.

- (void) create {
    Song *song;

    NSArray *parts;
    NSString *path;
    NSString *name;  
    NSError *err;

    if (currentIndex > [queue count])
        currentIndex = 0;
    if (currentIndex < 0)
        currentIndex = ([queue count] - 1);

    song = (Song *) [queue objectAtIndex:currentIndex];
    name = song.fileName;
    parts = [name componentsSeparatedByString:@"."];

    path = [[NSBundle mainBundle] pathForResource:[parts objectAtIndex:0] ofType:[parts objectAtIndex:1]];
    NSURL *url = [[NSURL alloc] initFileURLWithPath:path];

    [[AVAudioSession sharedInstance] setDelegate: self];
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &err];
    [[AVAudioSession sharedInstance] setActive: YES error: &err];

    appPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: url error: &err];

    [url release];
    [parts release];

    [appPlayer prepareToPlay];
    [appPlayer setVolume: 1.0];
    [appPlayer setDelegate: self];
}

- (void) audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL) flag { 
    [appPlayer stop];
    [appPlayer release];
    appPlayer = nil;

    [self next];
}

Вызов [self next] просто увеличивается currentIndex, а вызовы создаются снова.

Единственное другое (я знаю, печально известное утверждение "только другое") это то, что все это происходит внутри Синглтона. Есть много вещей, которые могут заставить музыку начинать и останавливать воспроизведение, изменять очередь и т. Д., Поэтому я подумал, что лучше всего обернуть все это в одном месте.

Есть мысли?

Ответы [ 2 ]

1 голос
/ 04 января 2013

Одной из причин возникновения исключения в методе prepareToPlay является включенная точка останова «Все исключения». Зайдите в Breakpoint Navigator и отключите его.

1 голос
/ 17 сентября 2009

Я смог отследить это сам. Я переписал весь раздел, чтобы иметь несколько объектов AVAudioPlayer, но все еще были проблемы. Оказывается, что проблема была в строке [release release], она вызывала перепроизводство ситуации в процедуре автоматического выпуска.

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