혼란

2014-12-18 2 views
0

나는 다음과 같은 기능이 있습니다혼란

void playSound(){ 
    final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 
      sampleRate, AudioFormat.CHANNEL_OUT_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length, 
      AudioTrack.MODE_STATIC); 
    audioTrack.write(generatedSnd, 0, generatedSnd.length); 
    audioTrack.play(); 
} 

버튼을 클릭 :

public void btnTx_click(View view){ 
    textView.setText("CLICKED1"); 

    int rem; 

    while(dataToSend != 0){ 
     rem = dataToSend % 2; 
     if(rem==0) 
      genTone(0.0); 
     else 
      genTone(1.0); 
     dataToSend /= 2; 
     counter++; 
    } 

    // Use a new tread as this can take a while 
    final Thread thread = new Thread(new Runnable() { 
     public void run() { 
      // genTone();  // this line is left here for my recor donly 
      handler.post(new Runnable() { 

       public void run() { 
        playSound(); 
       } 
      }); 
     } 
    }); 
    thread.start(); 
} 

btnTx_click() 함수의 while 루프가 playSound()에 사용되는 generatedSnd 배열을 준비를 기능. 버튼을 누르면이 프로그램은 오디오 샘플을 generatedSnd 배열로로드 한 다음 AudioTrack을 사용하여 오디오를 재생합니다. 로드 및 재생은 스레드에서 수행됩니다.

이 스레드가 언제 종료되는지 어떻게 알 수 있습니까? AudioTrack 재생이 끝난 후 종료됩니까? 또는 public void run() 종료 후 즉시 종료 되나요? 스레드가 끝나는 시점을 정확하게 확인할 수 있습니까? 그렇다면 MainActivity.java에서 이러한 검사가 포함되어야하는 위치는 무엇입니까?

AudioTrack이 generatedSnd의 재생을 완료하면 generatedSnd에 새로운 값 집합을로드하고이 새로운 음색을 재생하기를 원합니다. 실제로 톤 1, 톤 2, 톤 3, .... 등을 연주하고 싶습니다.

답변

2

audioTrack.play()에 대한 호출이 차단되지 않습니다. 재생이 끝나기 전에 재생이 시작되고 Thread의 run() 메서드가 반환됩니다. 오디오의 실제 재생은 호출 된 것이 아니라 내부에서 생성 된 또 다른 스레드에서 발생합니다.

문제를 해결할 수있는 AudioTrack.setNotificationMarkerPosition()으로 설정된 지점에 도달하면 AudioTrack.setPlaybackPositionUpdateListener()에 콜백을 수신 할 수 있습니다.

+0

내부적으로 생성 된 다른 스레드는 무엇을 의미합니까? AudioTrack을 재생하는 btnTx_click()에서'thread'가 선언되지 않았습니까? – user13267

+0

네이티브 레이어의 다른 스레드에서 재생이 진행 중입니다. UI를 차단하지 않고 재생이 이루어지는 UI 스레드에서 play()를 호출 해보십시오. –

+0

그래서이 새 스레드를 만들 필요가 없습니다. – user13267