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
66599c758b258cc5da0dba9b530425381facc37d77Eric Laurentaudio_source_t AudioInputDescriptor::inputSource() const
67599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{
68599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    // TODO: return highest priority input source
69599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    return mSessions.size() > 0 ? mSessions.valueAt(0)->inputSource() :
70599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                       AUDIO_SOURCE_DEFAULT;
71599c758b258cc5da0dba9b530425381facc37d77Eric Laurent}
72599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
7353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffievoid AudioInputDescriptor::toAudioPortConfig(struct audio_port_config *dstConfig,
7453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie                                             const struct audio_port_config *srcConfig) const
7556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi{
7656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    ALOG_ASSERT(mProfile != 0,
7756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi                "toAudioPortConfig() called on input with null profile %d", mIoHandle);
7856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    dstConfig->config_mask = AUDIO_PORT_CONFIG_SAMPLE_RATE|AUDIO_PORT_CONFIG_CHANNEL_MASK|
7956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi                            AUDIO_PORT_CONFIG_FORMAT|AUDIO_PORT_CONFIG_GAIN;
8056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    if (srcConfig != NULL) {
8156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi        dstConfig->config_mask |= srcConfig->config_mask;
8256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    }
8356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
8456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    AudioPortConfig::toAudioPortConfig(dstConfig, srcConfig);
8556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
8656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    dstConfig->id = mId;
8756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    dstConfig->role = AUDIO_PORT_ROLE_SINK;
8856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    dstConfig->type = AUDIO_PORT_TYPE_MIX;
89322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    dstConfig->ext.mix.hw_module = getModuleHandle();
9056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    dstConfig->ext.mix.handle = mIoHandle;
91599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    dstConfig->ext.mix.usecase.source = inputSource();
9256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi}
9356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
9453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffievoid AudioInputDescriptor::toAudioPort(struct audio_port *port) const
9556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi{
9656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    ALOG_ASSERT(mProfile != 0, "toAudioPort() called on input with null profile %d", mIoHandle);
9756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
9856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    mProfile->toAudioPort(port);
9956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    port->id = mId;
10056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    toAudioPortConfig(&port->active_config);
101322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    port->ext.mix.hw_module = getModuleHandle();
10256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    port->ext.mix.handle = mIoHandle;
10356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    port->ext.mix.latency_class = AUDIO_LATENCY_NORMAL;
10456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi}
10556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
10664265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurentvoid AudioInputDescriptor::setPreemptedSessions(const SortedVector<audio_session_t>& sessions)
10764265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent{
10864265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent    mPreemptedSessions = sessions;
10964265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent}
11064265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent
11164265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric LaurentSortedVector<audio_session_t> AudioInputDescriptor::getPreemptedSessions() const
11264265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent{
11364265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent    return mPreemptedSessions;
11464265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent}
11564265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent
11664265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurentbool AudioInputDescriptor::hasPreemptedSession(audio_session_t session) const
11764265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent{
11864265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent    return (mPreemptedSessions.indexOf(session) >= 0);
11964265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent}
12064265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent
12164265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurentvoid AudioInputDescriptor::clearPreemptedSessions()
12264265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent{
12364265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent    mPreemptedSessions.clear();
12464265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent}
12564265b2fb8f5be63b6c2ad4fcbec9acf74705bc4Eric Laurent
126599c758b258cc5da0dba9b530425381facc37d77Eric Laurentbool AudioInputDescriptor::isActive() const {
127599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    return mSessions.hasActiveSession();
128599c758b258cc5da0dba9b530425381facc37d77Eric Laurent}
129599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
130599c758b258cc5da0dba9b530425381facc37d77Eric Laurentbool AudioInputDescriptor::isSourceActive(audio_source_t source) const
131599c758b258cc5da0dba9b530425381facc37d77Eric Laurent{
132599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    return mSessions.isSourceActive(source);
133599c758b258cc5da0dba9b530425381facc37d77Eric Laurent}
134599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
135599c758b258cc5da0dba9b530425381facc37d77Eric Laurentbool AudioInputDescriptor::isSoundTrigger() const {
136599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    // sound trigger and non sound trigger sessions are not mixed
137599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    // on a given input
138599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    return mSessions.valueAt(0)->isSoundTrigger();
139599c758b258cc5da0dba9b530425381facc37d77Eric Laurent}
140599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
141599c758b258cc5da0dba9b530425381facc37d77Eric Laurentsp<AudioSession> AudioInputDescriptor::getAudioSession(
142599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                                              audio_session_t session) const {
143599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    return mSessions.valueFor(session);
144599c758b258cc5da0dba9b530425381facc37d77Eric Laurent}
145599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
146232f26f8b673973ffa463f80b08b731ffacc8785Eric LaurentAudioSessionCollection AudioInputDescriptor::getActiveAudioSessions() const
14756afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi{
148232f26f8b673973ffa463f80b08b731ffacc8785Eric Laurent    return mSessions.getActiveSessions();
14956afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi}
15056afc7a5cc0f0bfc8021f6413b2e2267050bdc8aJean-Michel Trivi
151599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioInputDescriptor::addAudioSession(audio_session_t session,
152599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                         const sp<AudioSession>& audioSession) {
1538c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    return mSessions.addSession(session, audioSession, /*AudioSessionInfoProvider*/this);
154599c758b258cc5da0dba9b530425381facc37d77Eric Laurent}
155599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
156599c758b258cc5da0dba9b530425381facc37d77Eric Laurentstatus_t AudioInputDescriptor::removeAudioSession(audio_session_t session) {
157599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    return mSessions.removeSession(session);
158599c758b258cc5da0dba9b530425381facc37d77Eric Laurent}
159599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
160a13cde98a880341f0a56d91da6364b093fb5d24eGlenn Kastenaudio_patch_handle_t AudioInputDescriptor::getPatchHandle() const
1618c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi{
1628c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    return mPatchHandle;
1638c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi}
1648c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi
1658c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivivoid AudioInputDescriptor::setPatchHandle(audio_patch_handle_t handle)
1668c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi{
1678c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    mPatchHandle = handle;
1688c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    mSessions.onSessionInfoUpdate();
1698c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi}
1708c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi
1718c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Triviaudio_config_base_t AudioInputDescriptor::getConfig() const
1728c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi{
1738c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    const audio_config_base_t config = { .sample_rate = mSamplingRate, .channel_mask = mChannelMask,
1748c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi            .format = mFormat };
1758c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi    return config;
1768c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi}
1778c7cf3b7d0d7bccb9affbc34ae2ab2d6b332f972Jean-Michel Trivi
17856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivistatus_t AudioInputDescriptor::dump(int fd)
17956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi{
18056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    const size_t SIZE = 256;
18156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    char buffer[SIZE];
18256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    String8 result;
18356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
184322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent    snprintf(buffer, SIZE, " ID: %d\n", getId());
18556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    result.append(buffer);
18656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    snprintf(buffer, SIZE, " Sampling rate: %d\n", mSamplingRate);
18756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    result.append(buffer);
18856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    snprintf(buffer, SIZE, " Format: %d\n", mFormat);
18956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    result.append(buffer);
19056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    snprintf(buffer, SIZE, " Channels: %08x\n", mChannelMask);
19156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    result.append(buffer);
19256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    snprintf(buffer, SIZE, " Devices %08x\n", mDevice);
19356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    result.append(buffer);
19456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
19556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    write(fd, result.string(), result.size());
19656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
197599c758b258cc5da0dba9b530425381facc37d77Eric Laurent    mSessions.dump(fd, 1);
198599c758b258cc5da0dba9b530425381facc37d77Eric Laurent
19956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi    return NO_ERROR;
20056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi}
20156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi
20253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffiebool AudioInputCollection::isSourceActive(audio_source_t source) const
20353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie{
20453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    for (size_t i = 0; i < size(); i++) {
20553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie        const sp<AudioInputDescriptor>  inputDescriptor = valueAt(i);
206599c758b258cc5da0dba9b530425381facc37d77Eric Laurent        if (inputDescriptor->isSourceActive(source)) {
20753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie            return true;
20853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie        }
20953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    }
21053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    return false;
21153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie}
21253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie
21353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffiesp<AudioInputDescriptor> AudioInputCollection::getInputFromId(audio_port_handle_t id) const
21453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie{
21553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    sp<AudioInputDescriptor> inputDesc = NULL;
21653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    for (size_t i = 0; i < size(); i++) {
21753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie        inputDesc = valueAt(i);
218322b4d25387a04c9afebe998326d005bbdf17edeEric Laurent        if (inputDesc->getId() == id) {
21953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie            break;
22053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie        }
22153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    }
22253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    return inputDesc;
22353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie}
22453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie
22553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffieuint32_t AudioInputCollection::activeInputsCount() const
22653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie{
22753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    uint32_t count = 0;
22853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    for (size_t i = 0; i < size(); i++) {
229599c758b258cc5da0dba9b530425381facc37d77Eric Laurent        const sp<AudioInputDescriptor>  inputDescriptor = valueAt(i);
230599c758b258cc5da0dba9b530425381facc37d77Eric Laurent        if (inputDescriptor->isActive()) {
23153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie            count++;
23253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie        }
23353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    }
23453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    return count;
23553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie}
23653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie
237232f26f8b673973ffa463f80b08b731ffacc8785Eric Laurentaudio_io_handle_t AudioInputCollection::getActiveInput(bool ignoreVirtualInputs)
23853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie{
23953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    for (size_t i = 0; i < size(); i++) {
240599c758b258cc5da0dba9b530425381facc37d77Eric Laurent        const sp<AudioInputDescriptor>  inputDescriptor = valueAt(i);
241599c758b258cc5da0dba9b530425381facc37d77Eric Laurent        if ((inputDescriptor->isActive())
242599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                && (!ignoreVirtualInputs ||
243599c758b258cc5da0dba9b530425381facc37d77Eric Laurent                    !is_virtual_input_device(inputDescriptor->mDevice))) {
244232f26f8b673973ffa463f80b08b731ffacc8785Eric Laurent            return keyAt(i);
24553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie        }
24653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    }
247232f26f8b673973ffa463f80b08b731ffacc8785Eric Laurent    return 0;
24853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie}
24953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie
25053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffieaudio_devices_t AudioInputCollection::getSupportedDevices(audio_io_handle_t handle) const
25153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie{
25253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    sp<AudioInputDescriptor> inputDesc = valueFor(handle);
253a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie    audio_devices_t devices = inputDesc->mProfile->getSupportedDevicesType();
25453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    return devices;
25553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie}
25653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie
25753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffiestatus_t AudioInputCollection::dump(int fd) const
25853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie{
25953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    const size_t SIZE = 256;
26053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    char buffer[SIZE];
26153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie
26253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    snprintf(buffer, SIZE, "\nInputs dump:\n");
26353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    write(fd, buffer, strlen(buffer));
26453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    for (size_t i = 0; i < size(); i++) {
26553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie        snprintf(buffer, SIZE, "- Input %d dump:\n", keyAt(i));
26653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie        write(fd, buffer, strlen(buffer));
26753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie        valueAt(i)->dump(fd);
26853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    }
26953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie
27053615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie    return NO_ERROR;
27153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie}
27253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie
27356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi}; //namespace android
274