通过AudioTrack播放正弦波纯音

来源:互联网 发布:js如何覆盖css效果 编辑:程序博客网 时间:2024/05/16 09:04

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

原创粉丝点击