xref: /aosp_15_r20/frameworks/av/services/audiopolicy/service/AudioRecordClient.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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(AttributionSourceState attributionSource,
47                          uint32_t virtualDeviceId,
48                          const audio_attributes_t &attr,
49                          int32_t appOp,
50                          bool shouldMonitorRecord,
51                          wp<AudioPolicyService::AudioCommandThread> commandThread);
52 
53     void onFirstRef() override;
54 
55     AppOpsManager mAppOpsManager;
56 
57     class RecordAudioOpCallback : public BnAppOpsCallback {
58     public:
59         explicit RecordAudioOpCallback(const wp<OpRecordAudioMonitor>& monitor);
60         void opChanged(int32_t op, const String16& packageName) override;
61 
62     private:
63         const wp<OpRecordAudioMonitor> mMonitor;
64     };
65 
66     sp<RecordAudioOpCallback> mOpCallback;
67     // called by RecordAudioOpCallback when the app op for this OpRecordAudioMonitor is updated
68     // in AppOp callback and in onFirstRef()
69     // updateUidStates is true when the silenced state of active AudioRecordClients must be
70     // re-evaluated
71     void checkOp(bool updateUidStates = false);
72 
73     std::atomic_bool mHasOp;
74     const AttributionSourceState mAttributionSource;
75     const uint32_t mVirtualDeviceId;
76     const audio_attributes_t mAttr;
77     const int32_t mAppOp;
78     const bool mShouldMonitorRecord;
79     wp<AudioPolicyService::AudioCommandThread> mCommandThread;
80 };
81 
82 // --- AudioRecordClient ---
83 // Information about each registered AudioRecord client
84 // (between calls to getInputForAttr() and releaseInput())
85 class AudioRecordClient : public AudioPolicyService::AudioClient {
86 public:
AudioRecordClient(const audio_attributes_t attributes,const audio_io_handle_t io,const audio_session_t session,audio_port_handle_t portId,const DeviceIdVector deviceIds,const AttributionSourceState & attributionSource,const uint32_t virtualDeviceId,bool canBypassConcurrentPolicy,wp<AudioPolicyService::AudioCommandThread> commandThread)87             AudioRecordClient(const audio_attributes_t attributes,
88                       const audio_io_handle_t io,
89                       const audio_session_t session, audio_port_handle_t portId,
90                       const DeviceIdVector deviceIds,
91                       const AttributionSourceState& attributionSource,
92                       const uint32_t virtualDeviceId,
93                       bool canBypassConcurrentPolicy,
94                       wp<AudioPolicyService::AudioCommandThread> commandThread) :
95                 AudioClient(attributes, io, attributionSource,
96                     session, portId, deviceIds), attributionSource(attributionSource),
97                     virtualDeviceId(virtualDeviceId),
98                     startTimeNs(0), canBypassConcurrentPolicy(canBypassConcurrentPolicy),
99                     silenced(false), mOpRecordAudioMonitor(
100                             OpRecordAudioMonitor::createIfNeeded(attributionSource,
101                                                                  virtualDeviceId,
102                                                                  attributes, commandThread)) {
103 
104             }
105             ~AudioRecordClient() override = default;
106 
hasOp()107     bool hasOp() const {
108         return mOpRecordAudioMonitor ? mOpRecordAudioMonitor->hasOp() : true;
109     }
110 
111     const AttributionSourceState attributionSource; // attribution source of client
112     const uint32_t virtualDeviceId; // id of the virtual device associated with the audio device
113     nsecs_t startTimeNs;
114     const bool canBypassConcurrentPolicy;
115     bool silenced;
116 
117 private:
118     sp<OpRecordAudioMonitor>           mOpRecordAudioMonitor;
119 };
120 
121 }; // namespace android::media::audiopolicy::internal
122