audio: enable concurrent capture for voice recognition
Add AUDIO_SOURCE_VOICE_RECOGNITION to the list of use
cases allowed for concurrent capture. As AUDIO_SOURCE_HOTWORD is
enabled for concurrent capture it makes sense to enable a client
to transition to voice recognition after the hotword has been detected
in a concurrent capture situation.
Also fixed some concurrent capture scenarii
Bug: 22702906
Test: build and check "OK Google" detection
Change-Id: Ic6dd41372fe74122395764beca7ca9a65197464b
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index e71bb01..eb61ec4 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -1651,13 +1651,15 @@
} else if (isSoundTrigger) {
break;
}
+
// force close input if current source is now the highest priority request on this input
// and current input properties are not exactly as requested.
- if ((desc->mSamplingRate != samplingRate ||
+ if (!isConcurrentSource(inputSource) && !isConcurrentSource(desc->inputSource()) &&
+ ((desc->mSamplingRate != samplingRate ||
desc->mChannelMask != channelMask ||
!audio_formats_match(desc->mFormat, format)) &&
(source_priority(desc->getHighestPrioritySource(false /*activeOnly*/)) <
- source_priority(inputSource))) {
+ source_priority(inputSource)))) {
ALOGV("%s: ", __FUNCTION__);
AudioSessionCollection sessions = desc->getAudioSessions(false /*activeOnly*/);
for (size_t j = 0; j < sessions.size(); j++) {
@@ -1715,6 +1717,14 @@
return input;
}
+//static
+bool AudioPolicyManager::isConcurrentSource(audio_source_t source)
+{
+ return (source == AUDIO_SOURCE_HOTWORD) ||
+ (source == AUDIO_SOURCE_VOICE_RECOGNITION) ||
+ (source == AUDIO_SOURCE_FM_TUNER);
+}
+
bool AudioPolicyManager::isConcurentCaptureAllowed(const sp<AudioInputDescriptor>& inputDesc,
const sp<AudioSession>& audioSession)
{
@@ -1734,16 +1744,14 @@
// 3) All other active captures are either for re-routing or HOTWORD
if (is_virtual_input_device(inputDesc->mDevice) ||
- audioSession->inputSource() == AUDIO_SOURCE_HOTWORD ||
- audioSession->inputSource() == AUDIO_SOURCE_FM_TUNER) {
+ isConcurrentSource(audioSession->inputSource())) {
return true;
}
Vector< sp<AudioInputDescriptor> > activeInputs = mInputs.getActiveInputs();
for (size_t i = 0; i < activeInputs.size(); i++) {
sp<AudioInputDescriptor> activeInput = activeInputs[i];
- if ((activeInput->inputSource() != AUDIO_SOURCE_HOTWORD) &&
- (activeInput->inputSource() != AUDIO_SOURCE_FM_TUNER) &&
+ if (!isConcurrentSource(activeInput->inputSource(true)) &&
!is_virtual_input_device(activeInput->mDevice)) {
return false;
}