Есть ли значительная задержка при инициализации AudioTrack на Android?
Я пытаюсь передать через аудио образцы, полученные на микрофоне, к динамику, используя AudioRecord и AudioTrack. Вот код:
public class MainActivity extends Activity {
AudioManager am = null;
AudioRecord record =null;
AudioTrack track =null;
final int SAMPLE_FREQUENCY = 44100;
final int SIZE_OF_RECORD_ARRAY = 1024; // 1024 ORIGINAL
final int WAV_SAMPLE_MULTIPLICATION_FACTOR = 1;
int i= 0;
boolean isPlaying = true;
class MyThread extends Thread{
private volatile boolean passThroughMode = true;
// /*
MyThread(){
super();
}
MyThread(boolean newPTV){
this.passThroughMode = newPTV;
}
// */
// /*
@Override
public void run(){
short[] lin = new short[SIZE_OF_RECORD_ARRAY];
int num = 0;
// am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); // -> MOVED THESE TO init()
// am.setMode(AudioManager.MODE_IN_COMMUNICATION);
record.startRecording();
track.play();
while (passThroughMode) {
// while (!isInterrupted()) {
num = record.read(lin, 0, SIZE_OF_RECORD_ARRAY);
for(i=0;i Moved this to onResume();
Log.d("MYLOG", "onCreate() called");
}
@Override
protected void onResume(){
super.onResume();
// newThread.stopThread();
Log.d("MYLOG", "onResume() called");
init();
newThread = new MyThread(true);
newThread.start();
}
@Override
protected void onPause(){
super.onPause();
Log.d("MYLOG", "onPause() called");
newThread.stopThread();
// android.os.Process.killProcess(android.os.Process.myPid());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void passStop(View view){
Button playBtn = (Button) findViewById(R.id.playBtn);
// /*
if(!isPlaying){
record.startRecording();
track.play();
isPlaying = true;
playBtn.setText("Pause");
}
else{
record.stop();
track.pause();
isPlaying=false;
playBtn.setText("Pass through");
}
// */
}
// /*
@Override
protected void onDestroy() {
super.onDestroy();
newThread.stopThread();
// android.os.Process.killProcess(android.os.Process.myPid());
// killProcess(android.os.Process.myPid());
// newThread.interrupt();
Log.d("MYLOG", "onDestroy() called");
}
// */
}
Предполагается, что программа запускает поток, который выполняет проход. Тема начинается в приложении "s onResume (), поэтому должен начаться немедленно. Но в начале всегда есть задержка 1,5 ~ 2 с. Я предположил, что это может быть из-за onCreate () и другой инициализации, происходящей до того, как поток запускается в onResume (), но если я распечатываю содержимоеlin
массив в файл, он всегда записывает длинную строку 0 's в начале, который указывает, что задержка, вероятно, не обусловлена временем, необходимым для инициализации. Так что же это за задержка? Требуется ли track.play () значительное время, чтобы начать играть?