通过AudioTrack播放正弦波纯音:
本文参考自:
Android 播放指定频率正弦波声音----sichard
Android左右声道的控制----kqw攻城狮
生成纯音
所谓的纯音就是一个正弦波,生成的核心是靠Math.sin()方法产生的字节数组。
public static byte[] sin(byte[] wave, int waveLen, int length) {
for (int i = 0; i < length; i++) {
wave[i] = (byte) (HEIGHT * (1 - Math.sin(TWOPI * ((i % waveLen) * 1.00 / waveLen))));
}
return wave;
}
创建播放线程
在将线程的构造方法中首先把AudioTrack初始化:
public PlayThread(int rate) {
if (rate > 0) {
Hz = rate;
waveLen = RATE / Hz;
length = waveLen * Hz;
wave = new byte[RATE];
mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, RATE,
AudioFormat.CHANNEL_CONFIGURATION_STEREO, // CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_8BIT, length, AudioTrack.MODE_STREAM);
ISPLAYSOUND = true;
wave = SinWave.sin(wave, waveLen, length);
} else {
return;
}
}
这里的ISPLAYSOUND是控制纯音持续播放的关键,否则后面也会讲到。
之后在线程开始后首先让AudioTrack进入播放的状态,再向AudioTrack写入播放数据:
@Override
public void run() {
super.run();
if (null != mAudioTrack)
mAudioTrack.play();
//一直播放
while (ISPLAYSOUND) {
mAudioTrack.write(wave, 0, length);
}
}
利用上面的ISPLAYSOUND
的参数,将播放循环下去,想要停止播放就将ISPLAYSOUND
设为false
。
END
写的比较简单,具体可以参考源码:
https://github.com/xiaoniu/PureTone