I wish to improve quality of beeps, which generated by class AudioTrack. I tried to use stereo format, but it don't help. How can I improve quality of sounds, which generated by AudioTrack?
Below you can see code, which shows, how I generated sound in high quality, but beep unfortunately plays in in a very bad quality.
class beeper {
private static byte generatedSnd[];
public static AudioTrack audioTrack;
public static void createAudioTrack() {
if (audioTrack == null) {
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
48000,
AudioFormat.CHANNEL_OUT_STEREO,
AudioFormat.ENCODING_PCM_16BIT,
generatedSnd.length,
AudioTrack.MODE_STREAM);
if (Build.VERSION.SDK_INT < 21)
audioTrack.setStereoVolume(AudioTrack.getMaxVolume(),
AudioTrack.getMaxVolume());
else
audioTrack.setVolume(AudioTrack.getMaxVolume());
audioTrack.setPlaybackPositionUpdateListener(
new OnPlaybackPositionUpdateListener() {
@Override
public void onMarkerReached(AudioTrack track) {
}
@Override
public void onPeriodicNotification(AudioTrack track) {
}
});
}
}
static void sound(double frequency, double durationMs) {
generatedSnd = new byte[(int) (2 * 48000 * durationMs / 1000)];
double sample[] = new double[(int) (48000 * durationMs / 1000)];
for (int i = 0; i < sample.length; ++i) {
sample[i] = Math.sin(2 * Math.PI * i / (48000 / frequency));
}
int idx = 0;
for (final double dVal : sample) {
final short val = (short) ((dVal * 32767));
generatedSnd[idx++] = (byte) (val & 0x00ff);
generatedSnd[idx++] = (byte) (val & 0xff00 >>> 8);
}
createAudioTrack();
audioTrack.play();
audioTrack.write(generatedSnd, 0, generatedSnd.length);
}
public static void audioTrackdestroy() {
if (audioTrack != null) {
audioTrack.stop();
audioTrack.flush();
audioTrack.release();
audioTrack = null;
}
}
}