From 20eef7d0e8ae6a22825d9760e7eb82b1386668ce Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Thu, 14 Sep 2017 09:42:54 -0700 Subject: [PATCH 1/2] Branch out Broadcast Radio 1.2 HAL. Bug: 62945293 Change-Id: I2b0de6ca6b6373b38879cd30a2a26f16e05edc46 Fixes: 64115813 Test: instrumentation, VTS --- services/core/jni/Android.mk | 3 +- .../BroadcastRadio/BroadcastRadioService.cpp | 56 +++++++++++-------- services/core/jni/BroadcastRadio/Tuner.cpp | 9 ++- services/core/jni/BroadcastRadio/Tuner.h | 6 +- .../core/jni/BroadcastRadio/TunerCallback.cpp | 7 ++- .../core/jni/BroadcastRadio/TunerCallback.h | 4 +- services/core/jni/BroadcastRadio/convert.cpp | 2 +- services/core/jni/BroadcastRadio/regions.cpp | 2 +- services/core/jni/BroadcastRadio/types.h | 5 -- 9 files changed, 54 insertions(+), 40 deletions(-) diff --git a/services/core/jni/Android.mk b/services/core/jni/Android.mk index bf9f941ad9a36..b27d5efcfebe2 100644 --- a/services/core/jni/Android.mk +++ b/services/core/jni/Android.mk @@ -93,6 +93,7 @@ LOCAL_SHARED_LIBRARIES += \ android.hardware.audio.common@2.0 \ android.hardware.broadcastradio@1.0 \ android.hardware.broadcastradio@1.1 \ + android.hardware.broadcastradio@1.2 \ android.hardware.contexthub@1.0 \ android.hardware.gnss@1.0 \ android.hardware.ir@1.0 \ @@ -110,5 +111,5 @@ LOCAL_SHARED_LIBRARIES += \ android.frameworks.sensorservice@1.0 \ LOCAL_STATIC_LIBRARIES += \ - android.hardware.broadcastradio@1.1-utils-lib \ + android.hardware.broadcastradio@common-utils-lib \ libscrypt_static \ diff --git a/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp b/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp index b3817db1d2037..e1dbdebdcb97f 100644 --- a/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp +++ b/services/core/jni/BroadcastRadio/BroadcastRadioService.cpp @@ -23,8 +23,9 @@ #include "convert.h" #include -#include +#include #include +#include #include #include #include @@ -44,14 +45,16 @@ using hardware::hidl_vec; namespace V1_0 = hardware::broadcastradio::V1_0; namespace V1_1 = hardware::broadcastradio::V1_1; - -using V1_0::Class; -using V1_0::Result; +namespace V1_2 = hardware::broadcastradio::V1_2; +namespace utils = hardware::broadcastradio::utils; using V1_0::BandConfig; -using V1_0::ProgramInfo; -using V1_0::MetaData; +using V1_0::Class; using V1_0::ITuner; +using V1_0::MetaData; +using V1_0::ProgramInfo; +using V1_0::Result; +using utils::HalRevision; static mutex gContextMutex; @@ -67,10 +70,15 @@ static struct { } Tuner; } gjni; +struct Module { + sp radioModule; + HalRevision halRev; +}; + struct ServiceContext { ServiceContext() {} - std::vector> mModules; + std::vector mModules; private: DISALLOW_COPY_AND_ASSIGN(ServiceContext); @@ -139,6 +147,17 @@ static jobject nativeLoadModules(JNIEnv *env, jobject obj, jlong nativeContext) continue; } + auto halRev = HalRevision::V1_0; + auto halMinor = 0; + if (V1_2::IBroadcastRadioFactory::castFrom(factory).withDefault(nullptr) != nullptr) { + halRev = HalRevision::V1_2; + halMinor = 2; + } else if (V1_1::IBroadcastRadioFactory::castFrom(factory).withDefault(nullptr) + != nullptr) { + halRev = HalRevision::V1_1; + halMinor = 1; + } + // Second level of scanning - that's unfortunate. for (auto&& clazz : gAllClasses) { sp module10 = nullptr; @@ -155,9 +174,9 @@ static jobject nativeLoadModules(JNIEnv *env, jobject obj, jlong nativeContext) if (module10 == nullptr) continue; auto idx = ctx.mModules.size(); - ctx.mModules.push_back(module10); - ALOGI("loaded broadcast radio module %zu: %s:%s", - idx, serviceName.c_str(), V1_0::toString(clazz).c_str()); + ctx.mModules.push_back({module10, halRev}); + ALOGI("loaded broadcast radio module %zu: %s:%s (HAL 1.%d)", + idx, serviceName.c_str(), V1_0::toString(clazz).c_str(), halMinor); JavaRef jModule = nullptr; Result halResult = Result::OK; @@ -198,22 +217,15 @@ static jobject nativeOpenTuner(JNIEnv *env, jobject obj, long nativeContext, jin ALOGE("Invalid module ID: %d", moduleId); return nullptr; } - auto module = ctx.mModules[moduleId]; - HalRevision halRev; - if (V1_1::IBroadcastRadio::castFrom(module).withDefault(nullptr) != nullptr) { - ALOGI("Opening tuner %d with broadcast radio HAL 1.1", moduleId); - halRev = HalRevision::V1_1; - } else { - ALOGI("Opening tuner %d with broadcast radio HAL 1.0", moduleId); - halRev = HalRevision::V1_0; - } + ALOGI("Opening tuner %d", moduleId); + auto module = ctx.mModules[moduleId]; Region region; BandConfig bandConfigHal = convert::BandConfigToHal(env, bandConfig, region); auto tuner = make_javaref(env, env->NewObject(gjni.Tuner.clazz, gjni.Tuner.cstor, - callback, halRev, region, withAudio, bandConfigHal.type)); + callback, module.halRev, region, withAudio, bandConfigHal.type)); if (tuner == nullptr) { ALOGE("Unable to create new tuner object."); return nullptr; @@ -223,7 +235,7 @@ static jobject nativeOpenTuner(JNIEnv *env, jobject obj, long nativeContext, jin Result halResult; sp halTuner = nullptr; - auto hidlResult = module->openTuner(bandConfigHal, withAudio, tunerCb, + auto hidlResult = module.radioModule->openTuner(bandConfigHal, withAudio, tunerCb, [&](Result result, const sp& tuner) { halResult = result; halTuner = tuner; @@ -235,7 +247,7 @@ static jobject nativeOpenTuner(JNIEnv *env, jobject obj, long nativeContext, jin return nullptr; } - Tuner::assignHalInterfaces(env, tuner, module, halTuner); + Tuner::assignHalInterfaces(env, tuner, module.radioModule, halTuner); ALOGD("Opened tuner %p", halTuner.get()); return tuner.release(); } diff --git a/services/core/jni/BroadcastRadio/Tuner.cpp b/services/core/jni/BroadcastRadio/Tuner.cpp index e1ade4dc02da7..6403a5a0f35ab 100644 --- a/services/core/jni/BroadcastRadio/Tuner.cpp +++ b/services/core/jni/BroadcastRadio/Tuner.cpp @@ -22,7 +22,7 @@ #include "convert.h" #include "TunerCallback.h" -#include +#include #include #include #include @@ -44,13 +44,16 @@ using hardware::hidl_vec; namespace V1_0 = hardware::broadcastradio::V1_0; namespace V1_1 = hardware::broadcastradio::V1_1; +namespace V1_2 = hardware::broadcastradio::V1_2; +namespace utils = hardware::broadcastradio::utils; using V1_0::Band; using V1_0::BandConfig; using V1_0::MetaData; using V1_0::Result; -using V1_1::ITunerCallback; +using V1_2::ITunerCallback; using V1_1::ProgramListResult; +using utils::HalRevision; static mutex gContextMutex; @@ -310,7 +313,7 @@ static void nativeTune(JNIEnv *env, jobject obj, jlong nativeContext, jobject jS convert::ThrowIfFailed(env, halTuner11->tuneByProgramSelector(selector)); } else { uint32_t channel, subChannel; - if (!V1_1::utils::getLegacyChannel(selector, &channel, &subChannel)) { + if (!utils::getLegacyChannel(selector, &channel, &subChannel)) { jniThrowException(env, "java/lang/IllegalArgumentException", "Can't tune to non-AM/FM channel with HAL<1.1"); return; diff --git a/services/core/jni/BroadcastRadio/Tuner.h b/services/core/jni/BroadcastRadio/Tuner.h index 818597bc98ba8..48c3bc7e2271e 100644 --- a/services/core/jni/BroadcastRadio/Tuner.h +++ b/services/core/jni/BroadcastRadio/Tuner.h @@ -22,8 +22,8 @@ #include "JavaRef.h" #include -#include -#include +#include +#include #include #include @@ -39,7 +39,7 @@ void assignHalInterfaces(JNIEnv *env, JavaRef const &jTuner, sp halModule, sp halTuner); -sp +sp getNativeCallback(JNIEnv *env, JavaRef const &tuner); Region getRegion(JNIEnv *env, jobject obj); diff --git a/services/core/jni/BroadcastRadio/TunerCallback.cpp b/services/core/jni/BroadcastRadio/TunerCallback.cpp index d53721fbd082a..3ec86eb7681a0 100644 --- a/services/core/jni/BroadcastRadio/TunerCallback.cpp +++ b/services/core/jni/BroadcastRadio/TunerCallback.cpp @@ -40,15 +40,18 @@ using hardware::hidl_vec; namespace V1_0 = hardware::broadcastradio::V1_0; namespace V1_1 = hardware::broadcastradio::V1_1; +namespace V1_2 = hardware::broadcastradio::V1_2; +namespace utils = hardware::broadcastradio::utils; using V1_0::Band; using V1_0::BandConfig; using V1_0::MetaData; using V1_0::Result; -using V1_1::ITunerCallback; using V1_1::ProgramInfo; using V1_1::ProgramListResult; using V1_1::ProgramSelector; +using V1_2::ITunerCallback; +using utils::HalRevision; static JavaVM *gvm = nullptr; @@ -203,7 +206,7 @@ Return NativeCallback::tuneComplete(Result result, const V1_0::ProgramInfo return {}; } - auto selector = V1_1::utils::make_selector(mBand, info.channel, info.subChannel); + auto selector = utils::make_selector(mBand, info.channel, info.subChannel); return tuneComplete_1_1(result, selector); } diff --git a/services/core/jni/BroadcastRadio/TunerCallback.h b/services/core/jni/BroadcastRadio/TunerCallback.h index af12d213d7276..7e776c29c35a4 100644 --- a/services/core/jni/BroadcastRadio/TunerCallback.h +++ b/services/core/jni/BroadcastRadio/TunerCallback.h @@ -21,7 +21,7 @@ #include "NativeCallbackThread.h" #include "types.h" -#include +#include #include namespace android { @@ -32,7 +32,7 @@ namespace server { namespace BroadcastRadio { namespace TunerCallback { -sp +sp getNativeCallback(JNIEnv *env, jobject jTunerCallback); } // namespace TunerCallback diff --git a/services/core/jni/BroadcastRadio/convert.cpp b/services/core/jni/BroadcastRadio/convert.cpp index ae278decff38a..8dfa14f126f7b 100644 --- a/services/core/jni/BroadcastRadio/convert.cpp +++ b/services/core/jni/BroadcastRadio/convert.cpp @@ -31,7 +31,7 @@ namespace server { namespace BroadcastRadio { namespace convert { -namespace utils = V1_1::utils; +namespace utils = hardware::broadcastradio::utils; using hardware::Return; using hardware::hidl_vec; diff --git a/services/core/jni/BroadcastRadio/regions.cpp b/services/core/jni/BroadcastRadio/regions.cpp index b85641992e6c0..b7fd0f33ccfc7 100644 --- a/services/core/jni/BroadcastRadio/regions.cpp +++ b/services/core/jni/BroadcastRadio/regions.cpp @@ -27,7 +27,7 @@ namespace server { namespace BroadcastRadio { namespace regions { -namespace utils = hardware::broadcastradio::V1_1::utils; +namespace utils = hardware::broadcastradio::utils; using hardware::hidl_vec; diff --git a/services/core/jni/BroadcastRadio/types.h b/services/core/jni/BroadcastRadio/types.h index f726af330572e..64a4f63192bf4 100644 --- a/services/core/jni/BroadcastRadio/types.h +++ b/services/core/jni/BroadcastRadio/types.h @@ -27,11 +27,6 @@ namespace BroadcastRadio { * frameworks/base/core/java/android/hardware/radio/RadioManager.java. */ -enum class HalRevision : jint { - V1_0, - V1_1, -}; - // Keep in sync with STATUS_* constants from RadioManager.java. enum class Status : jint { OK = 0, From 6f06ffe6917de207d872426433b484eb001a2390 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Mon, 18 Sep 2017 22:19:03 -0700 Subject: [PATCH 2/2] Implement generic vendor-specific parameters. This commit covers HAL changes only. Bug: 65862441 Test: it builds Change-Id: I9d3eb232468d8e91bb1f88ccfbf882feb2775ce1 --- services/core/jni/BroadcastRadio/TunerCallback.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/services/core/jni/BroadcastRadio/TunerCallback.cpp b/services/core/jni/BroadcastRadio/TunerCallback.cpp index 3ec86eb7681a0..ed7c9c4749c82 100644 --- a/services/core/jni/BroadcastRadio/TunerCallback.cpp +++ b/services/core/jni/BroadcastRadio/TunerCallback.cpp @@ -50,6 +50,7 @@ using V1_0::Result; using V1_1::ProgramInfo; using V1_1::ProgramListResult; using V1_1::ProgramSelector; +using V1_1::VendorKeyValue; using V1_2::ITunerCallback; using utils::HalRevision; @@ -120,6 +121,7 @@ public: virtual Return backgroundScanComplete(ProgramListResult result); virtual Return programListChanged(); virtual Return currentProgramInfoChanged(const ProgramInfo& info); + virtual Return parametersUpdated(const hidl_vec& parameters); }; struct TunerCallbackContext { @@ -341,6 +343,14 @@ Return NativeCallback::currentProgramInfoChanged(const ProgramInfo& info) return Return(); } +Return NativeCallback::parametersUpdated(const hidl_vec& parameters) { + ALOGV("%s", __func__); + + // TODO(b/65862441): pass this callback to the front-end + + return {}; +} + static TunerCallbackContext& getNativeContext(jlong nativeContextHandle) { auto nativeContext = reinterpret_cast(nativeContextHandle); LOG_ALWAYS_FATAL_IF(nativeContext == nullptr, "Native context not initialized");