SoundPool でサウンド再生 ~ローカル版

 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);


		String path = Environment.getExternalStorageDirectory().getPath()+"/"
					 +"voice.ogg";

		//リソースファイルからSE
		sp = new SoundPool( 5, AudioManager.STREAM_MUSIC, 0 );
		seID[ch] = sp.load( path, 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();
	}
}

 load method の指定を、ローカルのPath指定にするだけ。
 ファイルがなかったでload できなくても、アプリが異常終了することはない…みたい。
 ログにワーニングが出るけど。(^_^;

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

MediaPlayer でサウンド再生 ~ローカル版

 MediaPlayer で、ローカルのサウンド・ファイルを再生してみたよ。
 やってることは、ほとんどリソース版とかわらないけどね。

public class mySound extends Activity {

	private MediaPlayer mp;

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


		String path = Environment.getExternalStorageDirectory().getPath()+"/"
					 +"bgm0.mp3";

		// トラック 0
		mp = new MediaPlayer();
		try{
			mp.setDataSource( path );
			mp.prepare();
			
			mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
			mp.setLooping(true);
			mp.start();
			
		}catch( Exception e ){
			Log.d("Err", "err mpPlay : " +path );
		}
		//--
	}

	@Override
	public void onDestroy(){

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

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

}

 MediaPlayer.create の代わりに、setDataSource をするみたいな感じ。
 ただし、多少手間がかかる。
 MediaPlayer オブジェクトを生成して、prepare() も実行してやらなきゃならない。

 それと、setDataSource を、try ~ catch で囲ってやらなきゃならない。
 囲わない場合、ビルド時にエラーが出るよ。
 たぶん、指定したファイルをオープンできなかった場合を想定してるんだろうね。
 なので、上記ソースでは再生までの手順を、try の中に含めている。
 で、オープンできなかったり、なんらかのエラーが起こった場合は、logにパスを書き出すようにしているよ。

 ちなみに上記ソースでは、SDカード上の”bgm0.mp3″を再生しているよ。

setDataSource のオーバーロード

 setDataSource には以下のような種類があるよ。

	setDataSource( String path )
	setDataSource( FileDescriptor fd, long offset, long length )
	setDataSource( FileDescriptor fd )
	setDataSource( Context context, Uri uri )

 今回は一番上のタイプを使ってみた。
 path には、http や rtsp 等のURL指定が可能らしい。
 で、試しに”http://…” へ変えてみたけど、ネット上のファイルを再生できなかった。
 たぶん、ローカルのファイルに対して”http://”が使える、ということなんだろうね。
 おそらくネット上のモノを再生するには、一番下のContext を指定するsetDataSource を使うんじゃないかな?
 そのうち、試してみよう。

 FileDescriptor は、ファイルを抽象化したclass…ってトコかね。
 ファイル操作や、ユーザーにファイル選択させたりする時に使うclass だね。
 それらの状況の時に使い勝手がよさそうだ。

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

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 でサウンド再生 ~リソース版 はコメントを受け付けていません »

Andorid で音を再生するには…

 Android でサウンドを再生するには、色々なやり方があるみたいだよ。
 調べた方法は、以下の4つ。

	AudioTrack クラス
	MediaPlayer クラス
	JetPlayer クラス
	SoundPool クラス


 特徴なんかをちょっと整理しておこう。

AudioTrack クラス

 データ配列をハードウェアに送り、直にPCMを鳴らすっぽい。
 プログラム的に音を作り出すような用途で、お手軽にはいきそうもないね。

MediaPlayer クラス

 一般的なサウンド・フォーマットを再生できる。
 ざっと見たところ、mp3, ogg, MIDI, wav…と、メジャーなフォーマットに対応してるみたい。
 ローカルのファイル再生だけでなく、ネットストリーミングにも対応してる。
 ループ再生も可能。

 同時に使用できるトラックは、4つまでみたい。
 なので、シューティング・ゲームのような、SEをバカスカ使うようにはできてない。
 ゲームならBGM向けって感じ。

JetPlayer クラス

 Jetフォーマットのサウンドを扱えるものらしい。
 ゲーム用途に…ということらしいけど、深くは調べていない。
 ざっと見たところ、MIDIみたいな感じだろうかね。
 複数のサウンド・データをひとまとめにして、複数トラックを扱える…のかな?
 一般的なフォーマットじゃないので、製作中のスクリプト・エンジンには向かない。

SoundPool クラス

 MediaPlayer と同じく、一般的なサウンド・フォーマットを再生できる。
 同時に使用できるトラックは、256までみたい。
 ループ再生も可能。

 MediaPlayer とちがって、読み込み時にPCMデータへデコードする。
 そのため、再生キューの反応がいい。
 SE向きだね。

 ただし、デコード完了を調べることができないらしい。
 未完了の時に再生キューをだしても、再生されない。
 OS 2.2以降なら調べられるみたいだけど、それ以前はできないみたいだ。

 それと、デコードしたデータは、ネイティブ・ヒープに溜められてしまう。
 データが大きくなると、Android全体を重くしてしまうんだ。
 だから、BGMなどの長いデータには向かない。
 要注意だね。

ゲーム用途なら…

 ゲーム用途なら、以下のような使い分けかな。

	MediaPlayer … BGM
	SoundPool   … SE

 アドベンチャー・ゲームなんかのVoice、いわゆる台詞音声はちと考えもの。
 即応性からするとSEがいいんだけど…それだとヒープを圧迫することになる。
 MediaPlayer で再生するのがいいだろうね。
 ただ、ちょっとやってみたところ、複数トラックにするとノイズが出るんだよね…。
 エミュレータのせいだと思うけど。

注意点

 端末がXperia だと、SoundPool で色々と問題が発生するらしい。
 原因はサウンド・ファイルのフォーマットにあるらしく、oggだと問題はないみたい。
 特にこだわりがなければ、oggを標準フォーマットにするのがベストだね。

Posted in Sound. Tags: , , , , , , . Andorid で音を再生するには… はコメントを受け付けていません »