Skip to content

AudioTrack underrun deadlock on Android causes infinite CPU spin and GC storm when playback finishes #2714

@xyfu66

Description

@xyfu66

Is there an existing issue for this?

  • I have searched the existing issues

Current Behavior

When alphaTab finishes playing a score on Android, the client falls into an infinite 100% CPU spin loop, allocating massive amounts of memory and triggering a severe GC storm (Sticky GC). Furthermore, the playerFinished event is never emitted.

Detailed Breakdown of the Bug:

  1. When playback finishes and the internal ring-buffer becomes empty, AndroidAudioWorker.kt reads 0 samples from the output.
  2. The worker thread then calls _track.write(_buffer, 0, samplesFromBuffer, AudioTrack.WRITE_BLOCKING) with 0 samples.
  3. On Android, AudioTrack.write with 0 samples is completely non-blocking and returns immediately.
  4. Because there is no sleep or yield when the buffer is empty, the while (!_stopped) loop in AndroidAudioWorker.kt falls into a 100% CPU spin loop.
  5. To make matters worse, inside AndroidSynthOutput.kt's read() method, a new Float32Array(sampleCount.toDouble()) (16KB) is allocated on every single call. This infinite spin loop instantly floods the JVM's Large Object Space, triggering a massive "Stop The World" GC storm.
  6. This heavy GC starvation freezes the _updateTimer thread, meaning _output.onSamplesPlayed is never called. As a result, AlphaSynth never reaches _notPlayedSamples <= 0, and the playerFinished event is never triggered.
Click to expand Android Logcat showing the GC Storm
2026-05-23 15:57:32.565 26339-26586 AudioRecord             com.example.musicstringstudio        D  [audioRecordData][fine] 15s(f:15000 m:75 s:0) : pid 26339 uid 10307 sessionId 9985 sr 48000 ch 1 fmt 5
2026-05-23 15:57:33.963 26339-26339 PitchJNI                com.example.musicstringstudio        I  nativeStopListening called.
2026-05-23 15:57:33.963 26339-26339 AAudio                  com.example.musicstringstudio        D  AAudioStream_requestStop(s#1) called
2026-05-23 15:57:33.963 26339-26339 AAudioStream            com.example.musicstringstudio        D  setState(s#1) from 4 to 9
2026-05-23 15:57:33.963 26339-26339 AudioRecord             com.example.musicstringstudio        D  stop mSessionID=9985
2026-05-23 15:57:33.963 26339-26339 AudioRecord             com.example.musicstringstudio        D  stop(3377): mActive:1
2026-05-23 15:57:34.076 26339-26339 AAudio                  com.example.musicstringstudio        D  AAudioStream_requestStop(s#1) called
2026-05-23 15:57:34.086 26339-26339 AAudio                  com.example.musicstringstudio        D  AAudioStream_close(s#1) called ---------------
2026-05-23 15:57:34.086 26339-26339 AAudioStream            com.example.musicstringstudio        D  setState(s#1) from 9 to 11
2026-05-23 15:57:34.086 26339-26339 AudioRecord             com.example.musicstringstudio        D  stop mSessionID=9985
2026-05-23 15:57:34.086 26339-26339 AudioRecord             com.example.musicstringstudio        D  stop(3377): mActive:0
2026-05-23 15:57:34.086 26339-26339 AudioRecord             com.example.musicstringstudio        D  stop mSessionID=9985
2026-05-23 15:57:34.086 26339-26339 AudioRecord             com.example.musicstringstudio        D  stop(3377): mActive:0
2026-05-23 15:57:34.088 26339-26339 AAudioStream            com.example.musicstringstudio        D  setState(s#1) from 11 to 12
2026-05-23 15:57:34.088 26339-26339 AAudioStream            com.example.musicstringstudio        D  ~AudioStream(s#1) mPlayerBase strongCount = 1
2026-05-23 15:57:34.088 26339-26339 sicstringstudio         com.example.musicstringstudio        D  PlayerBase::~PlayerBase()
2026-05-23 15:57:34.088 26339-26339 AAudio                  com.example.musicstringstudio        D  AAudioStream_close(s#1) returned 0 ---------
2026-05-23 15:57:34.088 26339-26339 AudioInputStream        com.example.musicstringstudio        I  Oboe stream closed.
2026-05-23 15:57:34.089 26339-26589 AudioInputStream        com.example.musicstringstudio        I  AlgThread exited.
2026-05-23 15:57:34.089 26339-26589 PitchJNI                com.example.musicstringstudio        I  JNI Thread detached automatically on exit.
2026-05-23 15:57:34.089 26339-26339 AudioInputStream        com.example.musicstringstudio        I  AlgThread joined.
2026-05-23 15:57:34.089 26339-26339 PitchJNI                com.example.musicstringstudio        I  AudioInputStream released.
2026-05-23 15:57:34.106 26339-26339 IS_CTS_MODE             com.example.musicstringstudio        D  false
2026-05-23 15:57:34.106 26339-26339 MULTI_WINDOW_ENABLED    com.example.musicstringstudio        D  true
2026-05-23 15:57:34.127 26339-26339 OnBackInvokedCallback   com.example.musicstringstudio        W  OnBackInvokedCallback is not enabled for the application.
                                                                                                    Set 'android:enableOnBackInvokedCallback="true"' in the application manifest.
2026-05-23 15:57:34.175 26339-26339 VRI[ScoreD...lActivity] com.example.musicstringstudio        D  vri.reportNextDraw android.view.ViewRootImpl.performTraversals:4013 android.view.ViewRootImpl.doTraversal:2725 android.view.ViewRootImpl$TraversalRunnable.run:9812 android.view.Choreographer$CallbackRecord.run:1505 android.view.Choreographer$CallbackRecord.run:1513 
2026-05-23 15:57:34.175 26339-26339 VRI[ScoreD...lActivity] com.example.musicstringstudio        D  vri.Setup new sync id=0 syncSeqId=0
2026-05-23 15:57:34.180 26339-26370 perf_hint               com.example.musicstringstudio        E  Session creation failed, mPreferredRateNanos: -1
2026-05-23 15:57:34.181 26339-26339 VRI[ScoreD...lActivity] com.example.musicstringstudio        D  vri.reportDrawFinished syncSeqId=0 android.view.ViewRootImpl.lambda$createSyncIfNeeded$4$android-view-ViewRootImpl:4081 android.view.ViewRootImpl$$ExternalSyntheticLambda2.run:6 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 android.os.Looper.loopOnce:211 
2026-05-23 15:57:34.203 26339-26339 DecorView[]             com.example.musicstringstudio        D  onWindowFocusChanged hasWindowFocus false
2026-05-23 15:57:34.236 26339-26339 DecorView[]             com.example.musicstringstudio        D  onWindowFocusChanged hasWindowFocus true
2026-05-23 15:57:34.237 26339-26339 HandWritingStubImpl     com.example.musicstringstudio        I  refreshLastKeyboardType: 1
2026-05-23 15:57:34.237 26339-26339 HandWritingStubImpl     com.example.musicstringstudio        I  getCurrentKeyboardType: 1
2026-05-23 15:57:34.242  7736-7736  BaseInputMethodService  com.sohu.inputmethod.sogou.xiaomi    E  onStartInput app:com.example.musicstringstudio restarting:false
2026-05-23 15:57:39.246 26339-26339 ScoreDetailActivity     com.example.musicstringstudio        D  [Assessment] MediaRecorder start path=/data/user/0/com.example.musicstringstudio/cache/assessment_2571400031286755251.m4a
2026-05-23 15:57:39.246 26339-26339 ScoreDetailViewModel    com.example.musicstringstudio        D  [Assessment] recording started
2026-05-23 15:57:39.248 26339-26339 ScoreDetailViewModel    com.example.musicstringstudio        D  [Assessment] anchorTick=leadingRest.endTick=1920
2026-05-23 15:57:39.248 26339-26339 ScoreDetailActivity     com.example.musicstringstudio        D  [Assessment] session start anchorTick=1920
2026-05-23 15:57:39.249 26339-26339 PitchJNI                com.example.musicstringstudio        I  nativeStopListening called.
2026-05-23 15:57:39.296 26339-26339 AlphaTabPl...Controller com.example.musicstringstudio        D  Playback force stopped
2026-05-23 15:57:39.297 26339-26339 AlphaTabPl...Controller com.example.musicstringstudio        D  Seeking to tick: 0 (current: 1)
2026-05-23 15:57:39.297 26339-26339 AlphaTabPl...Controller com.example.musicstringstudio        D  Playing from tick: 0
2026-05-23 15:57:39.304 26339-26579 AudioTrack              com.example.musicstringstudio        D  start(3375): prior state:STATE_STOPPED
2026-05-23 15:57:39.316 26339-26339 AlphaTabPl...Controller com.example.musicstringstudio        D  Player state changed: isPlaying=false
2026-05-23 15:57:39.317 26339-26339 AlphaTabPl...Controller com.example.musicstringstudio        D  Player state changed: isPlaying=true
2026-05-23 15:57:39.330 26339-26559 AidlConversion          com.example.musicstringstudio        W  aidl2legacy_AudioChannelLayout_audio_channel_mask_t: no legacy output audio_channel_mask_t found for AudioChannelLayout{layoutMask: 16}
2026-05-23 15:57:39.338 26339-26339 DecorView[]             com.example.musicstringstudio        D  onWindowFocusChanged hasWindowFocus true
2026-05-23 15:57:39.340 26339-26339 HandWritingStubImpl     com.example.musicstringstudio        I  refreshLastKeyboardType: 1
2026-05-23 15:57:39.340 26339-26339 HandWritingStubImpl     com.example.musicstringstudio        I  getCurrentKeyboardType: 1
2026-05-23 15:57:39.345  7736-7736  BaseInputMethodService  com.sohu.inputmethod.sogou.xiaomi    E  onStartInput app:com.example.musicstringstudio restarting:false
2026-05-23 15:57:40.339 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 1s(f:0 m:1007 s:0 k:1007 cm:1007 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:40.912 26339-26339 ScoreDetailActivity     com.example.musicstringstudio        D  [Assessment] anchor crossed tick=1920 offsetMs=1788
2026-05-23 15:57:41.417 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 2s(f:0 m:2086 s:0 k:2086 cm:2086 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:42.289 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:57:42.378 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 3s(f:0 m:3046 s:0 k:3046 cm:3046 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:43.337 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 4s(f:0 m:4005 s:0 k:4005 cm:4005 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:44.418 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 5s(f:0 m:5087 s:0 k:5087 cm:5087 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:45.379 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 6s(f:0 m:6048 s:0 k:6048 cm:6048 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:46.339 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 7s(f:0 m:7007 s:0 k:7007 cm:7007 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:47.418 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 8s(f:0 m:8086 s:0 k:8086 cm:8086 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:47.622 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:57:48.377 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 9s(f:0 m:9045 s:0 k:9045 cm:9045 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:49.338 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 10s(f:0 m:10006 s:0 k:10006 cm:10006 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:50.418 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 11s(f:0 m:11086 s:0 k:11086 cm:11086 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:51.378 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 12s(f:0 m:12046 s:0 k:12046 cm:12046 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:52.008 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:57:52.338 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 13s(f:0 m:13006 s:0 k:13006 cm:13006 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:53.418 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 14s(f:0 m:14086 s:0 k:14086 cm:14086 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:54.377 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 15s(f:0 m:15045 s:0 k:15045 cm:15045 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:55.338 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 16s(f:0 m:16006 s:0 k:16006 cm:16006 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:56.418 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 17s(f:0 m:17086 s:0 k:17086 cm:17086 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:56.649 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:57:56.649 26339-26352 sicstringstudio         com.example.musicstringstudio        I  Background concurrent copying GC freed 31693(1136KB) AllocSpace objects, 1184(23MB) LOS objects, 66% free, 11MB/35MB, paused 63us,35us total 110.876ms
2026-05-23 15:57:57.378 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 18s(f:0 m:18046 s:0 k:18046 cm:18046 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:58.339 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 19s(f:0 m:19007 s:0 k:19007 cm:19007 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:57:59.418 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 20s(f:0 m:20087 s:0 k:20087 cm:20087 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:58:00.378 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 21s(f:0 m:21046 s:0 k:21046 cm:21046 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:58:01.338 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 22s(f:0 m:22006 s:0 k:22006 cm:22006 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:58:02.085 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:02.419 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 23s(f:0 m:23087 s:0 k:23087 cm:23087 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:58:03.378 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 24s(f:0 m:24046 s:0 k:24046 cm:24046 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:58:04.339 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 25s(f:0 m:25007 s:0 k:25007 cm:25007 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:58:05.417 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 26s(f:0 m:26086 s:0 k:26086 cm:26086 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:58:06.378 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 27s(f:0 m:27046 s:0 k:27046 cm:27046 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:58:07.338 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 28s(f:0 m:28006 s:0 k:28006 cm:28006 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:58:07.916 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:08.419 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 29s(f:0 m:29087 s:0 k:29087 cm:29087 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:58:09.379 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 30s(f:0 m:30047 s:0 k:30047 cm:30047 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:58:10.339 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 31s(f:0 m:31007 s:0 k:31007 cm:31007 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:58:11.417 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 32s(f:0 m:32085 s:0 k:32085 cm:32085 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:58:12.377 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 33s(f:0 m:33046 s:0 k:33046 cm:33046 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:58:13.132 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:13.337 26339-26581 AudioTrack              com.example.musicstringstudio        D  [audioTrackData][mute] 34s(f:0 m:34005 s:0 k:34005 cm:34005 cs:0) : pid 26339 uid 10307 sessionId 9977 sr 44100 ch 2 fmt 5
2026-05-23 15:58:13.611 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:13.654 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:13.719 26339-26638 AudioTrack              com.example.musicstringstudio        D  getTimestamp_l(3375): device stall time corrected using current time 1908684737996710
2026-05-23 15:58:13.732 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:13.763 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:13.827 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:13.858 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:13.917 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:13.948 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.012 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.041 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.106 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.139 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.203 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.234 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.288 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.321 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.382 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.414 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.481 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.515 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.573 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.599 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.660 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.693 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.758 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.786 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.845 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.876 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.943 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:14.973 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.041 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.069 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.138 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.165 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.236 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.266 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.335 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.366 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.438 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.468 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.536 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.563 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.631 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.659 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.727 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is non sticky GC, maxfree is 8388608 minfree is 2097152
2026-05-23 15:58:15.756 26339-26352 sicstringstudio         com.example.musicstringstudio        I  This is sticky GC, maxfree is 8388608 minfree is 2097152

### Expected Behavior

When the audio buffer runs empty at the end of playback, the Android platform code should gracefully handle the lack of samples without falling into a 100% CPU spin loop or causing memory leaks. The `playerFinished` event should be successfully emitted to the application layer.

### Steps To Reproduce

1. Initialize an `AlphaTabApi` instance on an Android client using the provided Kotlin native bindings.
2. Load any score or MIDI file.
3. Start playback and let it naturally play until it reaches the very end of the score.
4. Observe the Android Logcat: A severe GC storm starts immediately (e.g., `Sticky GC`, `23MB LOS objects being freed`), and CPU usage spikes to 100% due to the spin loop in `AndroidAudioWorker.kt`.
5. Observe the application layer: The `playerFinished` event callback is never triggered.

### Link to jsFiddle, CodePen, Project

N/A - This is an Android-specific platform issue that occurs within the Kotlin native bindings (`AndroidAudioWorker.kt` and `AndroidSynthOutput.kt`). It cannot be reproduced in a web browser or jsFiddle, as Web Audio handles 0-length buffers differently than Android's AudioTrack.

### Version and Environment

```bash
Platform: Android Native (Kotlin Bindings)
alphaTab Version: 1.9.0
Device: Xiaomi M2105K81AC
Android Version: Android 13 (API 33)
Audio API: AudioTrack

Platform

Android (WebView)

Anything else?

No response

Metadata

Metadata

Assignees

Labels

area-playerRelated to the audio playback engine.platform-androidRelated to the Android specific integrationsplatform-netRelated to the .net version of alphaTabstate-acceptedThis is a valid topic to work on.

Type

No fields configured for Bug.

Projects

Status

Done

Relationships

None yet

Development

No branches or pull requests

Issue actions