Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Android: implement headphone detection thus enabling pause on unplug (FS#12097).

Listen to headphone plug events. There are currently two glitches with this:
- Android takes a while until it reports the unplug event, so there will be
some delay until playback gets paused. This is an Android limitation.
- Rockbox debounces headphone state changes for one second. Therefore playback
will shortly be routed to the speaker on unplug until Rockbox does the actual
pause.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29956 a1c6a512-1295-4272-9138-f99709370657

+51
+21
android/src/org/rockbox/RockboxService.java
··· 64 64 private static volatile boolean rockbox_running; 65 65 private Activity current_activity = null; 66 66 private IntentFilter itf; 67 + private IntentFilter ifh; 67 68 private BroadcastReceiver batt_monitor; 69 + private BroadcastReceiver headphone_monitor; 68 70 private RunForegroundManager fg_runner; 69 71 private MediaButtonReceiver mMediaButtonReceiver; 70 72 private int battery_level; 73 + private int headphone_state; 71 74 private ResultReceiver resultReceiver; 72 75 73 76 public static final int RESULT_INVOKING_MAIN = 0; ··· 338 341 }; 339 342 registerReceiver(batt_monitor, itf); 340 343 } 344 + 345 + 346 + private void initHeadphoneMonitor() 347 + { 348 + ifh = new IntentFilter(Intent.ACTION_HEADSET_PLUG); 349 + headphone_monitor = new BroadcastReceiver() 350 + { 351 + @Override 352 + public void onReceive(Context context, Intent intent) 353 + { 354 + int state = intent.getIntExtra("state", -1); 355 + LOG("headphone state:" + state); 356 + headphone_state = state; 357 + } 358 + }; 359 + registerReceiver(headphone_monitor, ifh); 360 + } 361 + 341 362 342 363 void startForeground() 343 364 {
+2
firmware/export/config/android.h
··· 84 84 85 85 #define HAVE_SW_TONE_CONTROLS 86 86 87 + #define HAVE_HEADPHONE_DETECTION 88 + 87 89 /* Define current usage levels. */ 88 90 #define CURRENT_NORMAL 88 /* 18 hours from a 1600 mAh battery */ 89 91 #define CURRENT_BACKLIGHT 30 /* TBD */
+28
firmware/target/hosted/android/button-android.c
··· 31 31 #include "powermgmt.h" 32 32 33 33 extern JNIEnv *env_ptr; 34 + extern jclass RockboxService_class; 35 + extern jobject RockboxService_instance; 36 + 37 + static jfieldID _headphone_state; 34 38 static int last_y, last_x; 35 39 static int last_btns; 36 40 ··· 110 114 111 115 void button_init_device(void) 112 116 { 117 + jmethodID initHeadphoneMonitor = (*env_ptr)->GetMethodID(env_ptr, 118 + RockboxService_class, 119 + "initHeadphoneMonitor", 120 + "()V"); 121 + /* start the monitor */ 122 + (*env_ptr)->CallVoidMethod(env_ptr, 123 + RockboxService_instance, 124 + initHeadphoneMonitor); 125 + 126 + /* cache the headphone state field id */ 127 + _headphone_state = (*env_ptr)->GetFieldID(env_ptr, 128 + RockboxService_class, 129 + "headphone_state", 130 + "I"); 113 131 } 114 132 115 133 int button_read_device(int *data) ··· 127 145 128 146 return btn; 129 147 } 148 + 149 + 150 + /* Tell if anything is in the jack. */ 151 + bool headphones_inserted(void) 152 + { 153 + int state = (*env_ptr)->GetIntField(env_ptr, RockboxService_instance, _headphone_state); 154 + /* 0 is disconnected, 1 and 2 are connected */ 155 + return (state == 0) ? false : true; 156 + } 157 +