2014-09-29 41 views
0

我發現下面的代碼會產生「噪音」。我希望能夠產生一種音調。據我瞭解,有一些涉及SIN的公式可以產生聲調。使用AudioTrack生成頻率

該行生成噪聲:rnd.nextBytes(noiseData);

我試圖給所有數組元素手動賦值,但是沒有聲音。我發現了一個可以產生音調的代碼,但它不會流式傳輸它。當我試圖將數據傳遞給我的代碼時,會產生幾秒鐘的語氣,然後應用程序崩潰。

任何建議如何從中產生一個音調?由於

public class Internal extends Activity 
{ 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);    
} 

public void onPlayClicked(View v) 
{ 
    start();  
} 

public void onStopClicked(View v) 
{ 
    stop(); 
} 

boolean m_stop = false; 
AudioTrack m_audioTrack; 
Thread m_noiseThread; 

Runnable m_noiseGenerator = new Runnable() 
{  
    public void run() 
    { 
     Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 

     /* 8000 bytes per second, 1000 bytes = 125 ms */ 
     byte [] noiseData = new byte[1000]; 
     Random rnd = new Random(); 

     while(!m_stop) 
     {   
      rnd.nextBytes(noiseData); 
      m_audioTrack.write(noiseData, 0, noiseData.length);     
     } 
    } 
}; 

void start() 
{ 
    m_stop = false; 

    /* 8000 bytes per second*/ 
    m_audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_MONO, 
            AudioFormat.ENCODING_PCM_8BIT, 8000 /* 1 second buffer */, 
            AudioTrack.MODE_STREAM);    

    m_audioTrack.play();   


    m_noiseThread = new Thread(m_noiseGenerator); 
    m_noiseThread.start(); 
} 

void stop() 
{ 
    m_stop = true;   
    m_audioTrack.stop(); 
} 

}

這是產生一個音的代碼,但是當我養活其輸出到我寫緩衝區,它扮演了一秒鐘,然後應用程序崩潰..即使我改「 AudioFormat.ENCODING_PCM_8BIT」到‘AudioFormat.ENCODING_PCM_16BIT’

private final int duration = 1; // seconds 
private final int sampleRate = 8000; 
private final int numSamples = duration * sampleRate; 
private final double sample[] = new double[numSamples]; 
private final double freqOfTone = 440; // hz 

private final byte generatedSnd[] = new byte[2 * numSamples]; 
    void genTone(){ 
    // fill out the array 
    for (int i = 0; i < numSamples; ++i) { 
     sample[i] = Math.sin(2 * Math.PI * i/(sampleRate/freqOfTone)); 
    } 

    // convert to 16 bit pcm sound array 
    // assumes the sample buffer is normalised. 
    int idx = 0; 
    for (final double dVal : sample) { 
     // scale to maximum amplitude 
     final short val = (short) ((dVal * 32767)); 
     // in 16 bit wav PCM, first byte is the low order byte 
     generatedSnd[idx++] = (byte) (val & 0x00ff); 
     generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8); 

    } 
} 

回答