multi215
multi215

Reputation: 51

Pick songs from plist(NSArray) and play using AVAudioPlayer?

I'm student working on a coding exercise and I am stumped!

I have two instances of AVAudioPlayer in my app - I can load the songs into each player using a direct path no problem.

What I'd like to be able to do is play multiple songs held within an array on each player.

Is this possible? and if so how would I go about doing this?

In my plist I have the key set to "One.mp3" as a string and the value as the path to the file... (was guessing at that part).

Thanks for any insight.

- (void)viewDidLoad {
    [super viewDidLoad];

    //multiple song array

    NSString *soundsPath = [[NSBundle mainBundle] pathForResource:@"soundslist" 
                                                           ofType:@"plist"];

    soundsList = [[NSArray alloc] initWithContentsOfFile:soundsPath];

    NSString* filename = [soundsList objectAtIndex:0];
    NSString *path = [[NSBundle mainBundle] pathForResource:filename 
                                                     ofType:@"mp3"];  

    AVAudioPlayer * newAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] 
                                                                    error:NULL];  
    self.audioPlayer = newAudio; // automatically retain audio and dealloc old file if new file is loaded

    [newAudio release]; // release the audio safely

    audioPlayer.delegate = self; 
    [audioPlayer prepareToPlay];
    [audioPlayer setNumberOfLoops:0];
    [audioPlayer play];
}

Upvotes: 1

Views: 2608

Answers (1)

Damian Carrillo
Damian Carrillo

Reputation: 1218

It sounds like you want to try to play multiple songs on a single player. This isn't possible as stated in the AVAudioPlayer Overview (4th bullet). It is possible to play multiple songs with multiple AVAudioPlayers. Something like this:

NSMutableArray *audioPlayers = [NSMutableArray arrayWithCapacity:[soundsList count]];

for (NSString *soundPath in soundsList) {
    NSError *error = nil;

    AVAudioPlayer *audioPlayer = [AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error];
    [audioPlayers addObject:audioPlayer];

    audioPlayer.delegate = self; 
    [audioPlayer prepareToPlay];
    [audioPlayer setNumberOfLoops:0];
    [audioPlayer play];
}

I would suggest that you hardcode the file path instead of reading it in with a plist. Once you get that working, then you can try reading it in with the plist. Something like this would work:

NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"One" withExtension:@"mp3"];
AVAudioPlayer *soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error]

This way, you remove one level of indirection and one point of failure.

Upvotes: 1

Related Questions