Androidで音を再生してみる

今回はSoundPoolクラスを使って音を再生してみたいと思います。再生する音楽ファイルはogg形式でassetsフォルダ配下に格納されているものを使用するので、前回、投稿のAssetManagerも使用します。

やりたいこと

  1. SoundPoolオブジェクトを取得する
  2. assetsフォルダ配下に保存されたoggファイルのFileDescriptorを取得する
  3. 音源をメモリーにloadする
  4. 音を再生する

「Play sound」ボタンを押すと音が再生されます

実装の要点を下記にまとめます

1. 音量ボタンが音楽のStreamを制御するように紐付ける

setVolumeControlStream(AudioManager.STREAM_MUSIC);

2. SoundPoolオブジェクトを取得

private static final int SOUND_NUM = 10;
private SoundPool mSp;

mSp = new SoundPool(SOUND_NUM, AudioManager.STREAM_MUSIC, 0);

3. AssetManagerを取得し、AssetFileDescriptorを取得

private static final String AUDIO = "metal.ogg";

AssetManager am = getAssets();

try {
    AssetFileDescriptor fd = am.openFd(AUDIO);
} catch (IOException e) {
    e.printStackTrace();
}

4. FileDescripterを使って、使用するサウンドをloadしIDを取得する

private int mId = -1;

mId = mSp.load(fd, 1);

5. サウンドのIDを指定して再生

mSp.play(mId, 1, 1, 0, 0, 1);

6. 使わなくなったサウンドをunloadして、SoundPoolはreleaseする

mSp.unload(mId);
mSp.release();

では実装です

package com.android.practice;

import java.io.IOException;

import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.TextView;

public class SoundPoolTest extends Activity implements OnClickListener {
    
	private static final String TAG = SoundPoolTest.class.getSimpleName();
	private static final int SOUND_NUM = 10;
	private static final String AUDIO = "metal.ogg";
	
	private SoundPool mSp;
	private int mId = -1;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.main);
        Button btn = (Button)findViewById(R.id.button);
        TextView textView = (TextView)findViewById(R.id.text);
        btn.setOnClickListener(this);
        
        //音量ボタンが音楽のStreamを制御するように紐付ける
        setVolumeControlStream(AudioManager.STREAM_MUSIC);
        
        //SoundPoolオブジェクトを取得
        mSp = new SoundPool(SOUND_NUM, AudioManager.STREAM_MUSIC, 0);
        
        //AssetManagerを取得
        AssetManager am = getAssets();
        try {
        	//AssetFileDescriptorを取得
			AssetFileDescriptor fd = am.openFd(AUDIO);
			//FileDescripterを使って、使用するサウンドをloadしIDを取得する
			mId = mSp.load(fd, 1);
		} catch (IOException e) {
			e.printStackTrace();
			textView.setText(R.string.error);
		}
    }
    
	@Override
	protected void onDestroy() {
		super.onDestroy();
		if(mSp != null){
			if(mId != -1){
				//使わなくなったサウンドをunload
				mSp.unload(mId);
			}
			//SoundPoolが使用しているリソースを全て解放
			mSp.release();
		}
	}
	
	@Override
	public void onClick(View v) {
		if(mId != -1){
			//サウンドのIDを指定して再生
			mSp.play(mId, 1, 1, 0, 0, 1);
		}
	}
}

と、こんな感じです。ゲームで使う効果音などはSoundPoolを使ってメモリーにloadして、音を再生するという事です。

HashTag #Java, #Android, #SoundPool, #AssetManager, #AssetFileDescriptor, #AudioManager