[cocos2d] 럴쑤럴쑤 이럴쑤! cocosDenshion 의 CDAudioManager 는 iPhone 4 에서 BGM재생이 되질 않는다?!
내가끄적인글/프로그래밍 2011. 2. 14. 18:00
SimpleAudioEngine *soundEngine_;
//-- 이 아래에는 AVAudioPlayer를 위한 멤바들.
BOOL isAVAudioPlayer; //한번이라도 AVAudioPlayer를 이용하여 배경음을 재생하면 셋팅된다.
//차선책으로 쓰는 AVAudioPlayer
AVAudioPlayer *bgmPlayer;
CGFloat fadeAmt; //Fadeout시 감소값.
CGFloat fadeDesc; //Fadein시 목표값.
-(SimpleAudioEngine *) soundEngine
isAVAudioPlayer = NO;
fadeAmt = 0;
if (self.bgmPlayer != nil) {
[self stopBGMwithAudioPlayer];
}
//배경음 재생을 시작한다.
-(void)playBGMwithAudioPlayer:(NSString*)filename ext:(NSString*)ext volume:(CGFloat)vol{
if (self.isSoundOn) {
[self stopBGMwithAudioPlayer];
if(self.bgmPlayer == nil){
self.bgmPlayer = [self createAudioPlayer:filename ext:ext volume:vol];
//-1은 무한반복
self.bgmPlayer.numberOfLoops = -1;
}
[self.bgmPlayer play];
}
}
-(void)stopBGMwithAudioPlayer{
if (self.isSoundOn && self.bgmPlayer != nil) {
NSLog(@"AVAudioPlayer 스탑!");
[self.bgmPlayer stop];
// self.bgmPlayer.currentTime = 0; //rewind
self.bgmPlayer = nil;
}
}
//오디오 플레이어를 만든다.
-(AVAudioPlayer*)createAudioPlayer:(NSString*)filename ext:(NSString*)ext volume:(CGFloat)vol{
NSString *audioPath = [[NSBundle mainBundle]pathForResource:filename ofType:ext];
NSLog(@"새로운 AVAudioPlayer 생성 %@.%@ (%f%%)",filename,ext,vol);
AVAudioPlayer *tmpAudioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:audioPath] error:nil];
tmpAudioPlayer.numberOfLoops = 0;
tmpAudioPlayer.volume = vol;
//소리를 위해 버퍼에 로딩
[tmpAudioPlayer prepareToPlay];
isAVAudioPlayer = YES;
[tmpAudioPlayer autorelease];
return tmpAudioPlayer;
}
//음악을 서서히 죽여준다.
-(void)fadeoutBGMwithAudioPlayer{
if (self.bgmPlayer!=nil && self.bgmPlayer.volume > 0.01f) {
//2초정도 소리를 줄여주기 위하여
if (fadeAmt == 0) fadeAmt = self.bgmPlayer.volume/20;
self.bgmPlayer.volume = self.bgmPlayer.volume - fadeAmt;
[self performSelector:@selector(fadeoutBGMwithAudioPlayer) withObject:nil afterDelay:0.1f];
} else {
NSLog(@"fadeOut finish");
fadeAmt = 0;
[self stopBGMwithAudioPlayer];
}
}
//음악을 서서히 살려준다.
-(void)fadeinBGMwithAudioPlayer{
//NSLog(@"fadeIn %f amount %f desc %f",self.bgmPlayer.volume,fadeAmt,fadeDesc);
if (self.bgmPlayer!=nil && self.bgmPlayer.volume <= fadeDesc) {
//2초정도 소리를 줄여주기 위하여
if (fadeAmt == 0) fadeAmt = fadeDesc/20;
self.bgmPlayer.volume = self.bgmPlayer.volume + fadeAmt;
[self performSelector:@selector(fadeinBGMwithAudioPlayer) withObject:nil afterDelay:0.1f];
} else {
NSLog(@"fadeIn finish");
fadeAmt = 0;
}
}
//BGM재생.
-(void) playBGM:(NSString*)filename ext:(NSString*)ext volume:(CGFloat)vol{
if (self.isSoundOn){
//soundEngine
if (!isAVAudioPlayer && [self soundEngine] != nil) {
NSLog(@"soundEngine 으로 배경음 재생 시도.");
[self soundEngine].backgroundMusicVolume = vol;
[[self soundEngine] playBackgroundMusic:[[NSBundle mainBundle] pathForResource:filename ofType:ext] loop:YES];
}
NSLog(@"soundEngine : isBackgroundMusicPlaying (%d), isAVAudioPlayer(%d)",[[self soundEngine] isBackgroundMusicPlaying],isAVAudioPlayer);
if (isAVAudioPlayer || [self soundEngine] == nil || ([self soundEngine] != nil && ![[self soundEngine] isBackgroundMusicPlaying])) {
//AudioPlayer
NSLog(@"soundEngine 으로 배경음 재생 실패하여 AVAudioPlayer 로 시도.");
[self playBGMwithAudioPlayer:filename ext:ext volume:vol];
}
}
}
-(void) fadeinBGM:(NSString*)filename ext:(NSString*)ext volume:(CGFloat)vol{
if (self.isSoundOn){
//soundEngine
if (!isAVAudioPlayer && [self soundEngine] != nil) {
NSLog(@"soundEngine 으로 배경음 페이드 인 재생 시도.");
[self soundEngine].backgroundMusicVolume = 0;
[[self soundEngine] playBackgroundMusic:[[NSBundle mainBundle] pathForResource:filename ofType:ext] loop:YES];
[CDXPropertyModifierAction fadeBackgroundMusic:2.0f finalVolume:vol curveType:kIT_SCurve shouldStop:NO];
}
if (isAVAudioPlayer || [self soundEngine] == nil || ([self soundEngine] != nil && ![[self soundEngine] isBackgroundMusicPlaying])) {
//AudioPlayer
NSLog(@"soundEngine 으로 배경음 재생 실패하여 AVAudioPlayer 로 페이드 인 재생 시도.");
fadeDesc = vol;
[self playBGMwithAudioPlayer:filename ext:ext volume:0];
[self fadeinBGMwithAudioPlayer];
}
}
}
-(void) stopBGM{
if (self.isSoundOn){
if (isAVAudioPlayer) {
[self stopBGMwithAudioPlayer];
} else {
if ([self soundEngine] != nil){
[[self soundEngine] stopBackgroundMusic];
}
}
}
}
-(void) fadeoutBGM {
if (self.isSoundOn) {
if (isAVAudioPlayer) {
[self fadeoutBGMwithAudioPlayer];
} else {
if ([self soundEngine] != nil){
//2초 페이드 아웃.
[CDXPropertyModifierAction fadeBackgroundMusic:2.0f finalVolume:0.0f curveType:kIT_SCurve shouldStop:YES];
}
}
}
}
- (덧) COCOS 2D 1.0rc 버전에서는 수정되었음 -_-.........
'내가끄적인글 > 프로그래밍' 카테고리의 다른 글
[iOS App] D-Day 관리 앱 - Day : 예쁘고 간편한 디데이 알리미 (69) | 2011.12.15 |
---|---|
[iOS App] 일정관리(Events List) APP 이 드디어 iTunes Store 에 출시! (26) | 2011.10.14 |
[iOS] GameCenter 를 내 어플에 붙여보자! (+ GameCenter Notification) (30) | 2011.04.19 |
[objC] 상위클래스에서 선언한 변수를 상속받은 클래스에서 undeclared 나는 경우.. (0) | 2011.02.11 |
[cocos2d] 게임 개발 시작 (0) | 2011.01.31 |
[iOS] iOS (iPhone,iPod touch) 의 MKMapView 정리하기 (47) | 2010.11.18 |