마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Mediaplayer와 Soundpool의 충돌? 꼬임?

0 추천

안녕하세요.

현재 슈팅 게임을 하나 만들고 있고 거의 출시 직전 단계인 상태입니다.

그런데 사운드 재생에 관련해 킷캣에서 심각한 문제가 발생해 절망에 빠져있습니다... ㅠㅠ

 

개인의 노력과 굴지의 구글링을 포함해,

100시간은 넘게 코드를 고쳐보고 수백번 테스트를 해보았지만...

여전히 고쳐지지가 않아서...

지금 심정은 울고싶을 정도네요...... 도움이 간절합니다.

 

배경음악은 Mediaplayer를 이용해서, 효과음은 Soundpool을 이용해서 구현하였구요.

Mediaplayer의 객체는 매번 create() 하는게 아니라 안전성을 위해 시작할 때 딱 하나만 생성해놓고,

배경음악은 리소스 id를 넘겨주고 직접 데이터 소스를 셋팅하는 방식으로 재생합니다.

 

Soundpool을 이용한 효과음은 앱의 시작시와 스테이지 로딩간에 필요한 데이터를 load() 해두므로,

로드가 덜 되거나 하는 문제는 전혀 발생할 수 없는 구조입니다.

 

4.1.2 버전 등에서는 전혀 문제없이 작동됩니다.

배경음악은 메뉴에 따라 수시로 변경되고 게임 중에는 일시정지를 누르거나 다시 해제함에 따라 멈추고, 재생되죠.

 

하지만... 킷캣에서는 문제가 발생하는데요. 구체적인 문제는 이렇습니다.

배경음악이 재생되는 Mediaplayer를 start(), pause(), resume(), reset()만하면,

(데이터 세팅이나 setLooping()을 설정하거나 seekTo(), setVolumn() 등은 전혀 문제없음.)

거의 무조건 Soundpool의 모든 사운드가 먹통이 되어버립니다.

네, Mediaplayer가 아니라 Soundpool입니다.

배경음악을 조작하는데 뜬금없이 효과음을 재생하던 멀쩡한 Soundpool이 말이에요...

에러는 전혀 없습니다. 로그캣도 전혀 나타나지 않아요. 그러나 실제로 소리는 나지 않습니다.

Mediaplayer를 몇번 pause(), resume()을 더 해보면 살아나기도 합니다;;

 

배경음악이 바뀌면, 바뀐 새로운 배경음악만 흘러나오고 모든 효과음은 일시에 먹통이 됩니다.

일시정지를 하면, 당연히 배경음악은 일시정지가 되는데,

멀쩡하던 Soundpool이 또 먹통이 되서 일시정지 화면에서의 다른 버튼 조작 효과음이 전혀 나지 않습니다.

 

신기한건 이 상태에서 계속해서 효과음이 나도록 유도하면(다른 기능의 버튼을 계속 누름) 계속해서 소리가 나지 않지만,

5초 이상 아무것도 하지 않다가 조작하면 Soundpool이 살아났는지 효과음이 납니다.

그러다가도 게임이 진행되며 보스전에 진입해 배경음악이 보스음악으로 바뀌면,

다시 미사일 발사 소리 등의 모든 효과음은 먹통이 되는거죠.

이것참 '효과음이 나지 않을 때에는 일시정지를 한 후 5초 이상 대기 후에 조작해주세요.'라고 할 수도 없는 노릇이구요.

 

어째서 Mediaplayer를 건드리는데 Soundpool이 먹통이 되었다 살아났다 하는건지...

도통 알 수가 없습니다.

 

배경음악을 재생하는 코드는 이렇습니다.

물론 배경음악의 재생과 일시정지, 변경에는 전혀 문제가 없습니다.

try {
	AssetFileDescriptor afd = MainActivity.getMainView().getContext().getApplicationContext().getResources().openRawResourceFd(resid);
	if (afd == null)
		return;
	mp.reset();
	mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
	mp.setLooping(true);
	afd.close();
	mp.prepare();
	mp.setOnPreparedListener(new OnPreparedListener() {
		public void onPrepared(final MediaPlayer mp_p) {
			mp_p.setVolume(1f, 1f);
			mp_p.start();
		}
	});
} catch (Exception e) {
	if(mp != null)
		mp.reset();
}

배경음악의 일시정지 및 Resume은, 당연하지만 단순히 pause(), resume()의 호출입니다.

Soundpool의 효과음 재생은 당연히 play()구요.

 

위에서 언급했듯이 100시간이 넘게 수백번의 코드를 시도해 보았는데...

배경음악 재생코드를 Thread로 바꾸기도 해봤고, 앞, 뒤, 중간 지점마다 Sleep을 걸어보기도 했고,

Handler에 post 시켜보기도 하고, Soundpool 재생 코드를 Handler에 넣어보기도 하고,

Thread에 넣고 그 안에서 다시 Handler에 넣보기도 하고...

Soundpool을 Mediaplayer를 건드는 시점 앞, 뒤, 중간마다 autoPause(), autoResume()도 해보고,

진짜 별의별 방법을 다 시도해보았는데...

일시정지만 해보면(Mediaplayer.pause()가 호출됨) 효과음은 여전히 죽고...

보스만 나타났다하면(배경음악 변경) 효과음은 또 죽고...

 

짜증을 넘어서서 화도나고 이제 그냥 슬프네요...

사운드 문제 관련해서 여러 문제를 겪어보신 분의 조언을 간절하게 구합니다...ㅠㅠ

Jinthree (8,980 포인트) 님이 2014년 11월 22일 질문
Jinthree님이 2014년 11월 22일 수정

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...