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