156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi/* 256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * Copyright (C) 2015 The Android Open Source Project 356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * 456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * you may not use this file except in compliance with the License. 656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * You may obtain a copy of the License at 756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * 856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * 1056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 1156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 1256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * See the License for the specific language governing permissions and 1456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi * limitations under the License. 1556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi */ 1656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 1756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi#define LOG_TAG "APM::AudioInputDescriptor" 1856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi//#define LOG_NDEBUG 0 1956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 20ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include "AudioInputDescriptor.h" 21ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include "IOProfile.h" 2298cc191247388132b6fd8a4ecd07abd6e4c5a0edFrançois Gaffie#include "AudioGain.h" 23ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include "HwModule.h" 24ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include <media/AudioPolicy.h> 2553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie#include <policy.h> 2656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 2756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivinamespace android { 2856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 2956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel TriviAudioInputDescriptor::AudioInputDescriptor(const sp<IOProfile>& profile) 30322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent : mIoHandle(0), 318c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mDevice(AUDIO_DEVICE_NONE), mPolicyMix(NULL), 32a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten mProfile(profile), mPatchHandle(AUDIO_PATCH_HANDLE_NONE), mId(0) 3356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi{ 3456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi if (profile != NULL) { 35112b0af826aeca45855690b9c105b2cdf9938bbeFrançois Gaffie profile->pickAudioProfile(mSamplingRate, mChannelMask, mFormat); 3656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi if (profile->mGains.size() > 0) { 3756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi profile->mGains[0]->getDefaultConfig(&mGain); 3856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi } 3956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi } 4056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi} 4156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 4298cc191247388132b6fd8a4ecd07abd6e4c5a0edFrançois Gaffievoid AudioInputDescriptor::setIoHandle(audio_io_handle_t ioHandle) 4398cc191247388132b6fd8a4ecd07abd6e4c5a0edFrançois Gaffie{ 4498cc191247388132b6fd8a4ecd07abd6e4c5a0edFrançois Gaffie mId = AudioPort::getNextUniqueId(); 4598cc191247388132b6fd8a4ecd07abd6e4c5a0edFrançois Gaffie mIoHandle = ioHandle; 4698cc191247388132b6fd8a4ecd07abd6e4c5a0edFrançois Gaffie} 4798cc191247388132b6fd8a4ecd07abd6e4c5a0edFrançois Gaffie 4853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffieaudio_module_handle_t AudioInputDescriptor::getModuleHandle() const 4953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie{ 50322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent if (mProfile == 0) { 51a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kasten return AUDIO_MODULE_HANDLE_NONE; 52322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent } 5353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie return mProfile->getModuleHandle(); 5453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie} 5553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 5665bfe916ca972b95f41d7f6cc2566c2e12a3eadaJean-Michel Triviuint32_t AudioInputDescriptor::getOpenRefCount() const 5765bfe916ca972b95f41d7f6cc2566c2e12a3eadaJean-Michel Trivi{ 58599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return mSessions.getOpenCount(); 5965bfe916ca972b95f41d7f6cc2566c2e12a3eadaJean-Michel Trivi} 6065bfe916ca972b95f41d7f6cc2566c2e12a3eadaJean-Michel Trivi 61322b4d25387a04c9afebe998326d005bbdf17edeEric Laurentaudio_port_handle_t AudioInputDescriptor::getId() const 62322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent{ 63322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent return mId; 64322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent} 65322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent 66bb9480975322b0d1a09f76ef14f3285fc8af4e5fEric Laurentaudio_source_t AudioInputDescriptor::inputSource(bool activeOnly) const 67599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 68bb9480975322b0d1a09f76ef14f3285fc8af4e5fEric Laurent return getHighestPrioritySource(activeOnly); 69599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 70599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 7153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffievoid AudioInputDescriptor::toAudioPortConfig(struct audio_port_config *dstConfig, 7253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie const struct audio_port_config *srcConfig) const 7356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi{ 7456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi ALOG_ASSERT(mProfile != 0, 7556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi "toAudioPortConfig() called on input with null profile %d", mIoHandle); 7656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi dstConfig->config_mask = AUDIO_PORT_CONFIG_SAMPLE_RATE|AUDIO_PORT_CONFIG_CHANNEL_MASK| 7756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi AUDIO_PORT_CONFIG_FORMAT|AUDIO_PORT_CONFIG_GAIN; 7856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi if (srcConfig != NULL) { 7956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi dstConfig->config_mask |= srcConfig->config_mask; 8056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi } 8156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 8256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi AudioPortConfig::toAudioPortConfig(dstConfig, srcConfig); 8356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 8456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi dstConfig->id = mId; 8556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi dstConfig->role = AUDIO_PORT_ROLE_SINK; 8656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi dstConfig->type = AUDIO_PORT_TYPE_MIX; 87322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent dstConfig->ext.mix.hw_module = getModuleHandle(); 8856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi dstConfig->ext.mix.handle = mIoHandle; 89599c758b258cc5da0dba9b530425381facc37d77Eric Laurent dstConfig->ext.mix.usecase.source = inputSource(); 9056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi} 9156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 9253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffievoid AudioInputDescriptor::toAudioPort(struct audio_port *port) const 9356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi{ 9456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi ALOG_ASSERT(mProfile != 0, "toAudioPort() called on input with null profile %d", mIoHandle); 9556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 9656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi mProfile->toAudioPort(port); 9756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi port->id = mId; 9856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi toAudioPortConfig(&port->active_config); 99322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent port->ext.mix.hw_module = getModuleHandle(); 10056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi port->ext.mix.handle = mIoHandle; 10156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi port->ext.mix.latency_class = AUDIO_LATENCY_NORMAL; 10256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi} 10356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 10464265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurentvoid AudioInputDescriptor::setPreemptedSessions(const SortedVector<audio_session_t>& sessions) 10564265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent{ 10664265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent mPreemptedSessions = sessions; 10764265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent} 10864265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent 10964265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric LaurentSortedVector<audio_session_t> AudioInputDescriptor::getPreemptedSessions() const 11064265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent{ 11164265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent return mPreemptedSessions; 11264265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent} 11364265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent 11464265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurentbool AudioInputDescriptor::hasPreemptedSession(audio_session_t session) const 11564265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent{ 11664265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent return (mPreemptedSessions.indexOf(session) >= 0); 11764265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent} 11864265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent 11964265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurentvoid AudioInputDescriptor::clearPreemptedSessions() 12064265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent{ 12164265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent mPreemptedSessions.clear(); 12264265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent} 12364265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent 124599c758b258cc5da0dba9b530425381facc37d77Eric Laurentbool AudioInputDescriptor::isActive() const { 125599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return mSessions.hasActiveSession(); 126599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 127599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 128599c758b258cc5da0dba9b530425381facc37d77Eric Laurentbool AudioInputDescriptor::isSourceActive(audio_source_t source) const 129599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 130599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return mSessions.isSourceActive(source); 131599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 132599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 133fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurentaudio_source_t AudioInputDescriptor::getHighestPrioritySource(bool activeOnly) const 134fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent{ 135fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent 136fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent return mSessions.getHighestPrioritySource(activeOnly); 137fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent} 138fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent 139599c758b258cc5da0dba9b530425381facc37d77Eric Laurentbool AudioInputDescriptor::isSoundTrigger() const { 140599c758b258cc5da0dba9b530425381facc37d77Eric Laurent // sound trigger and non sound trigger sessions are not mixed 141599c758b258cc5da0dba9b530425381facc37d77Eric Laurent // on a given input 142599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return mSessions.valueAt(0)->isSoundTrigger(); 143599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 144599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 145599c758b258cc5da0dba9b530425381facc37d77Eric Laurentsp<AudioSession> AudioInputDescriptor::getAudioSession( 146599c758b258cc5da0dba9b530425381facc37d77Eric Laurent audio_session_t session) const { 147599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return mSessions.valueFor(session); 148599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 149599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 150fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric LaurentAudioSessionCollection AudioInputDescriptor::getAudioSessions(bool activeOnly) const 151599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{ 152fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent if (activeOnly) { 153fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent return mSessions.getActiveSessions(); 154fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent } else { 155fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent return mSessions; 156fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent } 157599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 158599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 15956afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivisize_t AudioInputDescriptor::getAudioSessionCount(bool activeOnly) const 16056afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi{ 16156afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi if (activeOnly) { 16256afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi return mSessions.getActiveSessionCount(); 16356afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi } else { 16456afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi return mSessions.size(); 16556afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi } 16656afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi} 16756afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi 168599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioInputDescriptor::addAudioSession(audio_session_t session, 169599c758b258cc5da0dba9b530425381facc37d77Eric Laurent const sp<AudioSession>& audioSession) { 1708c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi return mSessions.addSession(session, audioSession, /*AudioSessionInfoProvider*/this); 171599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 172599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 173599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioInputDescriptor::removeAudioSession(audio_session_t session) { 174599c758b258cc5da0dba9b530425381facc37d77Eric Laurent return mSessions.removeSession(session); 175599c758b258cc5da0dba9b530425381facc37d77Eric Laurent} 176599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 177a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kastenaudio_patch_handle_t AudioInputDescriptor::getPatchHandle() const 1788c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi{ 1798c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi return mPatchHandle; 1808c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi} 1818c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi 1828c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivivoid AudioInputDescriptor::setPatchHandle(audio_patch_handle_t handle) 1838c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi{ 1848c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mPatchHandle = handle; 1858c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi mSessions.onSessionInfoUpdate(); 1868c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi} 1878c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi 1888c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Triviaudio_config_base_t AudioInputDescriptor::getConfig() const 1898c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi{ 1908c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi const audio_config_base_t config = { .sample_rate = mSamplingRate, .channel_mask = mChannelMask, 1918c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi .format = mFormat }; 1928c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi return config; 1938c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi} 1948c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi 19556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivistatus_t AudioInputDescriptor::dump(int fd) 19656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi{ 19756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi const size_t SIZE = 256; 19856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi char buffer[SIZE]; 19956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi String8 result; 20056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 201322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent snprintf(buffer, SIZE, " ID: %d\n", getId()); 20256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi result.append(buffer); 20356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi snprintf(buffer, SIZE, " Sampling rate: %d\n", mSamplingRate); 20456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi result.append(buffer); 20556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi snprintf(buffer, SIZE, " Format: %d\n", mFormat); 20656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi result.append(buffer); 20756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi snprintf(buffer, SIZE, " Channels: %08x\n", mChannelMask); 20856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi result.append(buffer); 20956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi snprintf(buffer, SIZE, " Devices %08x\n", mDevice); 21056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi result.append(buffer); 21156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 21256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi write(fd, result.string(), result.size()); 21356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 214599c758b258cc5da0dba9b530425381facc37d77Eric Laurent mSessions.dump(fd, 1); 215599c758b258cc5da0dba9b530425381facc37d77Eric Laurent 21656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi return NO_ERROR; 21756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi} 21856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 21953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffiebool AudioInputCollection::isSourceActive(audio_source_t source) const 22053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie{ 22153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie for (size_t i = 0; i < size(); i++) { 22253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie const sp<AudioInputDescriptor> inputDescriptor = valueAt(i); 223599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if (inputDescriptor->isSourceActive(source)) { 22453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie return true; 22553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie } 22653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie } 22753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie return false; 22853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie} 22953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 23053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffiesp<AudioInputDescriptor> AudioInputCollection::getInputFromId(audio_port_handle_t id) const 23153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie{ 23253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie sp<AudioInputDescriptor> inputDesc = NULL; 23353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie for (size_t i = 0; i < size(); i++) { 23453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie inputDesc = valueAt(i); 235322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent if (inputDesc->getId() == id) { 23653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie break; 23753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie } 23853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie } 23953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie return inputDesc; 24053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie} 24153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 242271a93e924f46ccaf3f76a8fc38685afea40d3eeEric Laurentuint32_t AudioInputCollection::activeInputsCountOnDevices(audio_devices_t devices) const 24353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie{ 24453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie uint32_t count = 0; 24553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie for (size_t i = 0; i < size(); i++) { 246599c758b258cc5da0dba9b530425381facc37d77Eric Laurent const sp<AudioInputDescriptor> inputDescriptor = valueAt(i); 247271a93e924f46ccaf3f76a8fc38685afea40d3eeEric Laurent if (inputDescriptor->isActive() && 248271a93e924f46ccaf3f76a8fc38685afea40d3eeEric Laurent ((devices == AUDIO_DEVICE_IN_DEFAULT) || 249271a93e924f46ccaf3f76a8fc38685afea40d3eeEric Laurent ((inputDescriptor->mDevice & devices & ~AUDIO_DEVICE_BIT_IN) != 0))) { 25053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie count++; 25153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie } 25253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie } 25353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie return count; 25453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie} 25553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 256fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric LaurentVector<sp <AudioInputDescriptor> > AudioInputCollection::getActiveInputs(bool ignoreVirtualInputs) 25753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie{ 258fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent Vector<sp <AudioInputDescriptor> > activeInputs; 259fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent 26053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie for (size_t i = 0; i < size(); i++) { 261599c758b258cc5da0dba9b530425381facc37d77Eric Laurent const sp<AudioInputDescriptor> inputDescriptor = valueAt(i); 262599c758b258cc5da0dba9b530425381facc37d77Eric Laurent if ((inputDescriptor->isActive()) 263599c758b258cc5da0dba9b530425381facc37d77Eric Laurent && (!ignoreVirtualInputs || 264599c758b258cc5da0dba9b530425381facc37d77Eric Laurent !is_virtual_input_device(inputDescriptor->mDevice))) { 265fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent activeInputs.add(inputDescriptor); 26653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie } 26753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie } 268fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent return activeInputs; 26953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie} 27053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 27153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffieaudio_devices_t AudioInputCollection::getSupportedDevices(audio_io_handle_t handle) const 27253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie{ 27353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie sp<AudioInputDescriptor> inputDesc = valueFor(handle); 274a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie audio_devices_t devices = inputDesc->mProfile->getSupportedDevicesType(); 27553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie return devices; 27653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie} 27753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 27853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffiestatus_t AudioInputCollection::dump(int fd) const 27953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie{ 28053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie const size_t SIZE = 256; 28153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie char buffer[SIZE]; 28253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 28353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie snprintf(buffer, SIZE, "\nInputs dump:\n"); 28453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie write(fd, buffer, strlen(buffer)); 28553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie for (size_t i = 0; i < size(); i++) { 28653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie snprintf(buffer, SIZE, "- Input %d dump:\n", keyAt(i)); 28753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie write(fd, buffer, strlen(buffer)); 28853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie valueAt(i)->dump(fd); 28953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie } 29053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 29153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie return NO_ERROR; 29253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie} 29353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 29456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi}; //namespace android 295