diff options
author | Eric Laurent <elaurent@google.com> | 2013-09-09 10:42:47 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2013-09-09 15:43:35 -0700 |
commit | fc9b2457ce4721538dca0903de63c7766e97498a (patch) | |
tree | da92a8a05af55c6ec2491cd54870614a95baae6e /audio/AudioPolicyManagerBase.cpp | |
parent | 4e57a1d4979c2644dd8999dc5759b10ed0af56e9 (diff) | |
download | hardware_libhardware_legacy-fc9b2457ce4721538dca0903de63c7766e97498a.zip hardware_libhardware_legacy-fc9b2457ce4721538dca0903de63c7766e97498a.tar.gz hardware_libhardware_legacy-fc9b2457ce4721538dca0903de63c7766e97498a.tar.bz2 |
AudioPolicyManageBase changes to enable HOTWORD audio source
- This change enables HOTWORD audio source to be preempted by any other
audio source
Bug: 10640877.
Change-Id: I6f7acbe95a6521306db70ad73260d2ba7b38b940
Diffstat (limited to 'audio/AudioPolicyManagerBase.cpp')
-rw-r--r-- | audio/AudioPolicyManagerBase.cpp | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/audio/AudioPolicyManagerBase.cpp b/audio/AudioPolicyManagerBase.cpp index de235a0..125938a 100644 --- a/audio/AudioPolicyManagerBase.cpp +++ b/audio/AudioPolicyManagerBase.cpp @@ -958,10 +958,19 @@ status_t AudioPolicyManagerBase::startInput(audio_io_handle_t input) if (mTestInput == 0) #endif //AUDIO_POLICY_TEST { - // refuse 2 active AudioRecord clients at the same time - if (!isVirtualInputDevice(inputDesc->mDevice) && getActiveInput(true) != 0) { - ALOGW("startInput() input %d failed: other input already started", input); - return INVALID_OPERATION; + // refuse 2 active AudioRecord clients at the same time except if the active input + // uses AUDIO_SOURCE_HOTWORD in which case it is closed. + audio_io_handle_t activeInput = getActiveInput(); + if (!isVirtualInputDevice(inputDesc->mDevice) && activeInput != 0) { + AudioInputDescriptor *activeDesc = mInputs.valueFor(activeInput); + if (activeDesc->mInputSource == AUDIO_SOURCE_HOTWORD) { + ALOGW("startInput() preempting already started low-priority input %d", activeInput); + stopInput(activeInput); + releaseInput(activeInput); + } else { + ALOGW("startInput() input %d failed: other input already started..", input); + return INVALID_OPERATION; + } } } @@ -979,7 +988,10 @@ status_t AudioPolicyManagerBase::startInput(audio_io_handle_t input) AudioParameter param = AudioParameter(); param.addInt(String8(AudioParameter::keyRouting), (int)inputDesc->mDevice); - param.addInt(String8(AudioParameter::keyInputSource), (int)inputDesc->mInputSource); + int aliasSource = (inputDesc->mInputSource == AUDIO_SOURCE_HOTWORD) ? + AUDIO_SOURCE_VOICE_RECOGNITION : inputDesc->mInputSource; + + param.addInt(String8(AudioParameter::keyInputSource), aliasSource); ALOGV("AudioPolicyManager::startInput() input source = %d", inputDesc->mInputSource); mpClientInterface->setParameters(input, param.toString()); @@ -1256,8 +1268,10 @@ bool AudioPolicyManagerBase::isSourceActive(audio_source_t source) const { for (size_t i = 0; i < mInputs.size(); i++) { const AudioInputDescriptor * inputDescriptor = mInputs.valueAt(i); - if ((inputDescriptor->mInputSource == (int) source) - && (inputDescriptor->mRefCount > 0)) { + if ((inputDescriptor->mInputSource == (int)source || + (source == (audio_source_t)AUDIO_SOURCE_VOICE_RECOGNITION && + inputDescriptor->mInputSource == AUDIO_SOURCE_HOTWORD)) + && (inputDescriptor->mRefCount > 0)) { return true; } } @@ -1265,7 +1279,6 @@ bool AudioPolicyManagerBase::isSourceActive(audio_source_t source) const } - status_t AudioPolicyManagerBase::dump(int fd) { const size_t SIZE = 256; @@ -2589,6 +2602,7 @@ audio_devices_t AudioPolicyManagerBase::getDeviceForInputSource(int inputSource) case AUDIO_SOURCE_DEFAULT: case AUDIO_SOURCE_MIC: case AUDIO_SOURCE_VOICE_RECOGNITION: + case AUDIO_SOURCE_HOTWORD: case AUDIO_SOURCE_VOICE_COMMUNICATION: if (mForceUse[AudioSystem::FOR_RECORD] == AudioSystem::FORCE_BT_SCO && mAvailableInputDevices & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) { |