audio policy: disable concurrent capture
Disable concurrent capture until the corresponding UI is available.
Restore preemption for HOTWORD audio source.
Bug:36891272
Test: capture regression tests, run CTS AudioRecordTest, run GTS SearchHostTest
Change-Id: I1b6c32c2a76ae0e004e14e46fedd596a8844c0d4
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index ce6354d..42b85e3 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -1633,6 +1633,8 @@
isSoundTrigger,
policyMix, mpClientInterface);
+// FIXME: disable concurrent capture until UI is ready
+#if 0
// reuse an open input if possible
sp<AudioInputDescriptor> reusedInputDesc;
for (size_t i = 0; i < mInputs.size(); i++) {
@@ -1695,6 +1697,7 @@
releaseInput(reusedInputDesc->mIoHandle, currentSession);
}
}
+#endif
audio_config_t config = AUDIO_CONFIG_INITIALIZER;
config.sample_rate = profileSamplingRate;
@@ -1800,6 +1803,8 @@
return BAD_VALUE;
}
+// FIXME: disable concurrent capture until UI is ready
+#if 0
if (!isConcurentCaptureAllowed(inputDesc, audioSession)) {
ALOGW("startInput(%d) failed: other input already started", input);
return INVALID_OPERATION;
@@ -1811,6 +1816,70 @@
if (mInputs.activeInputsCountOnDevices() != 0) {
*concurrency |= API_INPUT_CONCURRENCY_CAPTURE;
}
+#else
+ if (!is_virtual_input_device(inputDesc->mDevice)) {
+ if (mCallTxPatch != 0 &&
+ inputDesc->getModuleHandle() == mCallTxPatch->mPatch.sources[0].ext.device.hw_module) {
+ ALOGW("startInput(%d) failed: call in progress", input);
+ return INVALID_OPERATION;
+ }
+
+ Vector< sp<AudioInputDescriptor> > activeInputs = mInputs.getActiveInputs();
+ for (size_t i = 0; i < activeInputs.size(); i++) {
+ sp<AudioInputDescriptor> activeDesc = activeInputs[i];
+
+ if (is_virtual_input_device(activeDesc->mDevice)) {
+ continue;
+ }
+
+ audio_source_t activeSource = activeDesc->inputSource(true);
+ if (audioSession->inputSource() == AUDIO_SOURCE_HOTWORD) {
+ if (activeSource == AUDIO_SOURCE_HOTWORD) {
+ if (activeDesc->hasPreemptedSession(session)) {
+ ALOGW("startInput(%d) failed for HOTWORD: "
+ "other input %d already started for HOTWORD",
+ input, activeDesc->mIoHandle);
+ return INVALID_OPERATION;
+ }
+ } else {
+ ALOGV("startInput(%d) failed for HOTWORD: other input %d already started",
+ input, activeDesc->mIoHandle);
+ return INVALID_OPERATION;
+ }
+ } else {
+ if (activeSource != AUDIO_SOURCE_HOTWORD) {
+ ALOGW("startInput(%d) failed: other input %d already started",
+ input, activeDesc->mIoHandle);
+ return INVALID_OPERATION;
+ }
+ }
+ }
+
+ // if capture is allowed, preempt currently active HOTWORD captures
+ for (size_t i = 0; i < activeInputs.size(); i++) {
+ sp<AudioInputDescriptor> activeDesc = activeInputs[i];
+
+ if (is_virtual_input_device(activeDesc->mDevice)) {
+ continue;
+ }
+
+ audio_source_t activeSource = activeDesc->inputSource(true);
+ if (activeSource == AUDIO_SOURCE_HOTWORD) {
+ AudioSessionCollection activeSessions =
+ activeDesc->getAudioSessions(true /*activeOnly*/);
+ audio_session_t activeSession = activeSessions.keyAt(0);
+ audio_io_handle_t activeHandle = activeDesc->mIoHandle;
+ SortedVector<audio_session_t> sessions = activeDesc->getPreemptedSessions();
+ sessions.add(activeSession);
+ inputDesc->setPreemptedSessions(sessions);
+ stopInput(activeHandle, activeSession);
+ releaseInput(activeHandle, activeSession);
+ ALOGV("startInput(%d) for HOTWORD preempting HOTWORD input %d",
+ input, activeDesc->mIoHandle);
+ }
+ }
+ }
+#endif
// increment activity count before calling getNewInputDevice() below as only active sessions
// are considered for device selection