diff --git a/universal7885-common/apps/aidl-support/fm/default/Android.bp b/universal7885-common/apps/aidl-support/fm/default/Android.bp index fc10610..d5105bf 100644 --- a/universal7885-common/apps/aidl-support/fm/default/Android.bp +++ b/universal7885-common/apps/aidl-support/fm/default/Android.bp @@ -23,7 +23,7 @@ cc_binary { "libbinder_ndk", "liblog", "libfileio", - "vendor.eureka.hardware.fmradio-V2-ndk", + "vendor.eureka.hardware.fmradio-V3-ndk", "vendor.eureka.hardware.audio_route-V1-ndk", ], header_libs: ["libaudioclient_headers"], diff --git a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp index bdcdde6..fb3733b 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp +++ b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.cpp @@ -20,8 +20,10 @@ #include #include +#include #include +#include #include "CommonMacro.h" @@ -94,9 +96,10 @@ namespace aidl::vendor::eureka::hardware::fmradio { } ::ndk::ScopedAStatus FMDevControl::setValue(SetType type, int value) { + using audio_route::IAudioRoute; + RETURN_IF_FAILED_LOCK; assert(fd > 0); - std::shared_ptr svc; switch (type) { case SetType::SET_TYPE_FM_FREQ: fm_radio_slsi::set_frequency(fd, value); @@ -119,7 +122,7 @@ namespace aidl::vendor::eureka::hardware::fmradio { fm_radio_slsi::stop_search(fd); break; case SetType::SET_TYPE_FM_SPEAKER_ROUTE: - svc = audio_route::IAudioRoute::fromBinder(ndk::SpAIBinder(AServiceManager_waitForService("vendor.eureka.hardware.audio_route.IAudioRoute/default"))); + std::shared_ptr svc = IAudioRoute::fromBinder(ndk::SpAIBinder(AServiceManager_waitForService("vendor.eureka.hardware.audio_route.IAudioRoute/default"))); svc->setParam(value ? "routing=2": "routing=8"); break; case SetType::SET_TYPE_FM_SEARCH_START: @@ -130,6 +133,22 @@ namespace aidl::vendor::eureka::hardware::fmradio { }); search_thread.detach(); break; + case SetType::SET_TYPE_FM_APP_PID: + client_observe_thread = std::thread([=] { + std::shared_ptr svc; + pid_t pid = value; + + while (true) { + if (kill(pid, 0) < 0 && errno == ESRCH) break; + std::this_thread::sleep_for(std::chrono::seconds(2)); + } + + fm_radio_slsi::fm_thread_set(fd, 0); + svc = IAudioRoute::fromBinder(ndk::SpAIBinder(AServiceManager_waitForService("vendor.eureka.hardware.audio_route.IAudioRoute/default"))); + svc->setParam("l_fmradio_mode=off"); + close(); + } + client_observe_thread.detach(); default: break; }; diff --git a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.h b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.h index 9047b02..12a03dc 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMDevControl.h +++ b/universal7885-common/apps/aidl-support/fm/default/FMDevControl.h @@ -38,7 +38,7 @@ struct FMDevControl : public BnFMDevControl { int fd; unsigned int index; std::timed_mutex lock; - std::thread search_thread; + std::thread search_thread, client_observe_thread; std::vector freqs_list; middlestate_t *kMiddleState; }; diff --git a/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp b/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp index fca0fee..e4f0509 100644 --- a/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp +++ b/universal7885-common/apps/aidl-support/fm/default/FMSupport.cpp @@ -97,6 +97,7 @@ constexpr const char *FM_FREQ_SEEK = FM_SYSFS_BASE "/radio_freq_seek"; case SetType::SET_TYPE_FM_RMSSI: case SetType::SET_TYPE_FM_SEARCH_CANCEL: case SetType::SET_TYPE_FM_SPEAKER_ROUTE: + case SetType::SET_TYPE_FM_APP_PID: NOT_SUPPORTED; case SetType::SET_TYPE_FM_SEARCH_START: lock.unlock();