AudioSession.cpp revision e74bbf18a6595a914d3c771be08a72077465c51f
1599c758b258cc5da0dba9b530425381facc37d77Eric Laurent/* 2599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * Copyright (C) 2015 The Android Open Source Project 3599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * 4599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 5599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * you may not use this file except in compliance with the License. 6599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * You may obtain a copy of the License at 7599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * 8599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * http://www.apache.org/licenses/LICENSE-2.0 9599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * 10599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * Unless required by applicable law or agreed to in writing, software 11599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 12599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * See the License for the specific language governing permissions and 14599c758b258cc5da0dba9b530425381facc37d77Eric Laurent * limitations under the License. 15599c758b258cc5da0dba9b530425381facc37d77Eric Laurent */ 16599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 17599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#define LOG_TAG "APM::AudioSession" 18599c758b258cc5da0dba9b530425381facc37d77Eric Laurent//#define LOG_NDEBUG 0 19599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 202f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi#include <AudioPolicyInterface.h> 21599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#include "AudioSession.h" 22599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#include "AudioGain.h" 23599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#include "TypeConverter.h" 2460d02077d86d2d1092443519290101f503aa6f7aMark Salyzyn 25e74bbf18a6595a914d3c771be08a72077465c51fMark Salyzyn#include <log/log.h> 26599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#include <utils/String8.h> 27599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 28599c758b258cc5da0dba9b530425381facc37d77Eric Laurentnamespace android { 29599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 30599c758b258cc5da0dba9b530425381facc37d77Eric LaurentAudioSession::AudioSession(audio_session_t session, 31599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audio_source_t inputSource, 32599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audio_format_t format, 33599c758b258cc5da0dba9b530425381facc37d77Eric Laurent uint32_t sampleRate, 34599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audio_channel_mask_t channelMask, 35599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audio_input_flags_t flags, 36599c758b258cc5da0dba9b530425381facc37d77Eric Laurent uid_t uid, 372f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi bool isSoundTrigger, 382f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi AudioMix* policyMix, 392f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi AudioPolicyClientInterface *clientInterface) : 40599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mSession(session), mInputSource(inputSource), 417281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi mConfig({ .format = format, .sample_rate = sampleRate, .channel_mask = channelMask}), 42599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mFlags(flags), mUid(uid), mIsSoundTrigger(isSoundTrigger), 438c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mOpenCount(1), mActiveCount(0), mPolicyMix(policyMix), mClientInterface(clientInterface), 448c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mInfoProvider(NULL) 45599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 46599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 47599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 48599c758b258cc5da0dba9b530425381facc37d77Eric Laurentuint32_t AudioSession::changeOpenCount(int delta) 49599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 50599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if ((delta + (int)mOpenCount) < 0) { 51599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGW("%s invalid delta %d, open count %d", 52599c758b258cc5da0dba9b530425381facc37d77Eric Laurent __FUNCTION__, delta, mOpenCount); 53599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mOpenCount = (uint32_t)(-delta); 54599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 55599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mOpenCount += delta; 56599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGV("%s open count %d", __FUNCTION__, mOpenCount); 57599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return mOpenCount; 58599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 59599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 60599c758b258cc5da0dba9b530425381facc37d77Eric Laurentuint32_t AudioSession::changeActiveCount(int delta) 61599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 622f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi const uint32_t oldActiveCount = mActiveCount; 63599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if ((delta + (int)mActiveCount) < 0) { 64599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGW("%s invalid delta %d, active count %d", 65599c758b258cc5da0dba9b530425381facc37d77Eric Laurent __FUNCTION__, delta, mActiveCount); 66599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mActiveCount = (uint32_t)(-delta); 67599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 68599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mActiveCount += delta; 69599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGV("%s active count %d", __FUNCTION__, mActiveCount); 708c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi int event = RECORD_CONFIG_EVENT_NONE; 712f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi 722f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi if ((oldActiveCount == 0) && (mActiveCount > 0)) { 738c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi event = RECORD_CONFIG_EVENT_START; 742f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi } else if ((oldActiveCount > 0) && (mActiveCount == 0)) { 758c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi event = RECORD_CONFIG_EVENT_STOP; 768c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi } 778c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi 788c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi if (event != RECORD_CONFIG_EVENT_NONE) { 798c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi // Dynamic policy callback: 802f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi // if input maps to a dynamic policy with an activity listener, notify of state change 812f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi if ((mPolicyMix != NULL) && ((mPolicyMix->mCbFlags & AudioMix::kCbFlagNotifyActivity) != 0)) 822f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi { 837638ca29e8400a19524adb982e9d22c02786de82Jean-Michel Trivi mClientInterface->onDynamicPolicyMixStateUpdate(mPolicyMix->mDeviceAddress, 848c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi (event == RECORD_CONFIG_EVENT_START) ? MIX_STATE_MIXING : MIX_STATE_IDLE); 852f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi } 868c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi 878c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi // Recording configuration callback: 888c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const AudioSessionInfoProvider* provider = mInfoProvider; 898c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_config_base_t deviceConfig = (provider != NULL) ? provider->getConfig() : 908c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi AUDIO_CONFIG_BASE_INITIALIZER; 918c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_patch_handle_t patchHandle = (provider != NULL) ? provider->getPatchHandle() : 928c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi AUDIO_PATCH_HANDLE_NONE; 938c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mClientInterface->onRecordingConfigurationUpdate(event, mSession, mInputSource, 948c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi &mConfig, &deviceConfig, patchHandle); 952f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi } 962f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi 97599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return mActiveCount; 98599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 99599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 100599c758b258cc5da0dba9b530425381facc37d77Eric Laurentbool AudioSession::matches(const sp<AudioSession> &other) const 101599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 102599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (other->session() == mSession && 103599c758b258cc5da0dba9b530425381facc37d77Eric Laurent other->inputSource() == mInputSource && 1047281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi other->format() == mConfig.format && 1057281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi other->sampleRate() == mConfig.sample_rate && 1067281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi other->channelMask() == mConfig.channel_mask && 107599c758b258cc5da0dba9b530425381facc37d77Eric Laurent other->flags() == mFlags && 108599c758b258cc5da0dba9b530425381facc37d77Eric Laurent other->uid() == mUid) { 109599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return true; 110599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 111599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return false; 112599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 113599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 1148c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivivoid AudioSession::setInfoProvider(AudioSessionInfoProvider *provider) 1158c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi{ 1168c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mInfoProvider = provider; 1178c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi} 1188c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi 1198c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivivoid AudioSession::onSessionInfoUpdate() const 1208c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi{ 1218c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi if (mActiveCount > 0) { 1228c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi // resend the callback after requerying the informations from the info provider 1238c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const AudioSessionInfoProvider* provider = mInfoProvider; 1248c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_config_base_t deviceConfig = (provider != NULL) ? provider->getConfig() : 1258c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi AUDIO_CONFIG_BASE_INITIALIZER; 1268c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_patch_handle_t patchHandle = (provider != NULL) ? provider->getPatchHandle() : 1278c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi AUDIO_PATCH_HANDLE_NONE; 1288c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mClientInterface->onRecordingConfigurationUpdate(RECORD_CONFIG_EVENT_START, 1298c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mSession, mInputSource, 1308c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi &mConfig, &deviceConfig, patchHandle); 1318c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi } 1327281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi} 133599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 134599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioSession::dump(int fd, int spaces, int index) const 135599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 136599c758b258cc5da0dba9b530425381facc37d77Eric Laurent const size_t SIZE = 256; 137599c758b258cc5da0dba9b530425381facc37d77Eric Laurent char buffer[SIZE]; 138599c758b258cc5da0dba9b530425381facc37d77Eric Laurent String8 result; 139599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 140599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*sAudio session %d:\n", spaces, "", index+1); 141599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 142599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- session: %2d\n", spaces, "", mSession); 143599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 144599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- owner uid: %2d\n", spaces, "", mUid); 145599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 146599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- input source: %d\n", spaces, "", mInputSource); 147599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 1487281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi snprintf(buffer, SIZE, "%*s- format: %08x\n", spaces, "", mConfig.format); 149599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 1507281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi snprintf(buffer, SIZE, "%*s- sample: %d\n", spaces, "", mConfig.sample_rate); 151599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 152599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- channel mask: %08x\n", 1537281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi spaces, "", mConfig.channel_mask); 154599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 155599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- is soundtrigger: %s\n", 156599c758b258cc5da0dba9b530425381facc37d77Eric Laurent spaces, "", mIsSoundTrigger ? "true" : "false"); 157599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 158599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- open count: %d\n", spaces, "", mOpenCount); 159599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 160599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- active count: %d\n", spaces, "", mActiveCount); 161599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 162599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 163599c758b258cc5da0dba9b530425381facc37d77Eric Laurent write(fd, result.string(), result.size()); 164599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return NO_ERROR; 165599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 166599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 167599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioSessionCollection::addSession(audio_session_t session, 1688c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const sp<AudioSession>& audioSession, 1698c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi AudioSessionInfoProvider *provider) 170599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 171599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ssize_t index = indexOfKey(session); 172599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 173599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (index >= 0) { 174599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGW("addSession() session %d already in", session); 175599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return ALREADY_EXISTS; 176599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 1778c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi audioSession->setInfoProvider(provider); 178599c758b258cc5da0dba9b530425381facc37d77Eric Laurent add(session, audioSession); 179599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGV("addSession() session %d client %d source %d", 180599c758b258cc5da0dba9b530425381facc37d77Eric Laurent session, audioSession->uid(), audioSession->inputSource()); 181599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return NO_ERROR; 182599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 183599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 184599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioSessionCollection::removeSession(audio_session_t session) 185599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 186599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ssize_t index = indexOfKey(session); 187599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 188599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (index < 0) { 189599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGW("removeSession() session %d not in", session); 190599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return ALREADY_EXISTS; 191599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 192599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGV("removeSession() session %d", session); 1938c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi valueAt(index)->setInfoProvider(NULL); 194599c758b258cc5da0dba9b530425381facc37d77Eric Laurent removeItemsAt(index); 195599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return NO_ERROR; 196599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 197599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 198599c758b258cc5da0dba9b530425381facc37d77Eric Laurentuint32_t AudioSessionCollection::getOpenCount() const 199599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 200599c758b258cc5da0dba9b530425381facc37d77Eric Laurent uint32_t openCount = 0; 201599c758b258cc5da0dba9b530425381facc37d77Eric Laurent for (size_t i = 0; i < size(); i++) { 202599c758b258cc5da0dba9b530425381facc37d77Eric Laurent openCount += valueAt(i)->openCount(); 203599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 204599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return openCount; 205599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 206599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 207599c758b258cc5da0dba9b530425381facc37d77Eric LaurentAudioSessionCollection AudioSessionCollection::getActiveSessions() const 208599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 209599c758b258cc5da0dba9b530425381facc37d77Eric Laurent AudioSessionCollection activeSessions; 210599c758b258cc5da0dba9b530425381facc37d77Eric Laurent for (size_t i = 0; i < size(); i++) { 211599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (valueAt(i)->activeCount() != 0) { 212599c758b258cc5da0dba9b530425381facc37d77Eric Laurent activeSessions.add(valueAt(i)->session(), valueAt(i)); 213599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 214599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 215599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return activeSessions; 216599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 217599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 218599c758b258cc5da0dba9b530425381facc37d77Eric Laurentbool AudioSessionCollection::hasActiveSession() const 219599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 220232f26f8b673973ffa463f80b08b731ffacc8785Eric Laurent return getActiveSessions().size() != 0; 221599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 222599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 223599c758b258cc5da0dba9b530425381facc37d77Eric Laurentbool AudioSessionCollection::isSourceActive(audio_source_t source) const 224599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 225599c758b258cc5da0dba9b530425381facc37d77Eric Laurent for (size_t i = 0; i < size(); i++) { 226599c758b258cc5da0dba9b530425381facc37d77Eric Laurent const sp<AudioSession> audioSession = valueAt(i); 227599c758b258cc5da0dba9b530425381facc37d77Eric Laurent // AUDIO_SOURCE_HOTWORD is equivalent to AUDIO_SOURCE_VOICE_RECOGNITION only if it 228599c758b258cc5da0dba9b530425381facc37d77Eric Laurent // corresponds to an active capture triggered by a hardware hotword recognition 229599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (audioSession->activeCount() > 0 && 230599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ((audioSession->inputSource() == source) || 231599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ((source == AUDIO_SOURCE_VOICE_RECOGNITION) && 232599c758b258cc5da0dba9b530425381facc37d77Eric Laurent (audioSession->inputSource() == AUDIO_SOURCE_HOTWORD) && 233599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audioSession->isSoundTrigger()))) { 234599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return true; 235599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 236599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 237599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return false; 238599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 239599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 2408c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivivoid AudioSessionCollection::onSessionInfoUpdate() const 2418c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi{ 2428c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi for (size_t i = 0; i < size(); i++) { 2438c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi valueAt(i)->onSessionInfoUpdate(); 2448c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi } 2458c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi} 2468c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi 247599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 248599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioSessionCollection::dump(int fd, int spaces) const 249599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 250599c758b258cc5da0dba9b530425381facc37d77Eric Laurent const size_t SIZE = 256; 251599c758b258cc5da0dba9b530425381facc37d77Eric Laurent char buffer[SIZE]; 252599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*sAudio Sessions:\n", spaces, ""); 253599c758b258cc5da0dba9b530425381facc37d77Eric Laurent write(fd, buffer, strlen(buffer)); 254599c758b258cc5da0dba9b530425381facc37d77Eric Laurent for (size_t i = 0; i < size(); i++) { 255599c758b258cc5da0dba9b530425381facc37d77Eric Laurent valueAt(i)->dump(fd, spaces + 2, i); 256599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 257599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return NO_ERROR; 258599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 259599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 260599c758b258cc5da0dba9b530425381facc37d77Eric Laurent}; // namespace android 261