我是安卓系统的新手。
有人能帮助我使用非弃用代码来生成F频率和S秒持续时间的音调吗
我找到了这个,但它使用了不推荐使用的方法。
以下是链接代码的呈现,适用于API 23+级,并添加了音调持续时间的参数:
short generatedSnd[];
int sampleRate = 44100;
float freqOfTone = 1000; //Hz
float amplitude = 10000; //0..32767 (0x7FFF)
float lengthSeconds = 1.0f;
private void genTone(){
int numSamples = (int) (sampleRate * lengthSeconds);
generatedSnd = new short[numSamples];
// fill out the array
for (int i = 0; i < numSamples; ++i) {
generatedSnd[i] = (short) (Math.sin(2 * Math.PI * i / (sampleRate/freqOfTone)) * amplitude);
}
}
private void playSound(){
AudioTrack audioTrack = new AudioTrack.Builder()
.setAudioFormat(
new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(sampleRate)
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
.build()
)
.setTransferMode(AudioTrack.MODE_STATIC)
.setBufferSizeInBytes(generatedSnd.length * 2) //2 bytes-per-sample
.build();
audioTrack.write(generatedSnd, 0, generatedSnd.length);
audioTrack.play();
}
该代码已在模拟器中测试了50秒,但由于传递给setBufferSize()
的大小,它可能会在较高的播放时间崩溃。请注意,它不包括其他高级功能来帮助您处理任意长的播放时间,例如1.(流式播放,或2.(由于float
量化误差在远离0的值处导致的相位校正。
然而,它应该可以在小于10秒的时间内正常工作。
AudioTrack清除代码(stop()
/release()
(也被省略。