1

I'm working with about 50 AVAudioPlayers that each load a separate audio file. The files are fixed and within the app bundle. They are triggered by events later on in the app. Currently I'm hardcoding the creation of each player instance, like so:

//No01
NSURL *no01URL = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource:@"audio1" ofType:@"aiff"]]; 
self.no01Player = [[AVAudioPlayer alloc] initWithContentsOfURL:no01URL error:nil];  
no01Player.numberOfLoops = 0;
no01Player.volume = 0;
no01Player.delegate = self;

//No02
NSURL *no02URL = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource:@"audio2" ofType:@"aiff"]]; 
self.no02Player = [[AVAudioPlayer alloc] initWithContentsOfURL:no02URL error:nil];  
no02Player.numberOfLoops = 0;
no02Player.volume = 0;
no02Player.delegate = self;

//No03 and so on...

Obviously this is labourious and bad coding practice. I'd like to instead have the list of files in a Plist and load these into variables that populate just one example of the above code. I'd like to learn how to be DRY with this but have limited experience of loading data from Plists, arrays, dictionaries, etc.

Any help is appreciated, even if it is to point me in the direction of a relevant tutorial.

Thank you.

MightyMeta
  • 599
  • 4
  • 14

2 Answers2

4

You can simply place the audio file names in text file using 'new line' separator. And read the file and store the names in an array. To create the URL take the file names dynamically from array as given below

// Read description from text file
NSBundle *audioBundle = [NSBundle mainBundle];
NSString *audioPath = [audioBundle pathForResource:audioFileNames ofType:@"txt"];
NSString *audioContent = [NSString stringWithContentsOfFile:audioPath encoding:NSUTF8StringEncoding error:nil];
// ===========Make an array using audioContent=============
NSArray *audioFiles = [audioContent componentsSeparatedByString:@"\n"];

Use the array to get file names :

NSURL *no01URL = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[audioFiles objectAtIndex:audioCount]] ofType:@"aiff"]];  

If your file names are like audio1,audio2.. no need of using all these. Just change in URL like :

NSURL *no01URL = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"audio%d",audioCount] ofType:@"aiff"]];  
Anusha Kottiyal
  • 3,855
  • 3
  • 28
  • 45
  • Hi Anusha, thanks for the advice. I'd prefer a Plist rather than a plain text file though, since I may need to associate other attributes with each audio clip. Also, with your examples above, where/how would the audioCount variable get defined? – MightyMeta Dec 26 '12 at 21:59
  • @MightyMeta In your above code directly use audio1,audio2,etc.. If you put it in a loop you can take that loop count as audioCount. – Anusha Kottiyal Dec 27 '12 at 03:58
1

OK for anyone else needing to do this, here's what I ended up with:

//Load location data from Plist file into an Array

NSString *path = [[NSBundle mainBundle] pathForResource:@"Audionodes" ofType:@"plist"];
locationArray = [[NSArray alloc] initWithContentsOfFile:path];

// Create AVAudioPlayers for this view

self.audioPlayerArray = [[NSMutableArray alloc] init];

for (int i = 0; i < [locationArray count]; i++) {

    NSString *filename = [[locationArray objectAtIndex:i] valueForKey:@"filename"];
    NSString *filetype = [[locationArray objectAtIndex:i] valueForKey:@"filetype"];
    int loops = [[[locationArray objectAtIndex:i] valueForKey:@"loops"] intValue];
    NSURL *url = [[NSURL alloc]initFileURLWithPath:[[NSBundle mainBundle] pathForResource:filename ofType:filetype]];

    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    player.delegate = self;
    player.numberOfLoops = loops;
    player.volume = 0;

    [self.audioPlayerArray addObject:player];

    [url release];
    [player release];

}

Putting the generated players in audioPlayerArray means I can get at them later.

MightyMeta
  • 599
  • 4
  • 14