Как создать приложение аудиоплеера, подобное приложению pandora?

#iphone #memory-management #avaudioplayer

#iPhone #управление памятью #avaudioplayer

Вопрос:

Я создал приложение, которое воспроизводит несколько аудиофайлов локально. Аудиофайлы длинные. Аудиоплеер имеет следующие опции для пользователя

  • Пересылка,
  • Перемотать,
  • Следующий трек,
  • Предыдущий трек,

Я планирую использовать AVAudioPlayer, чтобы я мог воспроизводить аудио в течение длительного времени. Когда я меняю аудиофайл, то есть нажимаю следующую дорожку аудио. Экземпляр audioplayer не выпускается. Эта проблема возникает только несколько раз. Пожалуйста, помогите мне ..!! Я меньше помогаю..

Метод IBAction кнопки следующего трека

 - (IBAction) nextTrackPressed
{
    [audioPlay stopAudio];
    if (audioPlay) {
        audioPlay = nil;
        [audioPlay release];
    }

    appDelegate.trackSelected  = 1; 
    [self intiNewAudioFile];
    [self play];
}

Initializing audio file through below method

-(void) intiNewAudioFile
{
    NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init];

    NSString *filePath = [[NSString alloc] init]; 

    trackObject = [appDelegate.trackDetailArray objectAtIndex:appDelegate.trackSelected];
    NSLog(@"%@",trackObject.trackName);
    // Get the file path to the song to play.
    filePath = [[NSBundle mainBundle] pathForResource:trackObject.trackName ofType:@"mp3"];

    // Convert the file path to a URL.
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:filePath];

    if (audioPlay) {
        audioPlay = nil;
        [audioPlay release];
    }

    audioPlay = [[AudioPlayerClass alloc] init];
    [audioPlay initAudioWithUrl:fileURL];

    [filePath release];
    [fileURL release];
    [subPool release];
}
  

Реализация AudioPlayerClass

 #import "AudioPlayerClass.h"


@implementation AudioPlayerClass

- (void) initAudioWithUrl: (NSURL *) url
{

    curAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    [curAudioPlayer setDelegate:self];
    [curAudioPlayer prepareToPlay];
}

- (void) playAudio
{
    [curAudioPlayer play];
}

- (void) pauseAudio
{
    [curAudioPlayer pause];
}

- (void) stopAudio
{
    [curAudioPlayer stop];
}

- (BOOL) isAudioPlaying
{
    return curAudioPlayer.playing;
}

- (void) setAudiowithCurrentTime:(NSInteger) time
{
    curAudioPlayer.currentTime = time;
}

- (NSInteger) getAudioFileDuration
{
    return curAudioPlayer.duration;
}

- (NSInteger) getAudioCurrentTime
{
    return curAudioPlayer.currentTime;
}

- (void) releasePlayer
{
    [curAudioPlayer release];
}

- (void)dealloc {
    [curAudioPlayer release];
    [super dealloc];
}

@end
  

Комментарии:

1. Без какого-либо кода и без того, чтобы мой cristal ball был в ремонте, это будет непросто. Пожалуйста, опубликуйте какой-нибудь соответствующий код.

2. Спасибо Робин за ответ. Я загрузил код.

Ответ №1:

Ваша проблема здесь:

 if (audioPlay) {
        audioPlay = nil;
        [audioPlay release];
    }
  

Вы устанавливаете значение audioPlay равным нулю перед вызовом release, что означает, что сообщение о выпуске отправляется с нулевым значением. Вам нужно изменить порядок следования этих двух строк.

 if (audioPlay) {
        [audioPlay release];
         audioPlay = nil;
    }