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