2015-05-19 3 views
-1

Я написал этот код для создания звука, но я не могу остановить звук. Когда я нажимаю кнопку запуска, он генерирует звук, но ничего не происходит, когда я нажимаю кнопку конца. Может кто-нибудь сказать мне, что не так?Android generate sound

private final int duration = 5; // seconds 
private final int sampleRate = 8000; 
private final int numSamples = duration * sampleRate; 
private final double sample[] = new double[numSamples]; 
private final double freqOfTone = 250; // hz 
private final byte generatedSnd[] = new byte[2 * numSamples]; 
Handler handler = new Handler(); 
private AudioTrack audioTrack; 
private boolean play = false; 
Button btnstart; 
Button btnstop; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    btnstart= (Button)findViewById(R.id.StartSound); 
    btnstop= (Button)findViewById(R.id.EndSound); 
    btnstart.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 


      audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
        8000, AudioFormat.CHANNEL_OUT_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, numSamples, 
        AudioTrack.MODE_STREAM); 
      play=true; 
      audioTrack.play(); 
      // playSound(); 
      genTone(); 

     } 
    }); 
btnstop.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
    stopPlaying(); 
    audioTrack= new AudioTrack(AudioTrack.MODE_STREAM,8000,AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT,numSamples,AudioTrack.MODE_STREAM); 
    audioTrack.play(); 


    } 
}); 
    } 



void genTone(){ 
    // fill out the array 
    while(play){ 
     for (int i = 0; i < numSamples; ++i) { 
      // float angular_frequency = 
      sample[i] = Math.sin(2 * Math.PI * i/(sampleRate/freqOfTone)); 
     } 
     int idx = 0; 

     // convert to 16 bit pcm sound array 
     // assumes the sample buffer is normalised. 
     for (double dVal : sample) { 
      short val = (short) (dVal * 32767); 
      generatedSnd[idx++] = (byte) (val & 0x00ff); 
      generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8); 
     } 
     audioTrack.write(generatedSnd, 0, numSamples); 
    } 
} 

    void stopPlaying() { 
    if (audioTrack !=null){ 
     audioTrack.stop(); 
     audioTrack.release(); 
     audioTrack=null;   
} 
    } 

ответ

0

Ваш метод genTone() блокирует поток пользовательского интерфейса в ее while(play) цикле. Никакие события пользовательского интерфейса, такие как нажатия кнопок, не могут быть обработаны, когда поток пользовательского интерфейса занят чем-то другим.

Приложения с заблокированным потоком пользовательского интерфейса убиты как «приложение не отвечает» через некоторое время.

Рассмотрите возможность использования фоновой нити для продолжительного цикла генерации тона.

+0

Итак, как я могу исправить эту проблему? Спасибо за ваш ответ! – sucdemeer