mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 02:27:39 -04:00
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
This commit is contained in:
parent
304312dc2f
commit
6c22be4a3d
3 changed files with 51 additions and 0 deletions
|
@ -64,10 +64,13 @@ public class RockboxService extends Service
|
||||||
private static volatile boolean rockbox_running;
|
private static volatile boolean rockbox_running;
|
||||||
private Activity current_activity = null;
|
private Activity current_activity = null;
|
||||||
private IntentFilter itf;
|
private IntentFilter itf;
|
||||||
|
private IntentFilter ifh;
|
||||||
private BroadcastReceiver batt_monitor;
|
private BroadcastReceiver batt_monitor;
|
||||||
|
private BroadcastReceiver headphone_monitor;
|
||||||
private RunForegroundManager fg_runner;
|
private RunForegroundManager fg_runner;
|
||||||
private MediaButtonReceiver mMediaButtonReceiver;
|
private MediaButtonReceiver mMediaButtonReceiver;
|
||||||
private int battery_level;
|
private int battery_level;
|
||||||
|
private int headphone_state;
|
||||||
private ResultReceiver resultReceiver;
|
private ResultReceiver resultReceiver;
|
||||||
|
|
||||||
public static final int RESULT_INVOKING_MAIN = 0;
|
public static final int RESULT_INVOKING_MAIN = 0;
|
||||||
|
@ -339,6 +342,24 @@ public class RockboxService extends Service
|
||||||
registerReceiver(batt_monitor, itf);
|
registerReceiver(batt_monitor, itf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void initHeadphoneMonitor()
|
||||||
|
{
|
||||||
|
ifh = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
|
||||||
|
headphone_monitor = new BroadcastReceiver()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent)
|
||||||
|
{
|
||||||
|
int state = intent.getIntExtra("state", -1);
|
||||||
|
LOG("headphone state:" + state);
|
||||||
|
headphone_state = state;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
registerReceiver(headphone_monitor, ifh);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void startForeground()
|
void startForeground()
|
||||||
{
|
{
|
||||||
fg_runner.startForeground();
|
fg_runner.startForeground();
|
||||||
|
|
|
@ -84,6 +84,8 @@
|
||||||
|
|
||||||
#define HAVE_SW_TONE_CONTROLS
|
#define HAVE_SW_TONE_CONTROLS
|
||||||
|
|
||||||
|
#define HAVE_HEADPHONE_DETECTION
|
||||||
|
|
||||||
/* Define current usage levels. */
|
/* Define current usage levels. */
|
||||||
#define CURRENT_NORMAL 88 /* 18 hours from a 1600 mAh battery */
|
#define CURRENT_NORMAL 88 /* 18 hours from a 1600 mAh battery */
|
||||||
#define CURRENT_BACKLIGHT 30 /* TBD */
|
#define CURRENT_BACKLIGHT 30 /* TBD */
|
||||||
|
|
|
@ -31,6 +31,10 @@
|
||||||
#include "powermgmt.h"
|
#include "powermgmt.h"
|
||||||
|
|
||||||
extern JNIEnv *env_ptr;
|
extern JNIEnv *env_ptr;
|
||||||
|
extern jclass RockboxService_class;
|
||||||
|
extern jobject RockboxService_instance;
|
||||||
|
|
||||||
|
static jfieldID _headphone_state;
|
||||||
static int last_y, last_x;
|
static int last_y, last_x;
|
||||||
static int last_btns;
|
static int last_btns;
|
||||||
|
|
||||||
|
@ -110,6 +114,20 @@ Java_org_rockbox_RockboxFramebuffer_buttonHandler(JNIEnv*env, jclass class,
|
||||||
|
|
||||||
void button_init_device(void)
|
void button_init_device(void)
|
||||||
{
|
{
|
||||||
|
jmethodID initHeadphoneMonitor = (*env_ptr)->GetMethodID(env_ptr,
|
||||||
|
RockboxService_class,
|
||||||
|
"initHeadphoneMonitor",
|
||||||
|
"()V");
|
||||||
|
/* start the monitor */
|
||||||
|
(*env_ptr)->CallVoidMethod(env_ptr,
|
||||||
|
RockboxService_instance,
|
||||||
|
initHeadphoneMonitor);
|
||||||
|
|
||||||
|
/* cache the headphone state field id */
|
||||||
|
_headphone_state = (*env_ptr)->GetFieldID(env_ptr,
|
||||||
|
RockboxService_class,
|
||||||
|
"headphone_state",
|
||||||
|
"I");
|
||||||
}
|
}
|
||||||
|
|
||||||
int button_read_device(int *data)
|
int button_read_device(int *data)
|
||||||
|
@ -127,3 +145,13 @@ int button_read_device(int *data)
|
||||||
|
|
||||||
return btn;
|
return btn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Tell if anything is in the jack. */
|
||||||
|
bool headphones_inserted(void)
|
||||||
|
{
|
||||||
|
int state = (*env_ptr)->GetIntField(env_ptr, RockboxService_instance, _headphone_state);
|
||||||
|
/* 0 is disconnected, 1 and 2 are connected */
|
||||||
|
return (state == 0) ? false : true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue