SimpleAudioPlayer.m 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. //
  2. // SimpleAudioPlayer.m
  3. //
  4. // Created by Kender on 9/11/10.
  5. //
  6. #import "SimpleAudioPlayer.h"
  7. @implementation AVAudioPlayerWithCompletionBlockXXX
  8. @end
  9. @implementation SimpleAudioPlayer
  10. static SimpleAudioPlayer *sharedInstance = nil;
  11. + (void)initialize
  12. {
  13. if (sharedInstance == nil)
  14. sharedInstance = [[self alloc] init];
  15. }
  16. + (SimpleAudioPlayer *)shared
  17. {
  18. //Already set by +initialize.
  19. return sharedInstance;
  20. }
  21. + (id)allocWithZone:(NSZone*)zone
  22. {
  23. //Usually already set by +initialize.
  24. @synchronized(self) {
  25. if (sharedInstance) {
  26. //The caller expects to receive a new object, so implicitly retain it
  27. //to balance out the eventual release message.
  28. return sharedInstance;
  29. } else {
  30. //When not already set, +initialize is our caller.
  31. //It's creating the shared instance, let this go through.
  32. return [super allocWithZone:zone];
  33. }
  34. }
  35. }
  36. - (id)init
  37. {
  38. //If sharedInstance is nil, +initialize is our caller, so initialize the instance.
  39. //If it is not nil, simply return the instance without re-initializing it.
  40. if (sharedInstance == nil) {
  41. self = [super init];
  42. if (self) {
  43. //Initialize the instance here.
  44. players = [NSMutableSet setWithCapacity:1];
  45. }
  46. }
  47. return self;
  48. }
  49. - (AVAudioPlayer *) playFile:(NSString *)name volume:(CGFloat)vol loops:(NSInteger)loops withCompletionBlockXXX:(CompletionBlockXXX)completion
  50. {
  51. NSString *filePath = [[NSBundle mainBundle] pathForResource:name ofType:nil];
  52. if(!filePath) {
  53. return nil;
  54. }
  55. [self stopAllPlayers];
  56. NSError *error = nil;
  57. NSURL *fileURL = [NSURL fileURLWithPath:filePath isDirectory:NO];
  58. AVAudioPlayerWithCompletionBlockXXX *player = [[AVAudioPlayerWithCompletionBlockXXX alloc] initWithContentsOfURL:fileURL error:&error];
  59. player.volume = vol;
  60. player.numberOfLoops = loops;
  61. // Retain and play
  62. if(player) {
  63. [players addObject:player];
  64. player.delegate = self;
  65. player.CompletionBlockXXX = completion;
  66. [player play];
  67. return player;
  68. }
  69. return nil;
  70. }
  71. - (void) playFiles:(NSArray*) filesList withCompletionBlockXXX:(CompletionBlockXXX) completion
  72. {
  73. __block int idx = 0;
  74. void(^playBlock)();
  75. playBlock = ^() {
  76. if (idx >= filesList.count) {
  77. if (completion) {
  78. completion ( YES );
  79. }
  80. return ;
  81. }
  82. [self playFile:filesList[idx] withCompletionBlockXXX:^(BOOL completed) {
  83. playBlock ();
  84. }];
  85. idx ++;
  86. };
  87. playBlock ();
  88. }
  89. - (AVAudioPlayer *)playFile:(NSString *)name {
  90. return [self playFile:name volume:1.0f loops:0 withCompletionBlockXXX:nil];
  91. }
  92. - (AVAudioPlayer *) playLoopedFile:(NSString *) name {
  93. return [self playFile:name volume:1.0f loops:-1];
  94. }
  95. - (AVAudioPlayer *) playFile:(NSString *)name withCompletionBlockXXX:(CompletionBlockXXX)completion
  96. {
  97. return [self playFile:name volume:1.0f loops:0 withCompletionBlockXXX:completion];
  98. }
  99. - (AVAudioPlayer *)playFile:(NSString *)name volume:(CGFloat)vol loops:(NSInteger)loops {
  100. return [self playFile:name volume:vol loops:loops withCompletionBlockXXX:nil];
  101. }
  102. - (void)stopPlayer:(AVAudioPlayer *)player {
  103. if([players containsObject:player]) {
  104. player.delegate = nil;
  105. [players removeObject:player];
  106. [player stop];
  107. }
  108. }
  109. - (void)stopAllPlayers {
  110. NSSet *pls = [NSSet setWithSet:players];
  111. for (AVAudioPlayer *p in pls) {
  112. [self stopPlayer:p];
  113. }
  114. }
  115. - (void)audioPlayerDidFinishPlaying:(AVAudioPlayerWithCompletionBlockXXX *)player successfully:(BOOL)completed {
  116. if (player.CompletionBlockXXX) {
  117. player.CompletionBlockXXX ( completed );
  118. }
  119. player.delegate = nil;
  120. [players removeObject:player];
  121. }
  122. - (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error {
  123. //TRC_DBG(@"audioPlayerDecodeErrorDidOccur %@", error);
  124. player.delegate = nil;
  125. [players removeObject:player];
  126. }
  127. + (AVAudioPlayer *)playFile:(NSString *)name {
  128. return [[SimpleAudioPlayer shared] playFile:name];
  129. }
  130. + (AVAudioPlayer *)playFile:(NSString *)name volume:(CGFloat)vol loops:(NSInteger)loops {
  131. return [[SimpleAudioPlayer shared] playFile:name volume:vol loops:loops];
  132. }
  133. + (AVAudioPlayer *) playFile:(NSString *)name withCompletionBlockXXX:(CompletionBlockXXX)completion
  134. {
  135. return [[SimpleAudioPlayer shared] playFile:name withCompletionBlockXXX:completion];
  136. }
  137. + (AVAudioPlayer *) playFile:(NSString *)name volume:(CGFloat)vol loops:(NSInteger)loops withCompletionBlockXXX:(CompletionBlockXXX)completion
  138. {
  139. return [[SimpleAudioPlayer shared] playFile:name volume:vol loops:loops withCompletionBlockXXX:completion];
  140. }
  141. + (AVAudioPlayer *) playLoopedFile:(NSString *) name
  142. {
  143. return [[SimpleAudioPlayer shared] playLoopedFile:name];
  144. }
  145. + (void)stopPlayer:(AVAudioPlayer *)player {
  146. return [[SimpleAudioPlayer shared] stopPlayer:player];
  147. }
  148. + (void)stopAllPlayers {
  149. return [[SimpleAudioPlayer shared] stopAllPlayers];
  150. }
  151. + (void) playFiles:(NSArray *)filesList withCompletionBlockXXX:(CompletionBlockXXX)completion
  152. {
  153. [[SimpleAudioPlayer shared] playFiles:filesList withCompletionBlockXXX:completion];
  154. }
  155. @end