1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <android/content/AttributionSourceState.h>
20 #include <binder/AppOpsManager.h>
21 #include <system/audio.h>
22 #include <utils/RefBase.h>
23 
24 #include <cstdint>
25 
26 #include "AudioPolicyService.h"
27 
28 namespace android::media::audiopolicy {
29 
30 using ::android::content::AttributionSourceState;
31 
32 // Checks and monitors app ops for AudioRecordClient
33 class OpRecordAudioMonitor : public RefBase {
34 public:
35     ~OpRecordAudioMonitor() override;
36     bool hasOp() const;
getOp()37     int32_t getOp() const { return mAppOp; }
38 
39     static sp<OpRecordAudioMonitor> createIfNeeded(
40             const AttributionSourceState& attributionSource,
41             uint32_t virtualDeviceId,
42             const audio_attributes_t& attr,
43             wp<AudioPolicyService::AudioCommandThread> commandThread);
44 
45 private:
46     OpRecordAudioMonitor(const AttributionSourceState &attributionSource,
47                          uint32_t virtualDeviceId,
48                          const audio_attributes_t &attr,
49                          int32_t appOp,
50                          wp<AudioPolicyService::AudioCommandThread> commandThread);
51 
52     void onFirstRef() override;
53 
54     AppOpsManager mAppOpsManager;
55 
56     class RecordAudioOpCallback : public BnAppOpsCallback {
57     public:
58         explicit RecordAudioOpCallback(const wp<OpRecordAudioMonitor>& monitor);
59         void opChanged(int32_t op, const String16& packageName) override;
60 
61     private:
62         const wp<OpRecordAudioMonitor> mMonitor;
63     };
64 
65     sp<RecordAudioOpCallback> mOpCallback;
66     // called by RecordAudioOpCallback when the app op for this OpRecordAudioMonitor is updated
67     // in AppOp callback and in onFirstRef()
68     // updateUidStates is true when the silenced state of active AudioRecordClients must be
69     // re-evaluated
70     void checkOp(bool updateUidStates = false);
71 
72     std::atomic_bool mHasOp;
73     const AttributionSourceState mAttributionSource;
74     const uint32_t mVirtualDeviceId;
75     const audio_attributes_t mAttr;
76     const int32_t mAppOp;
77     wp<AudioPolicyService::AudioCommandThread> mCommandThread;
78 };
79 
80 // --- AudioRecordClient ---
81 // Information about each registered AudioRecord client
82 // (between calls to getInputForAttr() and releaseInput())
83 class AudioRecordClient : public AudioPolicyService::AudioClient {
84 public:
AudioRecordClient(const audio_attributes_t attributes,const audio_io_handle_t io,const audio_session_t session,audio_port_handle_t portId,const audio_port_handle_t deviceId,const AttributionSourceState & attributionSource,const uint32_t virtualDeviceId,bool canCaptureOutput,bool canCaptureHotword,wp<AudioPolicyService::AudioCommandThread> commandThread)85             AudioRecordClient(const audio_attributes_t attributes,
86                       const audio_io_handle_t io,
87                       const audio_session_t session, audio_port_handle_t portId,
88                       const audio_port_handle_t deviceId,
89                       const AttributionSourceState& attributionSource,
90                       const uint32_t virtualDeviceId,
91                       bool canCaptureOutput, bool canCaptureHotword,
92                       wp<AudioPolicyService::AudioCommandThread> commandThread) :
93                 AudioClient(attributes, io, attributionSource,
94                     session, portId, deviceId), attributionSource(attributionSource),
95                     virtualDeviceId(virtualDeviceId),
96                     startTimeNs(0), canCaptureOutput(canCaptureOutput),
97                     canCaptureHotword(canCaptureHotword), silenced(false),
98                     mOpRecordAudioMonitor(
99                             OpRecordAudioMonitor::createIfNeeded(attributionSource,
100                                                                  virtualDeviceId,
101                                                                  attributes, commandThread)) {
102 
103             }
104             ~AudioRecordClient() override = default;
105 
hasOp()106     bool hasOp() const {
107         return mOpRecordAudioMonitor ? mOpRecordAudioMonitor->hasOp() : true;
108     }
109 
110     const AttributionSourceState attributionSource; // attribution source of client
111     const uint32_t virtualDeviceId; // id of the virtual device associated with the audio device
112     nsecs_t startTimeNs;
113     const bool canCaptureOutput;
114     const bool canCaptureHotword;
115     bool silenced;
116 
117 private:
118     sp<OpRecordAudioMonitor>           mOpRecordAudioMonitor;
119 };
120 
121 }; // namespace android::media::audiopolicy::internal
122