Android/AudioTrackでPCMを鳴らす
Last-modified: 2014-08-16 (土) 12:41:50 (1652d)
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(); } }