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