Promotion of fm.lnx.2.1-00012.
CRs Change ID Subject
--------------------------------------------------------------------------------------------------------------
1060849 Ia4e2e720943b02625d22d78757c2f3c748ddec53 Call FM power off api after SSR
1081388 I0c27f4025322451447423e1f5c07da1f8db790e6 Check for antenna connected on activity restart
1082110 If6bb49a6c7b10dc32c00b140bd66c3395f594352 Add search list complete callback
1074809 Id498e436dac0e6fe0c9ef823490b1c7588e98ecb Modify sequence of turning OFF FM recording and FM audio
Change-Id: If42976f0383391d4a0caa6813db621904af43553
CRs-Fixed: 1082110, 1081388, 1074809, 1060849
diff --git a/fm_hci/fm_hci.c b/fm_hci/fm_hci.c
index 2fafe83..a3666af 100644
--- a/fm_hci/fm_hci.c
+++ b/fm_hci/fm_hci.c
@@ -57,6 +57,7 @@
#define WAIT_TIMEOUT 200000 /* 200*1000us */
static void fm_hci_exit(void *arg);
+static int power(struct fm_hci_t *hci, fm_power_state_t state);
static void event_notification(struct fm_hci_t *hci, uint16_t event)
{
@@ -178,7 +179,7 @@
{
fd_set readFds;
sigset_t sigmask, emptymask;
- int n = 0, ret = -1, evt_len = -1;
+ int n = 0, ret = -1, evt_len = -1,status=0;
volatile int fd = hci->fd;
struct sigaction action;
@@ -230,6 +231,10 @@
ALOGI("%s: FM H/w Err Event Recvd. Event Code: 0x%2x", __func__, pbuf->evt_code);
lib_running =0;
hci->vendor->ssr_cleanup(0x22);
+ status = power(hci, FM_RADIO_DISABLE);
+ if (status < 0) {
+ ALOGE("power off fm radio failed during SSR ");
+ }
} else {
ALOGE("%s: Not CS/CC Event: Recvd. Event Code: 0x%2x", __func__, pbuf->evt_code);
}
diff --git a/fmapp2/src/com/caf/fmradio/FMRadio.java b/fmapp2/src/com/caf/fmradio/FMRadio.java
index 43fd2ef..7d357f7 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadio.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadio.java
@@ -439,7 +439,7 @@
public void onRestart() {
Log.d(LOGTAG, "FMRadio: onRestart");
try {
- if (null != mService) {
+ if (null != mService && isAntennaAvailable()) {
mService.requestFocus();
}
} catch (Exception e) {
@@ -505,6 +505,9 @@
super.onResume();
+ if (!isAntennaAvailable()) {
+ return;
+ }
// TODO: We should return on exception or continue?
try {
if (mService != null)
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index 2b9fb83..43e91a6 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009-2015, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2009-2016, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -1604,8 +1604,6 @@
case AudioManager.AUDIOFOCUS_LOSS:
Log.v(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS");
//intentional fall through.
- if (true == isFmRecordingOn())
- stopRecording();
if (mSpeakerPhoneOn) {
mSpeakerDisableHandler.removeCallbacks(mSpeakerDisableTask);
mSpeakerDisableHandler.postDelayed(mSpeakerDisableTask, 0);
@@ -1613,6 +1611,9 @@
if (true == mPlaybackInProgress) {
stopFM();
}
+ if (true == isFmRecordingOn())
+ stopRecording();
+
if (mSpeakerPhoneOn) {
if (isAnalogModeSupported())
setAudioPath(false);
@@ -2247,6 +2248,17 @@
* Turn OFF FM Operations: This disables all the current FM operations .
*/
private void fmOperationsOff() {
+ // disable audio path
+ AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+ if(audioManager != null)
+ {
+ Log.d(LOGTAG, "audioManager.setFmRadioOn = false \n" );
+ stopFM();
+ unMute();
+ audioManager.abandonAudioFocus(mAudioFocusListener);
+ //audioManager.setParameters("FMRadioOn=false");
+ Log.d(LOGTAG, "audioManager.setFmRadioOn false done \n" );
+ }
// stop recording
if (isFmRecordingOn())
{
@@ -2258,17 +2270,6 @@
return;
}
}
- // disable audio path
- AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
- if(audioManager != null)
- {
- Log.d(LOGTAG, "audioManager.setFmRadioOn = false \n" );
- stopFM();
- unMute();
- audioManager.abandonAudioFocus(mAudioFocusListener);
- //audioManager.setParameters("FMRadioOn=false");
- Log.d(LOGTAG, "audioManager.setFmRadioOn false done \n" );
- }
// reset FM audio settings
resetAudioRoute();
@@ -2281,6 +2282,7 @@
}
}
+
/*
* Reset (OFF) FM Operations: This resets all the current FM operations .
*/
diff --git a/jni/android_hardware_fm.cpp b/jni/android_hardware_fm.cpp
index 9e469ed..b5b0a5e 100644
--- a/jni/android_hardware_fm.cpp
+++ b/jni/android_hardware_fm.cpp
@@ -194,7 +194,16 @@
void fm_srch_list_cb(uint16_t *scan_tbl)
{
ALOGI("SRCH_LIST");
- //mCallbackEnv->CallVoidMethod(javaObjectRef, method_srchListCallback);
+ jbyteArray srch_buffer = NULL;
+
+ srch_buffer = mCallbackEnv->NewByteArray(STD_BUF_SIZE);
+ if (srch_buffer == NULL) {
+ ALOGE(" af list allocate failed :");
+ return;
+ }
+ mCallbackEnv->SetByteArrayRegion(srch_buffer, 0, STD_BUF_SIZE, (jbyte *)scan_tbl);
+ mCallbackEnv->CallVoidMethod(mCallbacksObj, method_srchListCallback, srch_buffer);
+ mCallbackEnv->DeleteLocalRef(srch_buffer);
}
void fm_stereo_status_cb(bool stereo)
@@ -1519,7 +1528,7 @@
method_tuneCallback = env->GetMethodID(javaClassRef, "tuneCallback", "(I)V");
method_seekCmplCallback = env->GetMethodID(javaClassRef, "seekCmplCallback", "(I)V");
method_scanNxtCallback = env->GetMethodID(javaClassRef, "scanNxtCallback", "()V");
- //method_srchListCallback = env->GetMethodID(javaClassRef, "srchListCallback", "([B)V");
+ method_srchListCallback = env->GetMethodID(javaClassRef, "srchListCallback", "([B)V");
method_stereostsCallback = env->GetMethodID(javaClassRef, "stereostsCallback", "(Z)V");
method_rdsAvlStsCallback = env->GetMethodID(javaClassRef, "rdsAvlStsCallback", "(Z)V");
method_disableCallback = env->GetMethodID(javaClassRef, "disableCallback", "()V");
diff --git a/qcom/fmradio/FmReceiverJNI.java b/qcom/fmradio/FmReceiverJNI.java
index e587b44..c5835ff 100644
--- a/qcom/fmradio/FmReceiverJNI.java
+++ b/qcom/fmradio/FmReceiverJNI.java
@@ -193,7 +193,6 @@
public void tuneCallback(int freq) {
int state;
-
Log.d(TAG, "tuneCallback enter");
state = FmReceiver.getSearchState();
switch(state) {
@@ -222,7 +221,7 @@
Log.d(TAG, "seekCmplCallback enter");
state = FmReceiver.getSearchState();
- switch(state) {
+ switch (state) {
case FmTransceiver.subSrchLevel_ScanInProg:
Log.v(TAG, "Current state is " + state);
FmReceiver.setSearchState(FmTransceiver.subSrchLevel_SrchComplete);
@@ -240,6 +239,26 @@
Log.d(TAG, "seekCmplCallback exit");
}
+ public void srchListCallback(byte[] scan_tbl) {
+ int state;
+ state = FmReceiver.getSearchState();
+ switch (state) {
+ case FmTransceiver.subSrchLevel_SrchListInProg:
+ Log.v(TAG, "FmRxEventListener: Current state is AUTO_PRESET_INPROGRESS");
+ FmReceiver.setSearchState(FmTransceiver.subSrchLevel_SrchComplete);
+ Log.v(TAG, "RxEvtList: CURRENT-STATE : Search ---> NEW-STATE : FMRxOn");
+ FmReceiver.mCallback.FmRxEvSearchListComplete();
+ break;
+ case FmTransceiver.subSrchLevel_SrchAbort:
+ Log.v(TAG, "Current state is SRCH_ABORTED");
+ Log.v(TAG, "Aborting on-going SearchList command...");
+ FmReceiver.setSearchState(FmTransceiver.subSrchLevel_SrchComplete);
+ Log.v(TAG, "RxEvtList: CURRENT-STATE : Search ---> NEW-STATE : FMRxOn");
+ FmReceiver.mCallback.FmRxEvSearchCancelled();
+ break;
+ }
+ }
+
public void scanNxtCallback() {
Log.d(TAG, "scanNxtCallback enter");
FmReceiver.mCallback.FmRxEvSearchInProgress();