summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tomasz Wasilczyk <twasilczyk@google.com> 2018-03-07 14:46:34 -0800
committer Tomasz Wasilczyk <twasilczyk@google.com> 2018-03-08 10:00:34 -0800
commit940c6919c86064d136b0837588f531073fabd8c8 (patch)
tree5929be3bafb2ec669d39afb09cf1c6d3b6b8ec55
parent9a2857d927c5a96dc6b25d6c6672a8c62820aef0 (diff)
Fix basic broadcastradio HAL 1.1/2.0 functionality.
This change fixes a few minor gaps preventing the reference radio app from accessing HAL 1.1 and 2.0 devices: - createAmFmSelector not detecting the radio band - don't allow configuration-dependant operations before the configuration is applied - allow the initial configuration to be auto-selected Bug: 74353024 Test: manual Change-Id: If47872c1bf4cf57c6c39715218d90df9701c372d
-rw-r--r--core/java/android/hardware/radio/ProgramSelector.java9
-rw-r--r--services/core/java/com/android/server/broadcastradio/hal1/Tuner.java9
-rw-r--r--services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java6
-rw-r--r--services/core/jni/BroadcastRadio/BroadcastRadioService.cpp22
-rw-r--r--services/core/jni/BroadcastRadio/types.h1
5 files changed, 45 insertions, 2 deletions
diff --git a/core/java/android/hardware/radio/ProgramSelector.java b/core/java/android/hardware/radio/ProgramSelector.java
index 0294a29b8282..2a878ebba046 100644
--- a/core/java/android/hardware/radio/ProgramSelector.java
+++ b/core/java/android/hardware/radio/ProgramSelector.java
@@ -441,6 +441,15 @@ public final class ProgramSelector implements Parcelable {
*/
public static @NonNull ProgramSelector createAmFmSelector(
@RadioManager.Band int band, int frequencyKhz, int subChannel) {
+ if (band == RadioManager.BAND_INVALID) {
+ // 50MHz is a rough boundary between AM (<30MHz) and FM (>60MHz).
+ if (frequencyKhz < 50000) {
+ band = (subChannel <= 0) ? RadioManager.BAND_AM : RadioManager.BAND_AM_HD;
+ } else {
+ band = (subChannel <= 0) ? RadioManager.BAND_FM : RadioManager.BAND_FM_HD;
+ }
+ }
+
boolean isAm = (band == RadioManager.BAND_AM || band == RadioManager.BAND_AM_HD);
boolean isDigital = (band == RadioManager.BAND_AM_HD || band == RadioManager.BAND_FM_HD);
if (!isAm && !isDigital && band != RadioManager.BAND_FM) {
diff --git a/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java b/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java
index 2a9d38604eea..ff1e29b4027c 100644
--- a/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java
+++ b/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java
@@ -120,6 +120,12 @@ class Tuner extends ITuner.Stub {
}
}
+ private boolean checkConfiguredLocked() {
+ if (mTunerCallback.isInitialConfigurationDone()) return true;
+ Slog.w(TAG, "Initial configuration is still pending, skipping the operation");
+ return false;
+ }
+
@Override
public void setConfiguration(RadioManager.BandConfig config) {
if (config == null) {
@@ -170,6 +176,7 @@ class Tuner extends ITuner.Stub {
public void step(boolean directionDown, boolean skipSubChannel) {
synchronized (mLock) {
checkNotClosedLocked();
+ if (!checkConfiguredLocked()) return;
nativeStep(mNativeContext, directionDown, skipSubChannel);
}
}
@@ -178,6 +185,7 @@ class Tuner extends ITuner.Stub {
public void scan(boolean directionDown, boolean skipSubChannel) {
synchronized (mLock) {
checkNotClosedLocked();
+ if (!checkConfiguredLocked()) return;
nativeScan(mNativeContext, directionDown, skipSubChannel);
}
}
@@ -190,6 +198,7 @@ class Tuner extends ITuner.Stub {
Slog.i(TAG, "Tuning to " + selector);
synchronized (mLock) {
checkNotClosedLocked();
+ if (!checkConfiguredLocked()) return;
nativeTune(mNativeContext, selector);
}
}
diff --git a/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java b/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
index 7ad73c34f5c0..32b1d1adfe3a 100644
--- a/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
+++ b/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
@@ -47,6 +47,7 @@ class TunerCallback implements ITunerCallback {
@NonNull private final ITunerCallback mClientCallback;
private final AtomicReference<ProgramList.Filter> mProgramListFilter = new AtomicReference<>();
+ private boolean mInitialConfigurationDone = false;
TunerCallback(@NonNull Tuner tuner, @NonNull ITunerCallback clientCallback, int halRev) {
mTuner = tuner;
@@ -95,6 +96,10 @@ class TunerCallback implements ITunerCallback {
mProgramListFilter.set(null);
}
+ boolean isInitialConfigurationDone() {
+ return mInitialConfigurationDone;
+ }
+
@Override
public void onError(int status) {
dispatch(() -> mClientCallback.onError(status));
@@ -107,6 +112,7 @@ class TunerCallback implements ITunerCallback {
@Override
public void onConfigurationChanged(RadioManager.BandConfig config) {
+ mInitialConfigurationDone = true;
dispatch(() -> mClientCallback.onConfigurationChanged(config));
}
diff --git a/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp b/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp
index 14e35782d184..ecf1a33539e9 100644
--- a/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp
+++ b/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp
@@ -72,6 +72,7 @@ static struct {
struct Module {
sp<V1_0::IBroadcastRadio> radioModule;
HalRevision halRev;
+ std::vector<hardware::broadcastradio::V1_0::BandConfig> bands;
};
struct ServiceContext {
@@ -169,7 +170,8 @@ static jobject nativeLoadModules(JNIEnv *env, jobject obj, jlong nativeContext)
if (module10 == nullptr) continue;
auto idx = ctx.mModules.size();
- ctx.mModules.push_back({module10, halRev});
+ ctx.mModules.push_back({module10, halRev, {}});
+ auto& nModule = ctx.mModules[idx];
ALOGI("loaded broadcast radio module %zu: %s:%s (HAL 1.%d)",
idx, serviceName.c_str(), V1_0::toString(clazz).c_str(), halMinor);
@@ -178,6 +180,7 @@ static jobject nativeLoadModules(JNIEnv *env, jobject obj, jlong nativeContext)
Return<void> hidlResult;
if (module11 != nullptr) {
hidlResult = module11->getProperties_1_1([&](const V1_1::Properties& properties) {
+ nModule.bands = properties.base.bands;
jModule = convert::ModulePropertiesFromHal(env, properties, idx, serviceName);
});
} else {
@@ -185,6 +188,7 @@ static jobject nativeLoadModules(JNIEnv *env, jobject obj, jlong nativeContext)
const V1_0::Properties& properties) {
halResult = result;
if (result != Result::OK) return;
+ nModule.bands = properties.bands;
jModule = convert::ModulePropertiesFromHal(env, properties, idx, serviceName);
});
}
@@ -217,7 +221,21 @@ static jobject nativeOpenTuner(JNIEnv *env, jobject obj, long nativeContext, jin
auto module = ctx.mModules[moduleId];
Region region;
- BandConfig bandConfigHal = convert::BandConfigToHal(env, bandConfig, region);
+ BandConfig bandConfigHal;
+ if (bandConfig != nullptr) {
+ bandConfigHal = convert::BandConfigToHal(env, bandConfig, region);
+ } else {
+ region = Region::INVALID;
+ if (module.bands.size() == 0) {
+ ALOGE("No bands defined");
+ return nullptr;
+ }
+ bandConfigHal = module.bands[0];
+ if (bandConfigHal.spacings.size() > 1) {
+ bandConfigHal.spacings = hidl_vec<uint32_t>({ *std::min_element(
+ bandConfigHal.spacings.begin(), bandConfigHal.spacings.end()) });
+ }
+ }
auto tuner = make_javaref(env, env->NewObject(gjni.Tuner.clazz, gjni.Tuner.cstor,
callback, module.halRev, region, withAudio, bandConfigHal.type));
diff --git a/services/core/jni/BroadcastRadio/types.h b/services/core/jni/BroadcastRadio/types.h
index 64a4f63192bf..910bb7c0a4d1 100644
--- a/services/core/jni/BroadcastRadio/types.h
+++ b/services/core/jni/BroadcastRadio/types.h
@@ -41,6 +41,7 @@ enum class Status : jint {
// Keep in sync with REGION_* constants from RadioManager.java.
enum class Region : jint {
+ INVALID = -1,
ITU_1 = 0,
ITU_2 = 1,
OIRT = 2,