AVAudioPlayer工作一次

时间:2009-09-16 01:46:27

标签: iphone iphone-sdk-3.0

尝试创建不属于用户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并再次调用create。

唯一的另一件事(我知道,臭名昭着的“唯一的其他事情”声明)就是这一切都在单身人士身上发生。有很多东西可能导致音乐开始和停止播放,更改队列等等,所以我认为最好把它全部包装在一个地方。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我能够自己跟踪这个。我重写了整个部分以获得多个AVAudioPlayer对象,但仍有问题。事实证明[部件发布]线是问题,它导致自动释放程序中的过度释放情况。

答案 1 :(得分:1)

prepareToPlay方法中出现异常的原因之一是“All Exceptions”断点。转到Breakpoint Navigator并禁用它。