Я собрал код ниже для генерации и воспроизведения синусоидальных звуков на устройствах Android.
numSamples определяет длину звука на основе частоты дискретизации (44,1 кГц). Так, если я, например, установлю numSamples = 22500, звук будет воспроизводиться в течение 500 мс.
Хотя код работает нормально при длительной продолжительности звука (т. Е. Более 150 мс), я не могу слышать звук, если я установил numSamples для достижения более короткой продолжительности воспроизведения. Например, если я установил для numSamples значение 3000, я ничего не услышу.
Как мне настроить свой код, чтобы я мог воспроизводить синусоидальные звуки на моем устройстве Android с очень короткой продолжительностью, например, 1 мс, 10 мс, 50 мс, 100 мс?
Пожалуйста, сообщите.
void playSound(double freqOfTone, int numSamples) {
final int sampleRate = 44100;
final double sample[] = new double[numSamples];
final byte generatedSnd[] = new byte[2 * numSamples];
for (int i = 0; i < numSamples; ++i) {
sample[i] = Math.sin(2 * Math.PI * i / (sampleRate / freqOfTone));
}
// convert to 16 bit pcm sound array
// assumes the sample buffer is normalised.
int idx = 0;
for (double dVal : sample) {
short val = (short) (dVal * 32767);
generatedSnd[idx++] = (byte) (val & 0x00ff);
generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
}
AudioTrack audioTrack = new AudioTrack(
AudioManager.STREAM_MUSIC,
sampleRate,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
numSamples,
AudioTrack.MODE_STREAM);
audioTrack.write(generatedSnd, 0, numSamples);
audioTrack.play();
}