Я использую образец приложения, который использует X и Y касания, равный X по частоте и Y по амплитуде. Затем вычисляем простую греховную волну и пропускаем этот поток. Когда я генерирую звуковой сигнал - между записью новых данных репродуктор издает треск.
Я никогда раньше не работал со звуком, но могу предположить, что трещины - это скачок значения в синусоиде, но почему его трещина в конце трека, когда его гарантия будет равной нулю? вот почему мне нужна помощь. В начале и конце звуковой дорожки слышен треск.
audioTrack создается в методе onCreate. Метод start () запустит audioTrack.
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
sampleRate,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, numSamples,
AudioTrack.MODE_STREAM);
start();
Это моя тема:
Runnable m_noiseGenerator = new Runnable() {
public void run()
{
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
while(!m_stop)
{
//rnd.nextBytes(noiseData);
try {
if(playing) {
//audioTrack.flush();
long startTime = System.currentTimeMillis();
audioTrack.write(generatedSnd, 0, generatedSnd.length);
if (audioTrack.getPlayState() == audioTrack.PLAYSTATE_STOPPED)
audioTrack.play();
long finish = System.currentTimeMillis() - startTime;
System.out.print("\naudioTrackThread: WRITTEN IN " + finish + "ms\n");
genToneUpdate = false;
}
} catch (Exception ex) {
System.out.print("THREAD ERROR " + ex);
}
try {
//Thread.sleep(50);
//Thread.sleep(1000);
} catch (Exception ex) {
System.out.print("THREAD ERROR sleep " + ex);
}
}
}
};
Вот как я вычисляю и редактирую данные
for (int i = 0; i < numSamples; i++) {
samples[i] = ((double) amp / 100) * Math.sin(2 * Math.PI * i * (freq/sampleRate));
}
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);
genToneUpdate = true;
}
Целое приложение доступно здесь:
приложение SoundGenerator