diff options
-rw-r--r-- | android/src/org/rockbox/RockboxPCM.java | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/android/src/org/rockbox/RockboxPCM.java b/android/src/org/rockbox/RockboxPCM.java index 631d925b12..eef56f501d 100644 --- a/android/src/org/rockbox/RockboxPCM.java +++ b/android/src/org/rockbox/RockboxPCM.java | |||
@@ -24,6 +24,9 @@ package org.rockbox; | |||
24 | import android.media.AudioFormat; | 24 | import android.media.AudioFormat; |
25 | import android.media.AudioManager; | 25 | import android.media.AudioManager; |
26 | import android.media.AudioTrack; | 26 | import android.media.AudioTrack; |
27 | import android.os.Handler; | ||
28 | import android.os.HandlerThread; | ||
29 | import android.os.Process; | ||
27 | import android.util.Log; | 30 | import android.util.Log; |
28 | 31 | ||
29 | public class RockboxPCM extends AudioTrack | 32 | public class RockboxPCM extends AudioTrack |
@@ -31,6 +34,8 @@ public class RockboxPCM extends AudioTrack | |||
31 | byte[] raw_data; | 34 | byte[] raw_data; |
32 | private int buf_len; | 35 | private int buf_len; |
33 | private PCMListener l; | 36 | private PCMListener l; |
37 | private HandlerThread ht; | ||
38 | private Handler h = null; | ||
34 | 39 | ||
35 | private void LOG(CharSequence text) | 40 | private void LOG(CharSequence text) |
36 | { | 41 | { |
@@ -46,6 +51,8 @@ public class RockboxPCM extends AudioTrack | |||
46 | AudioFormat.ENCODING_PCM_16BIT, | 51 | AudioFormat.ENCODING_PCM_16BIT, |
47 | 24<<10, | 52 | 24<<10, |
48 | AudioTrack.MODE_STREAM); | 53 | AudioTrack.MODE_STREAM); |
54 | ht = new HandlerThread("audio thread", Process.THREAD_PRIORITY_URGENT_AUDIO); | ||
55 | ht.start(); | ||
49 | buf_len = 24<<10; /* in bytes */ | 56 | buf_len = 24<<10; /* in bytes */ |
50 | 57 | ||
51 | raw_data = new byte[buf_len]; /* in shorts */ | 58 | raw_data = new byte[buf_len]; /* in shorts */ |
@@ -76,10 +83,12 @@ public class RockboxPCM extends AudioTrack | |||
76 | RockboxService.startForeground(); | 83 | RockboxService.startForeground(); |
77 | if (getState() == AudioTrack.STATE_INITIALIZED) | 84 | if (getState() == AudioTrack.STATE_INITIALIZED) |
78 | { | 85 | { |
86 | if (h == null) | ||
87 | h = new Handler(ht.getLooper()); | ||
79 | if (setNotificationMarkerPosition(bytes2frames(buf_len)/4) != AudioTrack.SUCCESS) | 88 | if (setNotificationMarkerPosition(bytes2frames(buf_len)/4) != AudioTrack.SUCCESS) |
80 | LOG("setNotificationMarkerPosition Error"); | 89 | LOG("setNotificationMarkerPosition Error"); |
81 | else | 90 | else |
82 | setPlaybackPositionUpdateListener(l); | 91 | setPlaybackPositionUpdateListener(l, h); |
83 | } | 92 | } |
84 | /* need to fill with silence before starting playback */ | 93 | /* need to fill with silence before starting playback */ |
85 | write(raw_data, frames2bytes(getPlaybackHeadPosition()), raw_data.length); | 94 | write(raw_data, frames2bytes(getPlaybackHeadPosition()), raw_data.length); |
@@ -140,10 +149,11 @@ public class RockboxPCM extends AudioTrack | |||
140 | { | 149 | { |
141 | case AudioTrack.PLAYSTATE_PLAYING: | 150 | case AudioTrack.PLAYSTATE_PLAYING: |
142 | case AudioTrack.PLAYSTATE_PAUSED: | 151 | case AudioTrack.PLAYSTATE_PAUSED: |
143 | /* recharge */ | ||
144 | setPlaybackPositionUpdateListener(this); | ||
145 | /* refill at 25% no matter of how many bytes we've written */ | 152 | /* refill at 25% no matter of how many bytes we've written */ |
146 | setNotificationMarkerPosition(bytes2frames(refill_mark)); | 153 | if (setNotificationMarkerPosition(bytes2frames(refill_mark)) != AudioTrack.SUCCESS) |
154 | LOG("Error in onMarkerReached: Could not set notification marker"); | ||
155 | else /* recharge */ | ||
156 | setPlaybackPositionUpdateListener(this, h); | ||
147 | break; | 157 | break; |
148 | case AudioTrack.PLAYSTATE_STOPPED: | 158 | case AudioTrack.PLAYSTATE_STOPPED: |
149 | LOG("State STOPPED"); | 159 | LOG("State STOPPED"); |