xref: /aosp_15_r20/frameworks/av/services/audiopolicy/service/CaptureStateNotifier.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2020 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #pragma once
18*ec779b8eSAndroid Build Coastguard Worker 
19*ec779b8eSAndroid Build Coastguard Worker #include <mutex>
20*ec779b8eSAndroid Build Coastguard Worker #include <binder/IBinder.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <utils/StrongPointer.h>
22*ec779b8eSAndroid Build Coastguard Worker 
23*ec779b8eSAndroid Build Coastguard Worker namespace android {
24*ec779b8eSAndroid Build Coastguard Worker namespace media {
25*ec779b8eSAndroid Build Coastguard Worker // Must be pre-declared, or else there isn't a good way to generate a header
26*ec779b8eSAndroid Build Coastguard Worker // library.
27*ec779b8eSAndroid Build Coastguard Worker class ICaptureStateListener;
28*ec779b8eSAndroid Build Coastguard Worker }
29*ec779b8eSAndroid Build Coastguard Worker 
30*ec779b8eSAndroid Build Coastguard Worker // A utility for managing capture state change notifications.
31*ec779b8eSAndroid Build Coastguard Worker //
32*ec779b8eSAndroid Build Coastguard Worker // We are making some strong assumptions, for the sake of simplicity:
33*ec779b8eSAndroid Build Coastguard Worker // - There is no way to explicitly unregister listeners. The only way for a
34*ec779b8eSAndroid Build Coastguard Worker //   listener to unregister is by dying.
35*ec779b8eSAndroid Build Coastguard Worker // - There's only at most one listener at a given time. Attempting to register
36*ec779b8eSAndroid Build Coastguard Worker //   a second listener will cause a crash.
37*ec779b8eSAndroid Build Coastguard Worker // - This class isn't really meant to ever be destroyed. We expose a destructor
38*ec779b8eSAndroid Build Coastguard Worker //   because it is convenient to use this class as a global instance or a member
39*ec779b8eSAndroid Build Coastguard Worker //   of another class, but it will crash if destroyed while a listener is
40*ec779b8eSAndroid Build Coastguard Worker //   registered.
41*ec779b8eSAndroid Build Coastguard Worker //
42*ec779b8eSAndroid Build Coastguard Worker // All of these assumptions can be lifted if there is ever a need.
43*ec779b8eSAndroid Build Coastguard Worker //
44*ec779b8eSAndroid Build Coastguard Worker // This class is thread-safe.
45*ec779b8eSAndroid Build Coastguard Worker class CaptureStateNotifier {
46*ec779b8eSAndroid Build Coastguard Worker public:
47*ec779b8eSAndroid Build Coastguard Worker     // Ctor.
48*ec779b8eSAndroid Build Coastguard Worker     // Accepts the initial active state.
49*ec779b8eSAndroid Build Coastguard Worker     explicit CaptureStateNotifier(bool initialActive);
50*ec779b8eSAndroid Build Coastguard Worker 
51*ec779b8eSAndroid Build Coastguard Worker     // Register a listener to be notified of state changes.
52*ec779b8eSAndroid Build Coastguard Worker     // The current state is returned and from that point on any change will be
53*ec779b8eSAndroid Build Coastguard Worker     // notified of.
54*ec779b8eSAndroid Build Coastguard Worker     bool RegisterListener(const sp<media::ICaptureStateListener>& listener);
55*ec779b8eSAndroid Build Coastguard Worker 
56*ec779b8eSAndroid Build Coastguard Worker     // Change the current capture state.
57*ec779b8eSAndroid Build Coastguard Worker     // Active means "actively capturing".
58*ec779b8eSAndroid Build Coastguard Worker     void setCaptureState(bool active);
59*ec779b8eSAndroid Build Coastguard Worker 
60*ec779b8eSAndroid Build Coastguard Worker     // Dtor. Do not actually call at runtime. Will cause a crash if a listener
61*ec779b8eSAndroid Build Coastguard Worker     // is registered.
62*ec779b8eSAndroid Build Coastguard Worker     ~CaptureStateNotifier();
63*ec779b8eSAndroid Build Coastguard Worker 
64*ec779b8eSAndroid Build Coastguard Worker private:
65*ec779b8eSAndroid Build Coastguard Worker     std::mutex mMutex;
66*ec779b8eSAndroid Build Coastguard Worker     sp<media::ICaptureStateListener> mListener;
67*ec779b8eSAndroid Build Coastguard Worker     sp<IBinder::DeathRecipient> mDeathRecipient;
68*ec779b8eSAndroid Build Coastguard Worker     bool mActive;
69*ec779b8eSAndroid Build Coastguard Worker 
70*ec779b8eSAndroid Build Coastguard Worker     class DeathRecipient;
71*ec779b8eSAndroid Build Coastguard Worker 
72*ec779b8eSAndroid Build Coastguard Worker     void binderDied();
73*ec779b8eSAndroid Build Coastguard Worker };
74*ec779b8eSAndroid Build Coastguard Worker 
75*ec779b8eSAndroid Build Coastguard Worker }  // namespace android
76