Programming

[Android] Soundpool 사용하기 + 사용하면서 안 것.

라우드니스 2011. 2. 14. 21:02

Soundpool을 사용하는것은 안드로이펍에 너무 잘 나와있어서 더 설명하는건 의미 없는 것 같습니다.

그 외에 Soundpool에 대해 몇가지 더 설명을 하자면

1. Soundpool은 소리가 자동으로 겹친다.

java에서 음악파일을 overlap 시켜서 실행하려다 실패해서 안드로이드에서 어떻게 하려나, 생각했는데 Soundpool은 알아서 실행 시킬 때 마다 overlap 돼서 나옵니다. 다수의 효과음을 겹쳐서 들려줘야 했는데, 편하게 해결.

2. 하나의 Soundpool에서 여러개의 음악파일을 열어도 overlap 된다.

test해보기 전에는 Soundpool을 여러개 만들어야 하나, 생각했었는데 해보니까 잘 됩니다. 밑에 Source code에서 버튼 하나는 1번파일을, 다른 거 하나는 2번파일을 열어놓고 동일한 Soundpool에서 실행하지만 두개가 독립적으로 실행됩니다.



참고로, 소스코드에 등장하는 파일은 제 SD카드에 있던걸로, 별도의 파일을 준비해서 테스트 해보세요.

public class MainActivity extends Activity {
	private Button playButton;
	private Button playButton2;
	Sound sound;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        playButton = (Button)findViewById(R.id.playButton);
        playButton2 = (Button)findViewById(R.id.playButton2);
        sound = new Sound();
        
        sound.setSoundFile("/sdcard/test/BGM1.ogg", "test");
        sound.setSoundFile("/sdcard/test/BGM4.ogg", "test2");
        
        playButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				sound.playSound("test");
			}
		});
        
        playButton2.setOnClickListener(new OnClickListener() {
        	@Override
        	public void onClick(View v) {
        		sound.playSound("test2");
        	}
        });
        
    }
}

class Sound {
	private SoundPool soundPool;
	private HashMap soundBeep;
	
	public Sound() {
		soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0 );
		soundBeep = new HashMap();
	}
	
	public void setSoundFile(String path, String key) {
		soundBeep.put(key, soundPool.load(path, 1));
	}
	
	public void playSound(String key) {
		soundPool.play(soundBeep.get(key), 1f, 1f, 0, 0, 1f);
	}
}

반응형