SoundPool でサウンド再生 ~リソース版

 SE再生を想定して、SoundPool でサウンド・ファイルを再生してみたよ。
 作ってみたのは、下記ソース。(Android1.6 ベース)

public class mySound extends Activity {

	private SoundPool sp;
	int seID = -1;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);


		//リソースファイルからSE
		sp = new SoundPool( 5, AudioManager.STREAM_MUSIC, 0 );
		seID = sp.load( this, R.raw.voice, 1 );

		//	Button01
		Button but_PlaySE = (Button) this.findViewById( R.id.Button01 );
		but_PlaySE.setText( "PlaySE 0" );
		but_PlaySE.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				sp.play( seID, 1.0F, 1.0F, 0, 0, 1.0F);
			}
		});
		//---------------

	}

	@Override
	public void onDestroy(){

		sp.stop( seID );
		sp.unload( seID );
		sp.release();
		
		super.onDestroy();
		// アクティビティの終了
		finish();
	}
}
  • layout のmain.xml にbutton をひとつ設け、ボタンを押されるとサウンドが再生されるようにしている。
  • ボタンを押されるたびにサウンドが再生され、これは多重再生になる。
  • 再生するファイルは、リソース・ファイル。
     サウンド・ファイルは、res の中に raw というディレクトリを作って、その中に格納する。
  • ファイル・フォーマットは、ogg。
     Android-x86 の仕様なのか、mp3 は再生できなかった。

オブジェクトの生成

	sp = new SoundPool( 5, AudioManager.STREAM_MUSIC, 0 );

 再生チャンネルを、5つ。
 クオリティを、0 で設定。
※. 今回のソースでは、1つの音しか再生しないけど、とりあえずで5つで設定してみた。

load

	seID = sp.load( this, R.raw.voice, 1 );

 最後の引数・1 は、priority。
 他のチャンネルとの音量バランスみたいなものかね?

 load 時にチャンネルID が返されるので、これを保持しておく。
 再生キューは、このID を引数にして実行するんだ。

 なので、複数チャンネル設ける時は、配列なんかで保持することになるね。

 今回のソースはAndroid1.6 ベースなので、load 完了を調べることができない。
 load が完了しないと音が再生されないから、ちと困りもの…。
 アプリに実装する場合は注意しないといけないね。

play

	sp.play( seID, 1.0F, 1.0F, 0, 0, 1.0F);

 引数はそれぞれ、以下のようになっている。

	sooundID : loadした時の返り値
	leftVolume : 左スピーカーの音量。
	rightVolume : 右スピーカーの音量。
	priority : プライオリティ( 0が一番優先度が高い )
	loop : ループ回数( -1 = 無限ループ。0 = ループなし )
	rate : 再生速度( 0.5~2倍速まで設定可能 )

 素で鳴らすだけじゃなく、いろいろできそうだ。

onDestroy

 再生停止だけじゃなく、メモリー解放なんかもしている。
 ”試してみた” 程度のものなんで、不必要なこともやってるかも。(^_^;

setOnLoadCompleteListener

 Android2.2 以降では、setOnLoadCompleteListener でload 完了を通知できるようになっている。
 通知を受け取ったら、フラグを立てる構造にするのがベスト。

by te way…

 SoundPool でサウンド再生できるようになったけど…。
 load 時にオーバーフローを起こしてるみたいだ。
 ログにエラーがズラズラ吐き出されている。
 そう大きなデータではないし、再生にも影響ないようなんだけど、気になる…。
 VirtualBox か、Android-x86 特有の現象なのかな…?

Posted in Sound. Tags: , . SoundPool でサウンド再生 ~リソース版 はコメントを受け付けていません »

MediaPlayer でサウンド再生 ~リソース版

 BGMとVoiceを想定して、MediaPlayer でサウンド・ファイルを再生してみたよ。
 作ってみたのは、下記ソース。

public class mySound extends Activity {

	private MediaPlayer mp;
	private MediaPlayer mp1;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// トラック 0
		mp = MediaPlayer.create(this, R.raw.bgm);
		mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
		mp.setLooping(true);
		mp.start();
		//--

		// トラック 1
		mp1 = MediaPlayer.create(this, R.raw.voice);
		mp1.setAudioStreamType(AudioManager.STREAM_MUSIC); 
		mp1.start();
		//--

	}

	@Override
	public void onDestroy(){

		if(mp.isPlaying()){
			mp.stop();
		}

		if(mp1.isPlaying()){
			mp1.stop();
		}

		super.onDestroy();
		// アクティビティの終了
		finish();
	}

}
  • 再生トラックを2つ設け、片方をループ再生、もう片方をループなしの再生をしている。
  • 再生するファイルは、リソース・ファイル。
     サウンド・ファイルは、res の中に raw というディレクトリを作って、その中に格納する。
  • ファイル・フォーマットは、mp3, midi, ogg。それぞれ再生されることを確認。

 13行目のsetAudioStreamType は、実行しなくても再生される。
 ただし、今回のような、複数トラック時に再生されない時があった。

onDestroy

 MediaPlayer での再生は、アプリ終了後も継続される。
 そのため、onDestroy メソッドで再生停止するようにしているよ。
 ※.onDestroy は、アプリの終了時に実行されるmethod。

 またアプリに実装する場合、onPause, onStop でも同様に、pause や stop を実行する必要がある。
 じゃないと、アプリを切り替えられた時に、サウンドが再生され続けてしまうよ。

prepare ってナニよ?

 MediaPlayer のprepare メソッドは、再生準備をするものらしい。
 けれど、「create 直後はしなくていい」らしい。
 どうも仕様の変更があったみたいで、昔はするものだったみたいだね。
 今はcreate やstop と共に行われるようになっているみたいだ。
※.参考
https://groups.google.com/group/android-group-japan/msg/fdff0b4d0af94b4b?hl=ja
http://developer.android.com/reference/android/media/MediaPlayer.html

Posted in Sound. Tags: , . MediaPlayer でサウンド再生 ~リソース版 はコメントを受け付けていません »