123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- //
- // SimpleAudioPlayer.m
- //
- // Created by Kender on 9/11/10.
- //
- #import "SimpleAudioPlayer.h"
- @implementation AVAudioPlayerWithCompletionBlockXXX
- @end
- @implementation SimpleAudioPlayer
- static SimpleAudioPlayer *sharedInstance = nil;
- + (void)initialize
- {
- if (sharedInstance == nil)
- sharedInstance = [[self alloc] init];
- }
- + (SimpleAudioPlayer *)shared
- {
- //Already set by +initialize.
- return sharedInstance;
- }
- + (id)allocWithZone:(NSZone*)zone
- {
- //Usually already set by +initialize.
- @synchronized(self) {
- if (sharedInstance) {
- //The caller expects to receive a new object, so implicitly retain it
- //to balance out the eventual release message.
- return sharedInstance;
- } else {
- //When not already set, +initialize is our caller.
- //It's creating the shared instance, let this go through.
- return [super allocWithZone:zone];
- }
- }
- }
- - (id)init
- {
- //If sharedInstance is nil, +initialize is our caller, so initialize the instance.
- //If it is not nil, simply return the instance without re-initializing it.
- if (sharedInstance == nil) {
- self = [super init];
- if (self) {
- //Initialize the instance here.
- players = [NSMutableSet setWithCapacity:1];
- }
- }
- return self;
- }
- - (AVAudioPlayer *) playFile:(NSString *)name volume:(CGFloat)vol loops:(NSInteger)loops withCompletionBlockXXX:(CompletionBlockXXX)completion
- {
- NSString *filePath = [[NSBundle mainBundle] pathForResource:name ofType:nil];
- if(!filePath) {
- return nil;
- }
- [self stopAllPlayers];
-
- NSError *error = nil;
- NSURL *fileURL = [NSURL fileURLWithPath:filePath isDirectory:NO];
- AVAudioPlayerWithCompletionBlockXXX *player = [[AVAudioPlayerWithCompletionBlockXXX alloc] initWithContentsOfURL:fileURL error:&error];
- player.volume = vol;
- player.numberOfLoops = loops;
- // Retain and play
- if(player) {
- [players addObject:player];
- player.delegate = self;
- player.CompletionBlockXXX = completion;
- [player play];
- return player;
- }
- return nil;
-
- }
- - (void) playFiles:(NSArray*) filesList withCompletionBlockXXX:(CompletionBlockXXX) completion
- {
- __block int idx = 0;
- void(^playBlock)();
- playBlock = ^() {
- if (idx >= filesList.count) {
- if (completion) {
- completion ( YES );
- }
- return ;
- }
- [self playFile:filesList[idx] withCompletionBlockXXX:^(BOOL completed) {
- playBlock ();
- }];
- idx ++;
- };
-
- playBlock ();
- }
- - (AVAudioPlayer *)playFile:(NSString *)name {
-
- return [self playFile:name volume:1.0f loops:0 withCompletionBlockXXX:nil];
- }
- - (AVAudioPlayer *) playLoopedFile:(NSString *) name {
- return [self playFile:name volume:1.0f loops:-1];
- }
- - (AVAudioPlayer *) playFile:(NSString *)name withCompletionBlockXXX:(CompletionBlockXXX)completion
- {
- return [self playFile:name volume:1.0f loops:0 withCompletionBlockXXX:completion];
- }
- - (AVAudioPlayer *)playFile:(NSString *)name volume:(CGFloat)vol loops:(NSInteger)loops {
-
- return [self playFile:name volume:vol loops:loops withCompletionBlockXXX:nil];
- }
- - (void)stopPlayer:(AVAudioPlayer *)player {
- if([players containsObject:player]) {
- player.delegate = nil;
- [players removeObject:player];
- [player stop];
- }
- }
- - (void)stopAllPlayers {
- NSSet *pls = [NSSet setWithSet:players];
- for (AVAudioPlayer *p in pls) {
- [self stopPlayer:p];
- }
- }
- - (void)audioPlayerDidFinishPlaying:(AVAudioPlayerWithCompletionBlockXXX *)player successfully:(BOOL)completed {
-
- if (player.CompletionBlockXXX) {
- player.CompletionBlockXXX ( completed );
- }
- player.delegate = nil;
- [players removeObject:player];
- }
- - (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error {
- //TRC_DBG(@"audioPlayerDecodeErrorDidOccur %@", error);
- player.delegate = nil;
- [players removeObject:player];
- }
- + (AVAudioPlayer *)playFile:(NSString *)name {
- return [[SimpleAudioPlayer shared] playFile:name];
- }
- + (AVAudioPlayer *)playFile:(NSString *)name volume:(CGFloat)vol loops:(NSInteger)loops {
- return [[SimpleAudioPlayer shared] playFile:name volume:vol loops:loops];
- }
- + (AVAudioPlayer *) playFile:(NSString *)name withCompletionBlockXXX:(CompletionBlockXXX)completion
- {
- return [[SimpleAudioPlayer shared] playFile:name withCompletionBlockXXX:completion];
- }
- + (AVAudioPlayer *) playFile:(NSString *)name volume:(CGFloat)vol loops:(NSInteger)loops withCompletionBlockXXX:(CompletionBlockXXX)completion
- {
- return [[SimpleAudioPlayer shared] playFile:name volume:vol loops:loops withCompletionBlockXXX:completion];
- }
- + (AVAudioPlayer *) playLoopedFile:(NSString *) name
- {
- return [[SimpleAudioPlayer shared] playLoopedFile:name];
- }
- + (void)stopPlayer:(AVAudioPlayer *)player {
- return [[SimpleAudioPlayer shared] stopPlayer:player];
- }
- + (void)stopAllPlayers {
- return [[SimpleAudioPlayer shared] stopAllPlayers];
- }
- + (void) playFiles:(NSArray *)filesList withCompletionBlockXXX:(CompletionBlockXXX)completion
- {
- [[SimpleAudioPlayer shared] playFiles:filesList withCompletionBlockXXX:completion];
- }
- @end
|