Android/AudioTrackでPCMを鳴らす

Last-modified: 2014-08-16 (土) 12:41:50 (1344d)

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

}