I create an array and reproduce it from it:

byte[] buffer = gen_change_wave(10, 20, 50000); AudioTrack audioTrack = new AudioTrack( AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_8BIT, buffer.length, AudioTrack.MODE_STREAM); audioTrack.write(buffer, 0, buffer.length); audioTrack.play(); 

Duration 50000ms (50 seconds) If I put 40 seconds, then everything works.

The length of the buffer [] = 44100 * 50 s = 2205000;

Mistake!

 E/AudioFlinger: not enough memory for AudioTrack size=4194528 D/MemoryDealer: AudioTrack (0xf389cbd0, size=4194304) 0: 0xf389cc00 | 0x00000000 | 0x00400000 | F size allocated: 0 (0 KB) E/AudioFlinger: createTrack_l() initCheck failed -12; no control block? /a.gensnd E/AudioTrack: AudioFlinger could not create track, status: -12 /a.gensnd E/AudioTrack-JNI: Error -12 initializing AudioTrack a.gensnd E/android.media.AudioTrack: Error code -20 when initializing AudioTrack. a.gensnd D/AndroidRuntime: Shutting down VM a.gensnd E/AndroidRuntime: FATAL EXCEPTION: main Process: a.gensnd, PID: 7719 java.lang.IllegalStateException: play() called on uninitialized AudioTrack. at android.media.AudioTrack.play(AudioTrack.java:1742) at a.gensnd.Beeper.generateMiddleBeep(Beeper.java:32) at a.gensnd.aMain$1$1.run(aMain.java:43) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

Not enough memory! What can be done?

  • What kind of mistake is that? - Kirill Malyshev

0