通過AudioTrack播放正弦波純音

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章