通過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