通过AudioTrack播放正弦波纯音

通过AudioTrack播放正弦波纯音:

通过AudioTrack播放正弦波纯音_第1张图片

本文参考自:
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

你可能感兴趣的:(通过AudioTrack播放正弦波纯音)