재생시간이 짧은 효과음등을 재생할때는 SoundPool을 사용할 수 있겠고, 재생시간이 긴 배경음악등을 재생할때는 MediaPlayer를 쓸 수 있겠다.
[공통 전제 : 음악파일은 res/raw 폴더에 있다.]
- raw폴더에 있는 미디어 파일 : correct.ogg / background.ogg
1. SoundPool을 이용한 재생
사운드풀은 재생시간이 짧은 미디어파일을 재생하는데 효율적이다.
사운드풀을 이용해서 플레이를 한 경우 짧은 시간밖에 재생되지 않는다.
간단한 게임같은 경우 효과음을 넣는데 쓸 수 있겠다.
import android.media.SoundPool; import android.media.AudioManager; private SoundPool sound_pool; private int sound_correct; ------------------------------------------------------------------------------------------------------- @Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 사운드풀 생성하기 // ** prameters ** // 1: 동시출력 가능 스트림수 // 2: AudioManager에 정의된 스트림 타입 // 3: sample rate 컨버터의 품질. default로 0을 줌 sound_pool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
// 사운드풀 로드하기
// ** prameters **
// 1: context
// 2: resource
// 3: priority
sound_correct = sound_pool.load(getBaseContext(), R.raw.correct, 1);
// 미디어 재생하기 // ** prameters **
// 1: 리소스 식별
// 2-3: 소리크기
// 4: 우선순위
// 5: 파라미터 반복정보(0:반복x, 1:1번반복(총2번), -1:무한반복)
// 6: 재생속도(1:1x, 2:2x)
sound_pool.play(sound_correct, 1.0f, 1.0f, 0, 0, 1.0f);
} |
재생은 이런식으로 간단하게 끝낼 수 있다.
사실상 미디어 재생시간도 짧게 설정되므로 메모리 관리가 많이 필요없는 어플리케이션이라면 사운드풀 릴리즈에 신경쓸 필요도 없을 듯 하다.
- release를 할 경우
: 사운드풀은 동시출력 가능한 스트림의 수를 정의해서 사용 할 수 있다.
그렇기 때문에 릴리즈를 할때,
각 스트림마다 릴리즈를 할 수 있고, 사운드풀자체에 대해서 릴리즈를 할 수 있다.
2. MediaPlayer를 이용한 재생
상태 다이어그램 (state diagram)
사운드풀에서 사용했던 효과음등에 비해 비교적 길이가 긴, 음악들을 재생하는데 쓴다.
- res/raw 안에 미디어 파일이 있는 경우
import android.media.MediaPlayer; private MediaPlayer background; ------------------------------------------------------------------------------------------------------- @Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// MediaPlayer 객체 생성
// ** parameters **
// 1: context
// 2: resource
// background = new MediaPlayer(); // create를 하므로 따로 new를 사용해 생성할 필요가 없다.
background = MediaPlayer.create(getBaseContext(), R.raw.background);
// MediaPlayer 재생
background.start();
// MediaPlayer 정지
background.stop();
// MediaPlater 해제
background.release();
} |
- SD카드등에서 읽어오는 경우 (onCreate메소드 안에서 이렇게 코딩 하면 재생하자마자 끈다.^^;)
import android.media.MediaPlayer; private MediaPlayer background; ------------------------------------------------------------------------------------------------------- @Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// MediaPlayer 객체 생성
background = new MediaPlayer();
// 미디어파일 소스 설정 및 파일 준비
// ** parameters **
// String : 스트링형식의 파일 경로
background.setDataSource(String);
background.prepare();
// MediaPlayer 반복설정
// ** parameters **
// Boolean : true 또는 false가 들어간다. : true면 반복 활성, false면 반복 비활성
background.setLooping(Boolean);
// MediaPlayer 음량설정
// ** parameters **
// leftVolume : float형식의 숫자를 입력받는다. 1정도 부터 2, 3 등으로 설정하면 된다. 숫자가 높으면 큼
// rightVolume : leftVolume이랑 같다. 기본적으로 스테레오 출력을 지원해주나보다.
background.setVolume(leftVolume, rightVolume);
// MediaPlayer 재생
background.start();
// MediaPlayer 일시 정지
background.pause();
// MediaPlayer 정지
background.stop();
// MediaPlater 해제
// release는 activity가 종료, 정지될 때(onDestroy, onPause 등에서) 한다.
background.release();
} |
사실 사운드풀과 미디어플레이어의 옵션설정은 더 많지만, 많이쓰는 필수기능들에 대해서만 다뤄보았다.
기능별로 메소드를 만들어두고 여기저기서 호출해서 사용하면 편리하다.
내 경우 간단한 게임서 효과음의 경우 사운드풀을 사용하고, 배경음악에는 미디어플레이어를 사용했다.
(숫자게임 넘버스 아이콘)