DeviceDescriptor.cpp revision a8ecc2c72ca26389bd6b0162181d60aaeaca8149
1f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin/*
2f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin * Copyright (C) 2015 The Android Open Source Project
3f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin *
4f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin * Licensed under the Apache License, Version 2.0 (the "License");
5f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin * you may not use this file except in compliance with the License.
6f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin * You may obtain a copy of the License at
7f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin *
8f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin *      http://www.apache.org/licenses/LICENSE-2.0
9f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin *
10f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin * Unless required by applicable law or agreed to in writing, software
11f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin * distributed under the License is distributed on an "AS IS" BASIS,
12f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin * See the License for the specific language governing permissions and
14f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin * limitations under the License.
15f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin */
16f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
17f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin#define LOG_TAG "APM::Devices"
18f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin//#define LOG_NDEBUG 0
19f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
20f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin#include "DeviceDescriptor.h"
21f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin#include "TypeConverter.h"
22f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin#include "AudioGain.h"
23f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin#include "HwModule.h"
24f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
25f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Linnamespace android {
26f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
27f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung LinDeviceDescriptor::DeviceDescriptor(audio_devices_t type) :
28f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    AudioPort(String8(""), AUDIO_PORT_TYPE_DEVICE,
29f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin              audio_is_output_device(type) ? AUDIO_PORT_ROLE_SINK :
30f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin                                             AUDIO_PORT_ROLE_SOURCE),
31f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    mTag(""), mAddress(""), mDeviceType(type), mId(0)
32f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin{
33f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
34f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin}
35f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
3647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Linaudio_port_handle_t DeviceDescriptor::getId() const
37f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin{
3847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    return mId;
3947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin}
4047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin
4147c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Linvoid DeviceDescriptor::attach(const sp<HwModule>& module)
42f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin{
43c7c9cf164cc58d03156a53be35e58c3b75871a23Ruei-sung Lin    AudioPort::attach(module);
44c7c9cf164cc58d03156a53be35e58c3b75871a23Ruei-sung Lin    mId = getNextUniqueId();
45c7c9cf164cc58d03156a53be35e58c3b75871a23Ruei-sung Lin}
4647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin
4747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Linbool DeviceDescriptor::equals(const sp<DeviceDescriptor>& other) const
4847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin{
49f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    // Devices are considered equal if they:
50f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    // - are of the same type (a device type cannot be AUDIO_DEVICE_NONE)
51f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    // - have the same address or one device does not specify the address
52f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    // - have the same channel mask or one device does not specify the channel mask
53f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    if (other == 0) {
54f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        return false;
551253e9fb0b5570ab8adaed222655a5b052aa072eRuei-sung Lin    }
5647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    return (mDeviceType == other->mDeviceType) &&
5747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin           (mAddress == "" || other->mAddress == "" || mAddress == other->mAddress) &&
5847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin           (mChannelMask == 0 || other->mChannelMask == 0 ||
5947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin                mChannelMask == other->mChannelMask);
6047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin}
6147c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin
6247c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Linvoid DeviceVector::refreshTypes()
6347c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin{
6447c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    mDeviceTypes = AUDIO_DEVICE_NONE;
6547c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    for(size_t i = 0; i < size(); i++) {
6647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        mDeviceTypes |= itemAt(i)->type();
6747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    }
6847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    ALOGV("DeviceVector::refreshTypes() mDeviceTypes %08x", mDeviceTypes);
6947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin}
7047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin
7147c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Linssize_t DeviceVector::indexOf(const sp<DeviceDescriptor>& item) const
7247c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin{
7347c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    for(size_t i = 0; i < size(); i++) {
7447c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        if (item->equals(itemAt(i))) {
7547c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin            return i;
7647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        }
7747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    }
7847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    return -1;
7947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin}
8047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin
8147c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Linvoid DeviceVector::add(const DeviceVector &devices)
8247c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin{
83f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    for (size_t i = 0; i < devices.size(); i++) {
84f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        sp<DeviceDescriptor> device = devices.itemAt(i);
85f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        if (indexOf(device) < 0 && SortedVector::add(device) >= 0) {
86f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            refreshTypes();
87f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        }
88f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    }
89f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin}
90f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
91f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Linssize_t DeviceVector::add(const sp<DeviceDescriptor>& item)
92f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin{
9347c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    ssize_t ret = indexOf(item);
94f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
95f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    if (ret < 0) {
96f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        ret = SortedVector::add(item);
97f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        if (ret >= 0) {
98f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            refreshTypes();
99f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        }
100f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    } else {
101f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        ALOGW("DeviceVector::add device %08x already in", item->type());
102f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        ret = -1;
103f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    }
104f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    return ret;
105f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin}
106f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
107f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Linssize_t DeviceVector::remove(const sp<DeviceDescriptor>& item)
108f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin{
109f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    size_t i;
110f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    ssize_t ret = indexOf(item);
1111253e9fb0b5570ab8adaed222655a5b052aa072eRuei-sung Lin
1121253e9fb0b5570ab8adaed222655a5b052aa072eRuei-sung Lin    if (ret < 0) {
113f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        ALOGW("DeviceVector::remove device %08x not in", item->type());
114f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    } else {
115f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        ret = SortedVector::removeAt(ret);
116f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        if (ret >= 0) {
117f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            refreshTypes();
118f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        }
119f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    }
120f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    return ret;
121f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin}
122f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
12347c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Linaudio_devices_t DeviceVector::getDevicesFromHwModule(audio_module_handle_t moduleHandle) const
124f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin{
125f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    audio_devices_t devices = AUDIO_DEVICE_NONE;
12647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    for (size_t i = 0; i < size(); i++) {
12747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        if (itemAt(i)->getModuleHandle() == moduleHandle) {
12847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin            devices |= itemAt(i)->type();
12947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        }
13047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    }
13147c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    return devices;
13247c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin}
13347c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin
13447c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Linsp<DeviceDescriptor> DeviceVector::getDevice(audio_devices_t type, String8 address) const
13547c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin{
13647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    sp<DeviceDescriptor> device;
13747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    for (size_t i = 0; i < size(); i++) {
13847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        if (itemAt(i)->type() == type) {
13947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin            if (address == "" || itemAt(i)->mAddress == address) {
14047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin                device = itemAt(i);
141f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin                if (itemAt(i)->mAddress == address) {
142f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin                    break;
143f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin                }
144f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            }
145f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        }
14647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    }
14747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    ALOGV("DeviceVector::getDevice() for type %08x address %s found %p",
14847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin          type, address.string(), device.get());
14947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    return device;
15047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin}
15147c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin
15247c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Linsp<DeviceDescriptor> DeviceVector::getDeviceFromId(audio_port_handle_t id) const
15347c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin{
15447c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    sp<DeviceDescriptor> device;
15547c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    for (size_t i = 0; i < size(); i++) {
15647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        if (itemAt(i)->getId() == id) {
15747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin            device = itemAt(i);
15847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin            break;
15947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        }
16047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    }
16147c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    return device;
16247c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin}
16347c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin
16447c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung LinDeviceVector DeviceVector::getDevicesFromType(audio_devices_t type) const
16547c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin{
16647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    DeviceVector devices;
16747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    bool isOutput = audio_is_output_devices(type);
16847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    type &= ~AUDIO_DEVICE_BIT_IN;
16947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    for (size_t i = 0; (i < size()) && (type != AUDIO_DEVICE_NONE); i++) {
17047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        bool curIsOutput = audio_is_output_devices(itemAt(i)->mDeviceType);
17147c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        audio_devices_t curType = itemAt(i)->mDeviceType & ~AUDIO_DEVICE_BIT_IN;
17247c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        if ((isOutput == curIsOutput) && ((type & curType) != 0)) {
17347c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin            devices.add(itemAt(i));
17447c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin            type &= ~curType;
17547c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin            ALOGV("DeviceVector::getDevicesFromType() for type %x found %p",
17647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin                  itemAt(i)->type(), itemAt(i).get());
17747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        }
17847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    }
17947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    return devices;
18047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin}
18147c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin
182f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung LinDeviceVector DeviceVector::getDevicesFromTypeAddr(
183f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        audio_devices_t type, String8 address) const
184f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin{
18578a66d98346a69f65e9d38bb0c96a5418c007197Ruei-sung Lin    DeviceVector devices;
18647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    for (size_t i = 0; i < size(); i++) {
18747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        if (itemAt(i)->type() == type) {
18847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin            if (itemAt(i)->mAddress == address) {
18947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin                devices.add(itemAt(i));
19047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin            }
19147c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        }
19278a66d98346a69f65e9d38bb0c96a5418c007197Ruei-sung Lin    }
19347c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    return devices;
19478a66d98346a69f65e9d38bb0c96a5418c007197Ruei-sung Lin}
19578a66d98346a69f65e9d38bb0c96a5418c007197Ruei-sung Lin
19678a66d98346a69f65e9d38bb0c96a5418c007197Ruei-sung Linsp<DeviceDescriptor> DeviceVector::getDeviceFromTag(const String8& tag) const
197f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin{
19847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    sp<DeviceDescriptor> device;
19947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    for (size_t i = 0; i < size(); i++) {
20047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        if (itemAt(i)->mTag == tag) {
201f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            device = itemAt(i);
202f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin            break;
203f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        }
204f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    }
20547c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    return device;
2061253e9fb0b5570ab8adaed222655a5b052aa072eRuei-sung Lin}
207f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
208f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
209f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Linstatus_t DeviceVector::dump(int fd, const String8 &direction) const
210f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin{
211f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    const size_t SIZE = 256;
212f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    char buffer[SIZE];
213f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
214f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    snprintf(buffer, SIZE, "\n Available %s devices:\n", direction.string());
215f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    write(fd, buffer, strlen(buffer));
21647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    for (size_t i = 0; i < size(); i++) {
21747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        itemAt(i)->dump(fd, 2, i);
21847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    }
21947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    return NO_ERROR;
22047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin}
221f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
222f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Linaudio_policy_dev_state_t DeviceVector::getDeviceConnectionState(const sp<DeviceDescriptor> &devDesc) const
223f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin{
22447c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    ssize_t index = indexOf(devDesc);
22547c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    return index >= 0 ? AUDIO_POLICY_DEVICE_STATE_AVAILABLE : AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
22647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin}
22747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin
2281253e9fb0b5570ab8adaed222655a5b052aa072eRuei-sung Linvoid DeviceDescriptor::toAudioPortConfig(struct audio_port_config *dstConfig,
2291253e9fb0b5570ab8adaed222655a5b052aa072eRuei-sung Lin                                         const struct audio_port_config *srcConfig) const
2301253e9fb0b5570ab8adaed222655a5b052aa072eRuei-sung Lin{
2311253e9fb0b5570ab8adaed222655a5b052aa072eRuei-sung Lin    dstConfig->config_mask = AUDIO_PORT_CONFIG_CHANNEL_MASK|AUDIO_PORT_CONFIG_GAIN;
23247c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    if (srcConfig != NULL) {
23347c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        dstConfig->config_mask |= srcConfig->config_mask;
23447c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    }
23547c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin
23647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    AudioPortConfig::toAudioPortConfig(dstConfig, srcConfig);
23747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin
23847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    dstConfig->id = mId;
23947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    dstConfig->role = audio_is_output_device(mDeviceType) ?
24047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin                        AUDIO_PORT_ROLE_SINK : AUDIO_PORT_ROLE_SOURCE;
241f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    dstConfig->type = AUDIO_PORT_TYPE_DEVICE;
24247c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    dstConfig->ext.device.type = mDeviceType;
24347c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin
24447c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    //TODO Understand why this test is necessary. i.e. why at boot time does it crash
24547c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    // without the test?
24647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    // This has been demonstrated to NOT be true (at start up)
24747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    // ALOG_ASSERT(mModule != NULL);
24847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    dstConfig->ext.device.hw_module = mModule != 0 ? mModule->mHandle : AUDIO_IO_HANDLE_NONE;
24947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    strncpy(dstConfig->ext.device.address, mAddress.string(), AUDIO_DEVICE_MAX_ADDRESS_LEN);
25047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin}
25147c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin
252f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Linvoid DeviceDescriptor::toAudioPort(struct audio_port *port) const
253f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin{
254f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    ALOGV("DeviceDescriptor::toAudioPort() handle %d type %x", mId, mDeviceType);
255f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    AudioPort::toAudioPort(port);
25647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    port->id = mId;
25747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    toAudioPortConfig(&port->active_config);
258f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    port->ext.device.type = mDeviceType;
259f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    port->ext.device.hw_module = mModule->mHandle;
260f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    strncpy(port->ext.device.address, mAddress.string(), AUDIO_DEVICE_MAX_ADDRESS_LEN);
261f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin}
262f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
263f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Linvoid DeviceDescriptor::importAudioPort(const sp<AudioPort> port) {
264f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    AudioPort::importAudioPort(port);
26547c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    mSamplingRate = port->pickSamplingRate();
26647c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    mFormat = port->pickFormat();
26747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    mChannelMask = port->pickChannelMask();
26847c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin}
269f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
270f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Linstatus_t DeviceDescriptor::dump(int fd, int spaces, int index) const
271f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin{
272f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    const size_t SIZE = 256;
273f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    char buffer[SIZE];
274f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    String8 result;
27547c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin
276f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    snprintf(buffer, SIZE, "%*sDevice %d:\n", spaces, "", index+1);
27747c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    result.append(buffer);
278f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    if (mId != 0) {
27947c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        snprintf(buffer, SIZE, "%*s- id: %2d\n", spaces, "", mId);
28047c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin        result.append(buffer);
28147c0dc05cde9e9d9cc57e1393429006bf8b23b32Ruei-sung Lin    }
282f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    std::string deviceLiteral;
2831253e9fb0b5570ab8adaed222655a5b052aa072eRuei-sung Lin    if (DeviceConverter::toString(mDeviceType, deviceLiteral)) {
2841253e9fb0b5570ab8adaed222655a5b052aa072eRuei-sung Lin        snprintf(buffer, SIZE, "%*s- type: %-48s\n", spaces, "", deviceLiteral.c_str());
2851253e9fb0b5570ab8adaed222655a5b052aa072eRuei-sung Lin        result.append(buffer);
2861253e9fb0b5570ab8adaed222655a5b052aa072eRuei-sung Lin    }
287f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    if (mAddress.size() != 0) {
288f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        snprintf(buffer, SIZE, "%*s- address: %-32s\n", spaces, "", mAddress.string());
289f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin        result.append(buffer);
290f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    }
291f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    write(fd, result.string(), result.size());
292f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    AudioPort::dump(fd, spaces);
293f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
294f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    return NO_ERROR;
295f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin}
296f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
297f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Linvoid DeviceDescriptor::log() const
2981253e9fb0b5570ab8adaed222655a5b052aa072eRuei-sung Lin{
299f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    std::string device;
300f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    DeviceConverter::toString(mDeviceType, device);
301f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    ALOGI("Device id:%d type:0x%X:%s, addr:%s", mId,  mDeviceType, device.c_str(),
302f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin          mAddress.string());
303f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
304f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin    AudioPort::log("  ");
305f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin}
306f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin
307f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin}; // namespace android
308f0f78449e8ab7d63894964c54b6ef390ca9ce044Ruei-sung Lin