#android #audio #sigabrt #audiotrack
#Android #Аудио #sigabrt #audiotrack
Вопрос:
Я пытаюсь создать синусоидальный звук с частотой 20 Гц-20 кГц. Я могу создавать синусоидальную волну только до 12 кГц. После этого приложение завершает работу со следующей ошибкой
A / libc: фатальный сигнал 6 (SIGABRT), код -6 (SI_TKILL) в tid 30692 (AudioTrack), pid 30615 (генератор синусоидальной волны)
Прикрепляю код, который я использовал.
MainActivity
Thread waveGeneratorThread = new Thread(new Runnable() {
@Override
public void run() {
if (frequency >= 20 amp;amp; frequency <= 20000) {
wave.setWave((int) frequency);
boolean on = tb1.isChecked();
if (on) {
wave.start();
} else {
wave.stop();
}
}
}
});
Класс Java PlayWave
private final int sampleRate = 192000;
private AudioTrack audioTrack;
int buffersize = AudioTrack.getMinBufferSize(sampleRate,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
private int sampleCount;
public PlayWave() {
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
sampleRate,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffersize,
AudioTrack.MODE_STATIC);
}
public void setWave(int frequency) {
sampleCount = (int) ((float) sampleRate / frequency);
short samples[] = new short[sampleCount];
int amplitude = 32767;
double twopi = Math.PI * 2;
double phase = 0;
for (int i = 0; i < sampleCount; i ) {
samples[i] = (short) (amplitude * Math.sin(phase));
phase = twopi * frequency / sampleRate;
}
audioTrack.write(samples, 0, sampleCount);
}
public void start() {
audioTrack.reloadStaticData();
audioTrack.setLoopPoints(0, sampleCount, -1);
audioTrack.play();
}
public void stop() {
audioTrack.stop();
}
Комментарии:
1. Какова частота дискретизации?
2. Сначала попробовал с 44100 Гц. Но приложение выходит из строя после создания 8 кГц .. Затем попробовал с частотой 192000Hz, затем wave, пока не было создано 12 кГц.