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" 24599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#include <cutils/log.h> 25599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#include <utils/String8.h> 26599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 27599c758b258cc5da0dba9b530425381facc37d77Eric Laurentnamespace android { 28599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 29599c758b258cc5da0dba9b530425381facc37d77Eric LaurentAudioSession::AudioSession(audio_session_t session, 30599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audio_source_t inputSource, 31599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audio_format_t format, 32599c758b258cc5da0dba9b530425381facc37d77Eric Laurent uint32_t sampleRate, 33599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audio_channel_mask_t channelMask, 34599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audio_input_flags_t flags, 35599c758b258cc5da0dba9b530425381facc37d77Eric Laurent uid_t uid, 362f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi bool isSoundTrigger, 372f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi AudioMix* policyMix, 382f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi AudioPolicyClientInterface *clientInterface) : 39599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mSession(session), mInputSource(inputSource), 407281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi mConfig({ .format = format, .sample_rate = sampleRate, .channel_mask = channelMask}), 41599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mFlags(flags), mUid(uid), mIsSoundTrigger(isSoundTrigger), 428c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mOpenCount(1), mActiveCount(0), mPolicyMix(policyMix), mClientInterface(clientInterface), 438c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mInfoProvider(NULL) 44599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 45599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 46599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 47599c758b258cc5da0dba9b530425381facc37d77Eric Laurentuint32_t AudioSession::changeOpenCount(int delta) 48599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 49599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if ((delta + (int)mOpenCount) < 0) { 50599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGW("%s invalid delta %d, open count %d", 51599c758b258cc5da0dba9b530425381facc37d77Eric Laurent __FUNCTION__, delta, mOpenCount); 52599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mOpenCount = (uint32_t)(-delta); 53599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 54599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mOpenCount += delta; 55599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGV("%s open count %d", __FUNCTION__, mOpenCount); 56599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return mOpenCount; 57599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 58599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 59599c758b258cc5da0dba9b530425381facc37d77Eric Laurentuint32_t AudioSession::changeActiveCount(int delta) 60599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 612f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi const uint32_t oldActiveCount = mActiveCount; 62599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if ((delta + (int)mActiveCount) < 0) { 63599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGW("%s invalid delta %d, active count %d", 64599c758b258cc5da0dba9b530425381facc37d77Eric Laurent __FUNCTION__, delta, mActiveCount); 65599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mActiveCount = (uint32_t)(-delta); 66599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 67599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mActiveCount += delta; 68599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGV("%s active count %d", __FUNCTION__, mActiveCount); 698c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi int event = RECORD_CONFIG_EVENT_NONE; 702f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi 712f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi if ((oldActiveCount == 0) && (mActiveCount > 0)) { 728c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi event = RECORD_CONFIG_EVENT_START; 732f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi } else if ((oldActiveCount > 0) && (mActiveCount == 0)) { 748c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi event = RECORD_CONFIG_EVENT_STOP; 758c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi } 768c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi 778c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi if (event != RECORD_CONFIG_EVENT_NONE) { 788c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi // Dynamic policy callback: 792f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi // if input maps to a dynamic policy with an activity listener, notify of state change 802f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi if ((mPolicyMix != NULL) && ((mPolicyMix->mCbFlags & AudioMix::kCbFlagNotifyActivity) != 0)) 812f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi { 827638ca29e8400a19524adb982e9d22c02786de82Jean-Michel Trivi mClientInterface->onDynamicPolicyMixStateUpdate(mPolicyMix->mDeviceAddress, 838c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi (event == RECORD_CONFIG_EVENT_START) ? MIX_STATE_MIXING : MIX_STATE_IDLE); 842f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi } 858c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi 868c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi // Recording configuration callback: 878c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const AudioSessionInfoProvider* provider = mInfoProvider; 888c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_config_base_t deviceConfig = (provider != NULL) ? provider->getConfig() : 898c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi AUDIO_CONFIG_BASE_INITIALIZER; 908c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_patch_handle_t patchHandle = (provider != NULL) ? provider->getPatchHandle() : 918c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi AUDIO_PATCH_HANDLE_NONE; 928c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mClientInterface->onRecordingConfigurationUpdate(event, mSession, mInputSource, 938c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi &mConfig, &deviceConfig, patchHandle); 942f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi } 952f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi 96599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return mActiveCount; 97599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 98599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 99599c758b258cc5da0dba9b530425381facc37d77Eric Laurentbool AudioSession::matches(const sp<AudioSession> &other) const 100599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 101599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (other->session() == mSession && 102599c758b258cc5da0dba9b530425381facc37d77Eric Laurent other->inputSource() == mInputSource && 1037281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi other->format() == mConfig.format && 1047281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi other->sampleRate() == mConfig.sample_rate && 1057281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi other->channelMask() == mConfig.channel_mask && 106599c758b258cc5da0dba9b530425381facc37d77Eric Laurent other->flags() == mFlags && 107599c758b258cc5da0dba9b530425381facc37d77Eric Laurent other->uid() == mUid) { 108599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return true; 109599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 110599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return false; 111599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 112599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 1138c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivivoid AudioSession::setInfoProvider(AudioSessionInfoProvider *provider) 1148c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi{ 1158c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mInfoProvider = provider; 1168c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi} 1178c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi 1188c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivivoid AudioSession::onSessionInfoUpdate() const 1198c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi{ 1208c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi if (mActiveCount > 0) { 1218c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi // resend the callback after requerying the informations from the info provider 1228c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const AudioSessionInfoProvider* provider = mInfoProvider; 1238c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_config_base_t deviceConfig = (provider != NULL) ? provider->getConfig() : 1248c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi AUDIO_CONFIG_BASE_INITIALIZER; 1258c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_patch_handle_t patchHandle = (provider != NULL) ? provider->getPatchHandle() : 1268c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi AUDIO_PATCH_HANDLE_NONE; 1278c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mClientInterface->onRecordingConfigurationUpdate(RECORD_CONFIG_EVENT_START, 1288c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mSession, mInputSource, 1298c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi &mConfig, &deviceConfig, patchHandle); 1308c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi } 1317281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi} 132599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 133599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioSession::dump(int fd, int spaces, int index) const 134599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 135599c758b258cc5da0dba9b530425381facc37d77Eric Laurent const size_t SIZE = 256; 136599c758b258cc5da0dba9b530425381facc37d77Eric Laurent char buffer[SIZE]; 137599c758b258cc5da0dba9b530425381facc37d77Eric Laurent String8 result; 138599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 139599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*sAudio session %d:\n", spaces, "", index+1); 140599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 141599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- session: %2d\n", spaces, "", mSession); 142599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 143599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- owner uid: %2d\n", spaces, "", mUid); 144599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 145599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- input source: %d\n", spaces, "", mInputSource); 146599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 1477281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi snprintf(buffer, SIZE, "%*s- format: %08x\n", spaces, "", mConfig.format); 148599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 1497281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi snprintf(buffer, SIZE, "%*s- sample: %d\n", spaces, "", mConfig.sample_rate); 150599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 151599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- channel mask: %08x\n", 1527281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi spaces, "", mConfig.channel_mask); 153599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 154599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- is soundtrigger: %s\n", 155599c758b258cc5da0dba9b530425381facc37d77Eric Laurent spaces, "", mIsSoundTrigger ? "true" : "false"); 156599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 157599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- open count: %d\n", spaces, "", mOpenCount); 158599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 159599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- active count: %d\n", spaces, "", mActiveCount); 160599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 161599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 162599c758b258cc5da0dba9b530425381facc37d77Eric Laurent write(fd, result.string(), result.size()); 163599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return NO_ERROR; 164599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 165599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 166599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioSessionCollection::addSession(audio_session_t session, 1678c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const sp<AudioSession>& audioSession, 1688c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi AudioSessionInfoProvider *provider) 169599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 170599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ssize_t index = indexOfKey(session); 171599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 172599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (index >= 0) { 173599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGW("addSession() session %d already in", session); 174599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return ALREADY_EXISTS; 175599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 1768c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi audioSession->setInfoProvider(provider); 177599c758b258cc5da0dba9b530425381facc37d77Eric Laurent add(session, audioSession); 178599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGV("addSession() session %d client %d source %d", 179599c758b258cc5da0dba9b530425381facc37d77Eric Laurent session, audioSession->uid(), audioSession->inputSource()); 180599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return NO_ERROR; 181599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 182599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 183599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioSessionCollection::removeSession(audio_session_t session) 184599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 185599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ssize_t index = indexOfKey(session); 186599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 187599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (index < 0) { 188599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGW("removeSession() session %d not in", session); 189599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return ALREADY_EXISTS; 190599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 191599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGV("removeSession() session %d", session); 1928c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi valueAt(index)->setInfoProvider(NULL); 193599c758b258cc5da0dba9b530425381facc37d77Eric Laurent removeItemsAt(index); 194599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return NO_ERROR; 195599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 196599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 197599c758b258cc5da0dba9b530425381facc37d77Eric Laurentuint32_t AudioSessionCollection::getOpenCount() const 198599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 199599c758b258cc5da0dba9b530425381facc37d77Eric Laurent uint32_t openCount = 0; 200599c758b258cc5da0dba9b530425381facc37d77Eric Laurent for (size_t i = 0; i < size(); i++) { 201599c758b258cc5da0dba9b530425381facc37d77Eric Laurent openCount += valueAt(i)->openCount(); 202599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 203599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return openCount; 204599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 205599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 206599c758b258cc5da0dba9b530425381facc37d77Eric LaurentAudioSessionCollection AudioSessionCollection::getActiveSessions() const 207599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 208599c758b258cc5da0dba9b530425381facc37d77Eric Laurent AudioSessionCollection activeSessions; 209599c758b258cc5da0dba9b530425381facc37d77Eric Laurent for (size_t i = 0; i < size(); i++) { 210599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (valueAt(i)->activeCount() != 0) { 211599c758b258cc5da0dba9b530425381facc37d77Eric Laurent activeSessions.add(valueAt(i)->session(), valueAt(i)); 212599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 213599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 214599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return activeSessions; 215599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 216599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 217599c758b258cc5da0dba9b530425381facc37d77Eric Laurentbool AudioSessionCollection::hasActiveSession() const 218599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 219232f26f8b673973ffa463f80b08b731ffacc8785Eric Laurent return getActiveSessions().size() != 0; 220599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 221599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 222599c758b258cc5da0dba9b530425381facc37d77Eric Laurentbool AudioSessionCollection::isSourceActive(audio_source_t source) const 223599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 224599c758b258cc5da0dba9b530425381facc37d77Eric Laurent for (size_t i = 0; i < size(); i++) { 225599c758b258cc5da0dba9b530425381facc37d77Eric Laurent const sp<AudioSession> audioSession = valueAt(i); 226599c758b258cc5da0dba9b530425381facc37d77Eric Laurent // AUDIO_SOURCE_HOTWORD is equivalent to AUDIO_SOURCE_VOICE_RECOGNITION only if it 227599c758b258cc5da0dba9b530425381facc37d77Eric Laurent // corresponds to an active capture triggered by a hardware hotword recognition 228599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (audioSession->activeCount() > 0 && 229599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ((audioSession->inputSource() == source) || 230599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ((source == AUDIO_SOURCE_VOICE_RECOGNITION) && 231599c758b258cc5da0dba9b530425381facc37d77Eric Laurent (audioSession->inputSource() == AUDIO_SOURCE_HOTWORD) && 232599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audioSession->isSoundTrigger()))) { 233599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return true; 234599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 235599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 236599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return false; 237599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 238599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 2398c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivivoid AudioSessionCollection::onSessionInfoUpdate() const 2408c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi{ 2418c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi for (size_t i = 0; i < size(); i++) { 2428c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi valueAt(i)->onSessionInfoUpdate(); 2438c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi } 2448c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi} 2458c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi 246599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 247599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioSessionCollection::dump(int fd, int spaces) const 248599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 249599c758b258cc5da0dba9b530425381facc37d77Eric Laurent const size_t SIZE = 256; 250599c758b258cc5da0dba9b530425381facc37d77Eric Laurent char buffer[SIZE]; 251599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*sAudio Sessions:\n", spaces, ""); 252599c758b258cc5da0dba9b530425381facc37d77Eric Laurent write(fd, buffer, strlen(buffer)); 253599c758b258cc5da0dba9b530425381facc37d77Eric Laurent for (size_t i = 0; i < size(); i++) { 254599c758b258cc5da0dba9b530425381facc37d77Eric Laurent valueAt(i)->dump(fd, spaces + 2, i); 255599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 256599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return NO_ERROR; 257599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 258599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 259599c758b258cc5da0dba9b530425381facc37d77Eric Laurent}; // namespace android 260