diff options
| author | 2018-03-07 14:46:34 -0800 | |
|---|---|---|
| committer | 2018-03-08 10:00:34 -0800 | |
| commit | 940c6919c86064d136b0837588f531073fabd8c8 (patch) | |
| tree | 5929be3bafb2ec669d39afb09cf1c6d3b6b8ec55 | |
| parent | 9a2857d927c5a96dc6b25d6c6672a8c62820aef0 (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
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, |