Android/AudioTrackでPCMを鳴らす の変更点


AudioTrackを作って、play()し、write()でバイト配列を書き込む。

write()した分、再生される。何度も繰り返しwrite()してOK。

おわったら、close()。

ENCODING_PCM_8BIT の場合、1つのサンプルデータが1バイトで、無音が128になる。と思う。

16BITの場合は、符号つきshort? -32768 〜 +32767 だと思う。
リトルエンディアンかな?後からチェックしよう。

ここが参考になるかも

WAV ファイルフォーマット~
http://www.kk.iij4u.or.jp/~kondo/wave/

 package com.example.TestPcmOutput;
 
 import android.media.AudioFormat;
 import android.media.AudioManager;
 import android.media.AudioTrack;
 import android.util.Log;
 
 public class TestPcm {
 	private static String LOG_TAG = TestPcm.class.toString();
 	
 	
 	private static final int SAMPLING_RATE = 8000;
 	private static final int LENGTH = 3;
 	public static void play(){
 		
 		Log.v(LOG_TAG,"Creating songdata.");
 		byte[] part = {
 			(byte)128,(byte)191,(byte)255,(byte)191,
 			(byte)128,(byte)64,(byte)0,(byte)64
 		};
 		
 		byte[] song = new byte[SAMPLING_RATE*LENGTH];
 		
 		for(int i=0;i<song.length;i++){
 			int p = i%part.length;
 			song[i] = part[p];
 		}
 		
 		int bufferSizeInBytes = android.media.AudioTrack.getMinBufferSize(
 			SAMPLING_RATE, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_8BIT);
 		
 		
 		AudioTrack audioTrack = new AudioTrack(
 				AudioManager.STREAM_MUSIC,
 				8000,
 				AudioFormat.CHANNEL_CONFIGURATION_MONO,
 				AudioFormat.ENCODING_PCM_8BIT,
 				bufferSizeInBytes,
 				AudioTrack.MODE_STREAM);
 		
 		Log.v(LOG_TAG,"Play()");
 		audioTrack.play();
 		
 		Log.v(LOG_TAG,"Writing..");
 		audioTrack.write(song, 0, song.length);
 		
 		Log.v(LOG_TAG,"Stop()");
 		audioTrack.stop();
 	}
 
 }