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