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> 21fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent#include "policy.h" 22599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#include "AudioSession.h" 23599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#include "AudioGain.h" 24599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#include "TypeConverter.h" 2560d02077d86d2d1092443519290101f503aa6f7aMark Salyzyn 26e74bbf18a6595a914d3c771be08a72077465c51fMark Salyzyn#include <log/log.h> 27599c758b258cc5da0dba9b530425381facc37d77Eric Laurent#include <utils/String8.h> 28599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 29599c758b258cc5da0dba9b530425381facc37d77Eric Laurentnamespace android { 30599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 31599c758b258cc5da0dba9b530425381facc37d77Eric LaurentAudioSession::AudioSession(audio_session_t session, 32599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audio_source_t inputSource, 33599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audio_format_t format, 34599c758b258cc5da0dba9b530425381facc37d77Eric Laurent uint32_t sampleRate, 35599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audio_channel_mask_t channelMask, 36599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audio_input_flags_t flags, 37599c758b258cc5da0dba9b530425381facc37d77Eric Laurent uid_t uid, 382f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi bool isSoundTrigger, 392f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi AudioMix* policyMix, 402f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi AudioPolicyClientInterface *clientInterface) : 41599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mSession(session), mInputSource(inputSource), 427281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi mConfig({ .format = format, .sample_rate = sampleRate, .channel_mask = channelMask}), 43599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mFlags(flags), mUid(uid), mIsSoundTrigger(isSoundTrigger), 448c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mOpenCount(1), mActiveCount(0), mPolicyMix(policyMix), mClientInterface(clientInterface), 458c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mInfoProvider(NULL) 46599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 47599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 48599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 49599c758b258cc5da0dba9b530425381facc37d77Eric Laurentuint32_t AudioSession::changeOpenCount(int delta) 50599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 51599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if ((delta + (int)mOpenCount) < 0) { 52599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGW("%s invalid delta %d, open count %d", 53599c758b258cc5da0dba9b530425381facc37d77Eric Laurent __FUNCTION__, delta, mOpenCount); 54599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mOpenCount = (uint32_t)(-delta); 55599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 56599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mOpenCount += delta; 57599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGV("%s open count %d", __FUNCTION__, mOpenCount); 58599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return mOpenCount; 59599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 60599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 61599c758b258cc5da0dba9b530425381facc37d77Eric Laurentuint32_t AudioSession::changeActiveCount(int delta) 62599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 632f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi const uint32_t oldActiveCount = mActiveCount; 64599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if ((delta + (int)mActiveCount) < 0) { 65599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGW("%s invalid delta %d, active count %d", 66599c758b258cc5da0dba9b530425381facc37d77Eric Laurent __FUNCTION__, delta, mActiveCount); 67599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mActiveCount = (uint32_t)(-delta); 68599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 69599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mActiveCount += delta; 70599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGV("%s active count %d", __FUNCTION__, mActiveCount); 718c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi int event = RECORD_CONFIG_EVENT_NONE; 722f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi 732f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi if ((oldActiveCount == 0) && (mActiveCount > 0)) { 748c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi event = RECORD_CONFIG_EVENT_START; 752f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi } else if ((oldActiveCount > 0) && (mActiveCount == 0)) { 768c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi event = RECORD_CONFIG_EVENT_STOP; 778c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi } 788c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi 798c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi if (event != RECORD_CONFIG_EVENT_NONE) { 808c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi // Dynamic policy callback: 812f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi // if input maps to a dynamic policy with an activity listener, notify of state change 822f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi if ((mPolicyMix != NULL) && ((mPolicyMix->mCbFlags & AudioMix::kCbFlagNotifyActivity) != 0)) 832f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi { 847638ca29e8400a19524adb982e9d22c02786de82Jean-Michel Trivi mClientInterface->onDynamicPolicyMixStateUpdate(mPolicyMix->mDeviceAddress, 858c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi (event == RECORD_CONFIG_EVENT_START) ? MIX_STATE_MIXING : MIX_STATE_IDLE); 862f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi } 878c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi 888c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi // Recording configuration callback: 898c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const AudioSessionInfoProvider* provider = mInfoProvider; 908c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_config_base_t deviceConfig = (provider != NULL) ? provider->getConfig() : 918c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi AUDIO_CONFIG_BASE_INITIALIZER; 928c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_patch_handle_t patchHandle = (provider != NULL) ? provider->getPatchHandle() : 938c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi AUDIO_PATCH_HANDLE_NONE; 9438f86713cbd22caae9fdd4ac2f0bb76ff91df34dJean-Michel Trivi if (patchHandle != AUDIO_PATCH_HANDLE_NONE) { 9538f86713cbd22caae9fdd4ac2f0bb76ff91df34dJean-Michel Trivi mClientInterface->onRecordingConfigurationUpdate(event, mSession, mInputSource, 9638f86713cbd22caae9fdd4ac2f0bb76ff91df34dJean-Michel Trivi &mConfig, &deviceConfig, patchHandle); 9738f86713cbd22caae9fdd4ac2f0bb76ff91df34dJean-Michel Trivi } 982f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi } 992f4fe9f7df8f22c6bc8745407d19df73128810ecJean-Michel Trivi 100599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return mActiveCount; 101599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 102599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 103599c758b258cc5da0dba9b530425381facc37d77Eric Laurentbool AudioSession::matches(const sp<AudioSession> &other) const 104599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 105599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (other->session() == mSession && 106599c758b258cc5da0dba9b530425381facc37d77Eric Laurent other->inputSource() == mInputSource && 1077281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi other->format() == mConfig.format && 1087281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi other->sampleRate() == mConfig.sample_rate && 1097281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi other->channelMask() == mConfig.channel_mask && 110599c758b258cc5da0dba9b530425381facc37d77Eric Laurent other->flags() == mFlags && 111599c758b258cc5da0dba9b530425381facc37d77Eric Laurent other->uid() == mUid) { 112599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return true; 113599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 114599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return false; 115599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 116599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 1178c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivivoid AudioSession::setInfoProvider(AudioSessionInfoProvider *provider) 1188c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi{ 1198c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mInfoProvider = provider; 1208c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi} 1218c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi 1228c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivivoid AudioSession::onSessionInfoUpdate() const 1238c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi{ 1248c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi if (mActiveCount > 0) { 1258c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi // resend the callback after requerying the informations from the info provider 1268c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const AudioSessionInfoProvider* provider = mInfoProvider; 1278c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_config_base_t deviceConfig = (provider != NULL) ? provider->getConfig() : 1288c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi AUDIO_CONFIG_BASE_INITIALIZER; 1298c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_patch_handle_t patchHandle = (provider != NULL) ? provider->getPatchHandle() : 1308c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi AUDIO_PATCH_HANDLE_NONE; 13138f86713cbd22caae9fdd4ac2f0bb76ff91df34dJean-Michel Trivi if (patchHandle != AUDIO_PATCH_HANDLE_NONE) { 13238f86713cbd22caae9fdd4ac2f0bb76ff91df34dJean-Michel Trivi mClientInterface->onRecordingConfigurationUpdate(RECORD_CONFIG_EVENT_START, 13338f86713cbd22caae9fdd4ac2f0bb76ff91df34dJean-Michel Trivi mSession, mInputSource, 13438f86713cbd22caae9fdd4ac2f0bb76ff91df34dJean-Michel Trivi &mConfig, &deviceConfig, patchHandle); 13538f86713cbd22caae9fdd4ac2f0bb76ff91df34dJean-Michel Trivi } 1368c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi } 1377281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi} 138599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 139599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioSession::dump(int fd, int spaces, int index) const 140599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 141599c758b258cc5da0dba9b530425381facc37d77Eric Laurent const size_t SIZE = 256; 142599c758b258cc5da0dba9b530425381facc37d77Eric Laurent char buffer[SIZE]; 143599c758b258cc5da0dba9b530425381facc37d77Eric Laurent String8 result; 144599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 145599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*sAudio session %d:\n", spaces, "", index+1); 146599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 147599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- session: %2d\n", spaces, "", mSession); 148599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 149599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- owner uid: %2d\n", spaces, "", mUid); 150599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 151599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- input source: %d\n", spaces, "", mInputSource); 152599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 1537281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi snprintf(buffer, SIZE, "%*s- format: %08x\n", spaces, "", mConfig.format); 154599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 1557281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi snprintf(buffer, SIZE, "%*s- sample: %d\n", spaces, "", mConfig.sample_rate); 156599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 157599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- channel mask: %08x\n", 1587281aa9810b33eff47b00104db26c97c77931611Jean-Michel Trivi spaces, "", mConfig.channel_mask); 159599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 160599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- is soundtrigger: %s\n", 161599c758b258cc5da0dba9b530425381facc37d77Eric Laurent spaces, "", mIsSoundTrigger ? "true" : "false"); 162599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 163599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- open count: %d\n", spaces, "", mOpenCount); 164599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 165599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*s- active count: %d\n", spaces, "", mActiveCount); 166599c758b258cc5da0dba9b530425381facc37d77Eric Laurent result.append(buffer); 167599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 168599c758b258cc5da0dba9b530425381facc37d77Eric Laurent write(fd, result.string(), result.size()); 169599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return NO_ERROR; 170599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 171599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 172599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioSessionCollection::addSession(audio_session_t session, 1738c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const sp<AudioSession>& audioSession, 1748c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi AudioSessionInfoProvider *provider) 175599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 176599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ssize_t index = indexOfKey(session); 177599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 178599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (index >= 0) { 179599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGW("addSession() session %d already in", session); 180599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return ALREADY_EXISTS; 181599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 1828c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi audioSession->setInfoProvider(provider); 183599c758b258cc5da0dba9b530425381facc37d77Eric Laurent add(session, audioSession); 184599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGV("addSession() session %d client %d source %d", 185599c758b258cc5da0dba9b530425381facc37d77Eric Laurent session, audioSession->uid(), audioSession->inputSource()); 186599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return NO_ERROR; 187599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 188599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 189599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioSessionCollection::removeSession(audio_session_t session) 190599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 191599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ssize_t index = indexOfKey(session); 192599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 193599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (index < 0) { 194599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGW("removeSession() session %d not in", session); 195599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return ALREADY_EXISTS; 196599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 197599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ALOGV("removeSession() session %d", session); 1988c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi valueAt(index)->setInfoProvider(NULL); 199599c758b258cc5da0dba9b530425381facc37d77Eric Laurent removeItemsAt(index); 200599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return NO_ERROR; 201599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 202599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 203599c758b258cc5da0dba9b530425381facc37d77Eric Laurentuint32_t AudioSessionCollection::getOpenCount() const 204599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 205599c758b258cc5da0dba9b530425381facc37d77Eric Laurent uint32_t openCount = 0; 206599c758b258cc5da0dba9b530425381facc37d77Eric Laurent for (size_t i = 0; i < size(); i++) { 207599c758b258cc5da0dba9b530425381facc37d77Eric Laurent openCount += valueAt(i)->openCount(); 208599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 209599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return openCount; 210599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 211599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 212599c758b258cc5da0dba9b530425381facc37d77Eric LaurentAudioSessionCollection AudioSessionCollection::getActiveSessions() const 213599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 214599c758b258cc5da0dba9b530425381facc37d77Eric Laurent AudioSessionCollection activeSessions; 215599c758b258cc5da0dba9b530425381facc37d77Eric Laurent for (size_t i = 0; i < size(); i++) { 216599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (valueAt(i)->activeCount() != 0) { 217599c758b258cc5da0dba9b530425381facc37d77Eric Laurent activeSessions.add(valueAt(i)->session(), valueAt(i)); 218599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 219599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 220599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return activeSessions; 221599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 222599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 22356afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivisize_t AudioSessionCollection::getActiveSessionCount() const 22456afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi{ 22556afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi size_t activeCount = 0; 22656afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi for (size_t i = 0; i < size(); i++) { 22756afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi if (valueAt(i)->activeCount() != 0) { 22856afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi activeCount++; 22956afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi } 23056afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi } 23156afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi return activeCount; 23256afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi} 23356afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi 234599c758b258cc5da0dba9b530425381facc37d77Eric Laurentbool AudioSessionCollection::hasActiveSession() const 235599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 23656afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi return getActiveSessionCount() != 0; 237599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 238599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 239599c758b258cc5da0dba9b530425381facc37d77Eric Laurentbool AudioSessionCollection::isSourceActive(audio_source_t source) const 240599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 241599c758b258cc5da0dba9b530425381facc37d77Eric Laurent for (size_t i = 0; i < size(); i++) { 242599c758b258cc5da0dba9b530425381facc37d77Eric Laurent const sp<AudioSession> audioSession = valueAt(i); 243599c758b258cc5da0dba9b530425381facc37d77Eric Laurent // AUDIO_SOURCE_HOTWORD is equivalent to AUDIO_SOURCE_VOICE_RECOGNITION only if it 244599c758b258cc5da0dba9b530425381facc37d77Eric Laurent // corresponds to an active capture triggered by a hardware hotword recognition 245599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (audioSession->activeCount() > 0 && 246599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ((audioSession->inputSource() == source) || 247599c758b258cc5da0dba9b530425381facc37d77Eric Laurent ((source == AUDIO_SOURCE_VOICE_RECOGNITION) && 248599c758b258cc5da0dba9b530425381facc37d77Eric Laurent (audioSession->inputSource() == AUDIO_SOURCE_HOTWORD) && 249599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audioSession->isSoundTrigger()))) { 250599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return true; 251599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 252599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 253599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return false; 254599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 255599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 256fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurentaudio_source_t AudioSessionCollection::getHighestPrioritySource(bool activeOnly) const 257fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent{ 258fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent audio_source_t source = AUDIO_SOURCE_DEFAULT; 259fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent int32_t priority = -1; 260fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent 261fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent for (size_t i = 0; i < size(); i++) { 262fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent const sp<AudioSession> audioSession = valueAt(i); 263fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent if (activeOnly && audioSession->activeCount() == 0) { 264fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent continue; 265fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent } 266fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent int32_t curPriority = source_priority(audioSession->inputSource()); 267fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent if (curPriority > priority) { 268fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent priority = curPriority; 269fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent source = audioSession->inputSource(); 270fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent } 271fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent } 272fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent return source; 273fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent} 274599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 2758c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivivoid AudioSessionCollection::onSessionInfoUpdate() const 2768c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi{ 2778c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi for (size_t i = 0; i < size(); i++) { 2788c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi valueAt(i)->onSessionInfoUpdate(); 2798c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi } 2808c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi} 2818c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi 282599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioSessionCollection::dump(int fd, int spaces) const 283599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 284599c758b258cc5da0dba9b530425381facc37d77Eric Laurent const size_t SIZE = 256; 285599c758b258cc5da0dba9b530425381facc37d77Eric Laurent char buffer[SIZE]; 286599c758b258cc5da0dba9b530425381facc37d77Eric Laurent snprintf(buffer, SIZE, "%*sAudio Sessions:\n", spaces, ""); 287599c758b258cc5da0dba9b530425381facc37d77Eric Laurent write(fd, buffer, strlen(buffer)); 288599c758b258cc5da0dba9b530425381facc37d77Eric Laurent for (size_t i = 0; i < size(); i++) { 289599c758b258cc5da0dba9b530425381facc37d77Eric Laurent valueAt(i)->dump(fd, spaces + 2, i); 290599c758b258cc5da0dba9b530425381facc37d77Eric Laurent } 291599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return NO_ERROR; 292599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 293599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 294599c758b258cc5da0dba9b530425381facc37d77Eric Laurent}; // namespace android 295