xref: /aosp_15_r20/frameworks/av/services/audiopolicy/service/CaptureStateNotifier.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "CaptureStateNotifier"
2*ec779b8eSAndroid Build Coastguard Worker 
3*ec779b8eSAndroid Build Coastguard Worker #include "CaptureStateNotifier.h"
4*ec779b8eSAndroid Build Coastguard Worker 
5*ec779b8eSAndroid Build Coastguard Worker #include <android/media/ICaptureStateListener.h>
6*ec779b8eSAndroid Build Coastguard Worker #include <binder/IBinder.h>
7*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
8*ec779b8eSAndroid Build Coastguard Worker 
9*ec779b8eSAndroid Build Coastguard Worker namespace android {
10*ec779b8eSAndroid Build Coastguard Worker 
11*ec779b8eSAndroid Build Coastguard Worker using media::ICaptureStateListener;
12*ec779b8eSAndroid Build Coastguard Worker 
13*ec779b8eSAndroid Build Coastguard Worker class CaptureStateNotifier::DeathRecipient : public IBinder::DeathRecipient {
14*ec779b8eSAndroid Build Coastguard Worker public:
DeathRecipient(CaptureStateNotifier * notifier)15*ec779b8eSAndroid Build Coastguard Worker     DeathRecipient(CaptureStateNotifier* notifier) : mNotifier(notifier) {}
16*ec779b8eSAndroid Build Coastguard Worker 
binderDied(const wp<IBinder> &)17*ec779b8eSAndroid Build Coastguard Worker     void binderDied(const wp<IBinder>&) override {
18*ec779b8eSAndroid Build Coastguard Worker         mNotifier->binderDied();
19*ec779b8eSAndroid Build Coastguard Worker     }
20*ec779b8eSAndroid Build Coastguard Worker 
21*ec779b8eSAndroid Build Coastguard Worker private:
22*ec779b8eSAndroid Build Coastguard Worker     CaptureStateNotifier* const mNotifier;
23*ec779b8eSAndroid Build Coastguard Worker };
24*ec779b8eSAndroid Build Coastguard Worker 
CaptureStateNotifier(bool initialActive)25*ec779b8eSAndroid Build Coastguard Worker CaptureStateNotifier::CaptureStateNotifier(bool initialActive)
26*ec779b8eSAndroid Build Coastguard Worker     : mDeathRecipient(new DeathRecipient(this)), mActive(
27*ec779b8eSAndroid Build Coastguard Worker     initialActive) {}
28*ec779b8eSAndroid Build Coastguard Worker 
~CaptureStateNotifier()29*ec779b8eSAndroid Build Coastguard Worker CaptureStateNotifier::~CaptureStateNotifier() {
30*ec779b8eSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(mListener != nullptr);
31*ec779b8eSAndroid Build Coastguard Worker }
32*ec779b8eSAndroid Build Coastguard Worker 
RegisterListener(const sp<ICaptureStateListener> & listener)33*ec779b8eSAndroid Build Coastguard Worker bool CaptureStateNotifier::RegisterListener(const sp<ICaptureStateListener>& listener) {
34*ec779b8eSAndroid Build Coastguard Worker     std::lock_guard<std::mutex> _l(mMutex);
35*ec779b8eSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(mListener != nullptr);
36*ec779b8eSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(listener == nullptr);
37*ec779b8eSAndroid Build Coastguard Worker 
38*ec779b8eSAndroid Build Coastguard Worker     ALOGI("Registering a listener");
39*ec779b8eSAndroid Build Coastguard Worker     sp<IBinder> binder = IInterface::asBinder(listener);
40*ec779b8eSAndroid Build Coastguard Worker     if (binder != nullptr) {
41*ec779b8eSAndroid Build Coastguard Worker         status_t status = binder->linkToDeath(mDeathRecipient);
42*ec779b8eSAndroid Build Coastguard Worker         if (status == NO_ERROR) {
43*ec779b8eSAndroid Build Coastguard Worker             mListener = listener;
44*ec779b8eSAndroid Build Coastguard Worker         } else {
45*ec779b8eSAndroid Build Coastguard Worker             ALOGE("Failed to register death listener: %u", status);
46*ec779b8eSAndroid Build Coastguard Worker         }
47*ec779b8eSAndroid Build Coastguard Worker     } else {
48*ec779b8eSAndroid Build Coastguard Worker         ALOGE("Listener failed to cast to a binder.");
49*ec779b8eSAndroid Build Coastguard Worker     }
50*ec779b8eSAndroid Build Coastguard Worker     return mActive;
51*ec779b8eSAndroid Build Coastguard Worker }
52*ec779b8eSAndroid Build Coastguard Worker 
setCaptureState(bool active)53*ec779b8eSAndroid Build Coastguard Worker void CaptureStateNotifier::setCaptureState(bool active) {
54*ec779b8eSAndroid Build Coastguard Worker     std::lock_guard<std::mutex> _l(mMutex);
55*ec779b8eSAndroid Build Coastguard Worker     mActive = active;
56*ec779b8eSAndroid Build Coastguard Worker     if (mListener) {
57*ec779b8eSAndroid Build Coastguard Worker         mListener->setCaptureState(active);
58*ec779b8eSAndroid Build Coastguard Worker     }
59*ec779b8eSAndroid Build Coastguard Worker }
60*ec779b8eSAndroid Build Coastguard Worker 
binderDied()61*ec779b8eSAndroid Build Coastguard Worker void CaptureStateNotifier::binderDied() {
62*ec779b8eSAndroid Build Coastguard Worker     std::lock_guard<std::mutex> _l(mMutex);
63*ec779b8eSAndroid Build Coastguard Worker     mListener.clear();
64*ec779b8eSAndroid Build Coastguard Worker     ALOGI("Listener binder died");
65*ec779b8eSAndroid Build Coastguard Worker }
66*ec779b8eSAndroid Build Coastguard Worker 
67*ec779b8eSAndroid Build Coastguard Worker }  // namespace android