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:
Dominik Riebeling 2011-06-04 19:17:47 +00:00
parent 304312dc2f
commit 6c22be4a3d
3 changed files with 51 additions and 0 deletions

View file

@ -64,10 +64,13 @@ public class RockboxService extends Service
private static volatile boolean rockbox_running;
private Activity current_activity = null;
private IntentFilter itf;
private IntentFilter ifh;
private BroadcastReceiver batt_monitor;
private BroadcastReceiver headphone_monitor;
private RunForegroundManager fg_runner;
private MediaButtonReceiver mMediaButtonReceiver;
private int battery_level;
private int headphone_state;
private ResultReceiver resultReceiver;
public static final int RESULT_INVOKING_MAIN = 0;
@ -339,6 +342,24 @@ public class RockboxService extends Service
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()
{
fg_runner.startForeground();

View file

@ -84,6 +84,8 @@
#define HAVE_SW_TONE_CONTROLS
#define HAVE_HEADPHONE_DETECTION
/* Define current usage levels. */
#define CURRENT_NORMAL 88 /* 18 hours from a 1600 mAh battery */
#define CURRENT_BACKLIGHT 30 /* TBD */

View file

@ -31,6 +31,10 @@
#include "powermgmt.h"
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_btns;
@ -110,6 +114,20 @@ Java_org_rockbox_RockboxFramebuffer_buttonHandler(JNIEnv*env, jclass class,
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)
@ -127,3 +145,13 @@ int button_read_device(int *data)
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;
}