2014-09-29 3 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); 

    } 
} 

ответ