Я пытаюсь создать генератор сигналов, частотой которого можно управлять по данным датчика гироскопа (перемещая телефон).Проблема в том, что я звоню AudioTrack
внутри onSensorChanged
, и у меня есть "щелчки" на выходе, потому что каждый раз, когда обновляется сенсор, я звоню
stopSinus();
setSinus(Frequency);
startSinus();
, это определяется следующим образом
siAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, SAMPLE_RATE,
AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT,
buffsize, AudioTrack.MODE_STATIC);
public void stopSinus() {
int checkPlay = siAudioTrack.getPlayState();
if (checkPlay == 3) { //
siaudioTrack.stop();
}
}
public void startSinus() {
siAudioTrack.reloadStaticData();
siAudioTrack.setLoopPoints(0, sampleCount, -1);
siAudioTrack.play();
}
public void setSinus(int frequency) {
sampleCount = (int) ((float) SAMPLE_RATE / frequency);
short sample[] = new short[sampleCount];
int amplitude = 32767;
double twoPi = 2 * Math.PI;;
double phase = 0.0;
for (int i = 0; i < sampleCount; i++) {
sample[i] = (short) (amplitude * Math.sin(phase));
phase += twoPi * frequency / SAMPLE_RATE;
}
siAudioTrack.write(sample, 0, sampleCount);
}
onSensorChanged
изменяется несколько раз в секунду, и это остановит генератор в середине волны - отсюда и идут "щелчки".
Может кто-нибудь сказать мне, как остановитьгенератор после одной целой волны?Как узнать, когда phase
os проходит ноль?Или какое-то другое решение?