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

    } 
} 

답변