diff options
author | Eric Laurent <elaurent@google.com> | 2013-09-12 00:15:03 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-09-12 00:15:04 +0000 |
commit | f665c200f1c8163a682e70b7473f5528f83bd5ac (patch) | |
tree | 02536cef203b0881680e7796eac2a7861537c2a6 /audio | |
parent | 8c3b7b67ac1d2df57fd0cdd03ff935d178d7fff3 (diff) | |
parent | fc9b2457ce4721538dca0903de63c7766e97498a (diff) | |
download | hardware_libhardware_legacy-f665c200f1c8163a682e70b7473f5528f83bd5ac.zip hardware_libhardware_legacy-f665c200f1c8163a682e70b7473f5528f83bd5ac.tar.gz hardware_libhardware_legacy-f665c200f1c8163a682e70b7473f5528f83bd5ac.tar.bz2 |
Merge "AudioPolicyManageBase changes to enable HOTWORD audio source" into klp-dev
Diffstat (limited to 'audio')
-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) { |