Revert "audio policy: concurrent capture"
This reverts commit 4c1ef4b64d113be6ee1106375bd10cdc643e80d8.
Reason for revert: b/120588242
Bug: 120588242
Change-Id: Iac41f371cb739c54d5ce519232688bebe2285c72
Test: Launch QSB and capture from mic icon
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index c2ce754..59c8f10 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -454,6 +454,23 @@
return rawbuffer;
}
+static std::string audioConcurrencyString(
+ AudioPolicyInterface::concurrency_type__mask_t concurrency)
+{
+ char buffer[64]; // oversized
+ if (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_ALL) {
+ snprintf(buffer, sizeof(buffer), "%s%s%s%s",
+ (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_CALL)? ",call":"",
+ (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_CAPTURE)? ",capture":"",
+ (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_HOTWORD)? ",hotword":"",
+ (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_PREEMPT)? ",preempt":"");
+ } else {
+ snprintf(buffer, sizeof(buffer), ",none");
+ }
+
+ return &buffer[1];
+}
+
std::string AudioPolicyService::getDeviceTypeStrForPortId(audio_port_handle_t portId) {
std::string typeStr;
struct audio_port port = {};
@@ -465,7 +482,7 @@
return typeStr;
}
-status_t AudioPolicyService::startInput(audio_port_handle_t portId)
+status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenced)
{
if (mAudioPolicyManager == NULL) {
return NO_INIT;
@@ -488,16 +505,17 @@
return PERMISSION_DENIED;
}
- Mutex::Autolock _l(mLock);
+ // If UID inactive it records silence until becoming active
+ *silenced = !mUidPolicy->isUidActive(client->uid) && !client->isVirtualDevice;
- client->active = true;
- client->startTimeNs = systemTime();
- updateUidStates_l();
+ Mutex::Autolock _l(mLock);
+ AudioPolicyInterface::concurrency_type__mask_t concurrency =
+ AudioPolicyInterface::API_INPUT_CONCURRENCY_NONE;
status_t status;
{
AutoCallerClear acc;
- status = mAudioPolicyManager->startInput(portId);
+ status = mAudioPolicyManager->startInput(portId, *silenced, &concurrency);
}
@@ -506,6 +524,7 @@
static constexpr char kAudioPolicy[] = "audiopolicy";
+ static constexpr char kAudioPolicyReason[] = "android.media.audiopolicy.reason";
static constexpr char kAudioPolicyStatus[] = "android.media.audiopolicy.status";
static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src";
static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg";
@@ -522,6 +541,7 @@
MediaAnalyticsItem *item = new MediaAnalyticsItem(kAudioPolicy);
if (item != NULL) {
+ item->setCString(kAudioPolicyReason, audioConcurrencyString(concurrency).c_str());
item->setInt32(kAudioPolicyStatus, status);
item->setCString(kAudioPolicyRqstSrc,
@@ -536,35 +556,54 @@
item->setCString(
kAudioPolicyRqstDevice, getDeviceTypeStrForPortId(client->deviceId).c_str());
- int count = mAudioRecordClients.size();
- for (int i = 0; i < count ; i++) {
- if (portId == mAudioRecordClients.keyAt(i)) {
- continue;
- }
- sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i);
- if (other->active) {
- // keeps the last of the clients marked active
- item->setCString(kAudioPolicyActiveSrc,
- audioSourceString(other->attributes.source).c_str());
- item->setInt32(kAudioPolicyActiveSession, other->session);
- if (other->opPackageName.size() != 0) {
- item->setCString(kAudioPolicyActivePkg,
- std::string(String8(other->opPackageName).string()).c_str());
- } else {
- item->setCString(kAudioPolicyRqstPkg,
- std::to_string(other->uid).c_str());
+ // figure out who is active
+ // NB: might the other party have given up the microphone since then? how sure.
+ // perhaps could have given up on it.
+ // we hold mLock, so perhaps we're safe for this looping
+ if (concurrency != AudioPolicyInterface::API_INPUT_CONCURRENCY_NONE) {
+ int count = mAudioRecordClients.size();
+ for (int i = 0; i<count ; i++) {
+ if (portId == mAudioRecordClients.keyAt(i)) {
+ continue;
}
- item->setCString(kAudioPolicyActiveDevice,
- getDeviceTypeStrForPortId(other->deviceId).c_str());
+ sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i);
+ if (other->active) {
+ // keeps the last of the clients marked active
+ item->setCString(kAudioPolicyActiveSrc,
+ audioSourceString(other->attributes.source).c_str());
+ item->setInt32(kAudioPolicyActiveSession, other->session);
+ if (other->opPackageName.size() != 0) {
+ item->setCString(kAudioPolicyActivePkg,
+ std::string(String8(other->opPackageName).string()).c_str());
+ } else {
+ item->setCString(kAudioPolicyRqstPkg,
+ std::to_string(other->uid).c_str());
+ }
+ item->setCString(kAudioPolicyActiveDevice,
+ getDeviceTypeStrForPortId(other->deviceId).c_str());
+ }
}
}
item->selfrecord();
delete item;
item = NULL;
}
- client->active = false;
- client->startTimeNs = 0;
- updateUidStates_l();
+ }
+
+ if (status == NO_ERROR) {
+ LOG_ALWAYS_FATAL_IF(concurrency & ~AudioPolicyInterface::API_INPUT_CONCURRENCY_ALL,
+ "startInput(): invalid concurrency type %d", (int)concurrency);
+
+ // enforce permission (if any) required for each type of concurrency
+ if (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_CALL) {
+ //TODO: check incall capture permission
+ }
+ if (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_CAPTURE) {
+ //TODO: check concurrent capture permission
+ }
+
+ client->active = true;
+ } else {
finishRecording(client->opPackageName, client->uid);
}
@@ -576,7 +615,6 @@
if (mAudioPolicyManager == NULL) {
return NO_INIT;
}
-
Mutex::Autolock _l(mLock);
ssize_t index = mAudioRecordClients.indexOfKey(portId);
@@ -586,9 +624,6 @@
sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index);
client->active = false;
- client->startTimeNs = 0;
-
- updateUidStates_l();
// finish the recording app op
finishRecording(client->opPackageName, client->uid);
@@ -611,14 +646,6 @@
return;
}
client = mAudioRecordClients.valueAt(index);
-
- if (client->active) {
- ALOGW("%s releasing active client portId %d", __FUNCTION__, portId);
- client->active = false;
- client->startTimeNs = 0;
- updateUidStates_l();
- }
-
mAudioRecordClients.removeItem(portId);
}
if (client == 0) {
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index 2893872..78dbf5f 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -348,91 +348,11 @@
void AudioPolicyService::updateUidStates_l()
{
-// Go over all active clients and allow capture (does not force silence) in the
-// following cases:
-// - The client is the assistant AND
-// an accessibility service is on TOP AND the source is VOICE_RECOGNITION or HOTWORD
-// OR
-// is on TOP AND uses VOICE_RECOGNITION
-// OR uses HOTWORD AND there is no privacy sensitive active capture
-// - The client is an accessibility service AND
-// is on TOP AND the source is VOICE_RECOGNITION or HOTWORD
-// - Any other client AND
-// The assistant is not on TOP AND
-// is on TOP OR latest started AND
-// there is no privacy sensitive active capture
-//TODO: mamanage pre processing effects according to use case priority
-
- sp<AudioRecordClient> topActive;
- sp<AudioRecordClient> latestActive;
- nsecs_t latestStartNs = 0;
- sp<AudioRecordClient> latestSensitiveActive;
- nsecs_t latestSensitiveStartNs = 0;
- bool isA11yOnTop = mUidPolicy->isA11yOnTop();
- bool isAssistantOnTop = false;
- bool isSensitiveActive = false;
-
+ //TODO: implement real concurrent capture policy: for now just apply each app state directly
for (size_t i =0; i < mAudioRecordClients.size(); i++) {
sp<AudioRecordClient> current = mAudioRecordClients[i];
if (!current->active) continue;
- if (isPrivacySensitive(current->attributes.source)) {
- if (current->startTimeNs > latestSensitiveStartNs) {
- latestSensitiveActive = current;
- latestSensitiveStartNs = current->startTimeNs;
- }
- isSensitiveActive = true;
- }
- if (mUidPolicy->getUidState(current->uid) == ActivityManager::PROCESS_STATE_TOP) {
- topActive = current;
- latestActive = nullptr;
- if (mUidPolicy->isAssistantUid(current->uid)) {
- isAssistantOnTop = true;
- }
- }
- if (current->startTimeNs > latestStartNs) {
- latestActive = current;
- latestStartNs = current->startTimeNs;
- }
- }
-
- if (topActive == nullptr && latestActive == nullptr) {
- return;
- }
-
- for (size_t i =0; i < mAudioRecordClients.size(); i++) {
- sp<AudioRecordClient> current = mAudioRecordClients[i];
- if (!current->active) continue;
-
- audio_source_t source = current->attributes.source;
- bool isOnTop = mUidPolicy->getUidState(current->uid) == ActivityManager::PROCESS_STATE_TOP;
- bool isLatest = current == latestActive;
- bool isLatestSensitive = current == latestSensitiveActive;
- bool forceIdle = true;
- if (mUidPolicy->isAssistantUid(current->uid)) {
- if (isA11yOnTop) {
- if (source == AUDIO_SOURCE_HOTWORD || source == AUDIO_SOURCE_VOICE_RECOGNITION) {
- forceIdle = false;
- }
- } else {
- if (((isOnTop && source == AUDIO_SOURCE_VOICE_RECOGNITION) ||
- source == AUDIO_SOURCE_HOTWORD) && !isSensitiveActive) {
- forceIdle = false;
- }
- }
- } else if (mUidPolicy->isA11yUid(current->uid)) {
- if (isOnTop &&
- (source == AUDIO_SOURCE_VOICE_RECOGNITION || source == AUDIO_SOURCE_HOTWORD)) {
- forceIdle = false;
- }
- } else {
- if (!isAssistantOnTop && (isOnTop || (topActive == nullptr && isLatest)) &&
- (!isSensitiveActive || isLatestSensitive)) {
- forceIdle = false;
- }
- }
- setAppState_l(current->uid,
- forceIdle ? APP_STATE_IDLE :
- apmStatFromAmState(mUidPolicy->getUidState(current->uid)));
+ setAppState_l(current->uid, apmStatFromAmState(mUidPolicy->getUidState(current->uid)));
}
}
@@ -449,22 +369,6 @@
return APP_STATE_FOREGROUND;
}
-/* static */
-bool AudioPolicyService::isPrivacySensitive(audio_source_t source)
-{
- switch (source) {
- case AUDIO_SOURCE_VOICE_UPLINK:
- case AUDIO_SOURCE_VOICE_DOWNLINK:
- case AUDIO_SOURCE_VOICE_CALL:
- case AUDIO_SOURCE_CAMCORDER:
- case AUDIO_SOURCE_VOICE_COMMUNICATION:
- return true;
- default:
- break;
- }
- return false;
-}
-
void AudioPolicyService::setAppState_l(uid_t uid, app_state_t state)
{
AutoCallerClear acc;
@@ -644,7 +548,6 @@
mObserverRegistered = true;
} else {
ALOGE("UidPolicy::registerSelf linkToDeath failed: %d", res);
-
am.unregisterUidObserver(this);
}
}
@@ -747,7 +650,6 @@
mCachedUids.insert(std::pair<uid_t,
std::pair<bool, int>>(uid, std::pair<bool, int>(active, state)));
}
-
return state;
}
@@ -828,21 +730,6 @@
}
}
-bool AudioPolicyService::UidPolicy::isA11yOnTop() {
- for (const auto &uid : mCachedUids) {
- std::vector<uid_t>::iterator it = find(mA11yUids.begin(), mA11yUids.end(), uid.first);
- if (it == mA11yUids.end()) {
- continue;
- }
- if (uid.second.second == ActivityManager::PROCESS_STATE_TOP ||
- uid.second.second == ActivityManager::PROCESS_STATE_FOREGROUND_SERVICE ||
- uid.second.second == ActivityManager::PROCESS_STATE_BOUND_FOREGROUND_SERVICE) {
- return true;
- }
- }
- return false;
-}
-
bool AudioPolicyService::UidPolicy::isA11yUid(uid_t uid)
{
std::vector<uid_t>::iterator it = find(mA11yUids.begin(), mA11yUids.end(), uid);
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index dc5a36d..4d7235f 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -94,7 +94,8 @@
audio_input_flags_t flags,
audio_port_handle_t *selectedDeviceId = NULL,
audio_port_handle_t *portId = NULL);
- virtual status_t startInput(audio_port_handle_t portId);
+ virtual status_t startInput(audio_port_handle_t portId,
+ bool *silenced);
virtual status_t stopInput(audio_port_handle_t portId);
virtual void releaseInput(audio_port_handle_t portId);
virtual status_t initStreamVolume(audio_stream_type_t stream,
@@ -275,8 +276,6 @@
void updateUidStates();
void updateUidStates_l();
- static bool isPrivacySensitive(audio_source_t source);
-
// If recording we need to make sure the UID is allowed to do that. If the UID is idle
// then it cannot record and gets buffers with zeros - silence. As soon as the UID
// transitions to an active state we will start reporting buffers with data. This approach
@@ -300,7 +299,6 @@
bool isAssistantUid(uid_t uid) { return uid == mAssistantUid; }
void setA11yUids(const std::vector<uid_t>& uids) { mA11yUids.clear(); mA11yUids = uids; }
bool isA11yUid(uid_t uid);
- bool isA11yOnTop();
// BnUidObserver implementation
void onUidActive(uid_t uid) override;
@@ -652,11 +650,12 @@
const audio_session_t session, const audio_port_handle_t deviceId,
const String16& opPackageName) :
AudioClient(attributes, io, uid, pid, session, deviceId),
- opPackageName(opPackageName), startTimeNs(0) {}
+ opPackageName(opPackageName), isConcurrent(false), isVirtualDevice(false) {}
~AudioRecordClient() override = default;
const String16 opPackageName; // client package name
- nsecs_t startTimeNs;
+ bool isConcurrent; // is allowed to concurrent capture
+ bool isVirtualDevice; // uses virtual device: updated by APM::getInputForAttr()
};
// --- AudioPlaybackClient ---