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 17ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#pragma once 18ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie 1998cc191247388132b6fd8a4ecd07abd6e4c5a0edFrançois Gaffie#include "DeviceDescriptor.h" 20cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie#include "AudioRoute.h" 21ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include <utils/RefBase.h> 22ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include <utils/String8.h> 23ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include <utils/Errors.h> 24ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include <utils/Vector.h> 25ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include <system/audio.h> 26ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include <cutils/config_utils.h> 27a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie#include <string> 28ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie 2956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivinamespace android { 3056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 31ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffieclass IOProfile; 32a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffieclass InputProfile; 33a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffieclass OutputProfile; 34a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 35a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffietypedef Vector<sp<IOProfile> > InputProfileCollection; 36a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffietypedef Vector<sp<IOProfile> > OutputProfileCollection; 37a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffietypedef Vector<sp<IOProfile> > IOProfileCollection; 38ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie 3956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Triviclass HwModule : public RefBase 4056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi{ 4156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivipublic: 429ee0540d3a61bff03d561ca431a371c3d9335d2bMikhail Naganov explicit HwModule(const char *name, uint32_t halVersionMajor = 0, uint32_t halVersionMinor = 0); 4356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi ~HwModule(); 4456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 45a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie const char *getName() const { return mName.string(); } 46a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 47a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 48a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie const DeviceVector &getDeclaredDevices() const { return mDeclaredDevices; } 49cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie void setDeclaredDevices(const DeviceVector &devices); 50a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 51a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie const InputProfileCollection &getInputProfiles() const { return mInputProfiles; } 52a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 53a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie const OutputProfileCollection &getOutputProfiles() const { return mOutputProfiles; } 54a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 55a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie void setProfiles(const IOProfileCollection &profiles); 56a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 579ee0540d3a61bff03d561ca431a371c3d9335d2bMikhail Naganov void setHalVersion(uint32_t major, uint32_t minor) { 589ee0540d3a61bff03d561ca431a371c3d9335d2bMikhail Naganov mHalVersion = (major << 8) | (minor & 0xff); 599ee0540d3a61bff03d561ca431a371c3d9335d2bMikhail Naganov } 609ee0540d3a61bff03d561ca431a371c3d9335d2bMikhail Naganov uint32_t getHalVersionMajor() const { return mHalVersion >> 8; } 619ee0540d3a61bff03d561ca431a371c3d9335d2bMikhail Naganov uint32_t getHalVersionMinor() const { return mHalVersion & 0xff; } 62a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 63cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie sp<DeviceDescriptor> getRouteSinkDevice(const sp<AudioRoute> &route) const; 64cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie DeviceVector getRouteSourceDevices(const sp<AudioRoute> &route) const; 65cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie void setRoutes(const AudioRouteVector &routes); 66cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie 67a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie status_t addOutputProfile(const sp<IOProfile> &profile); 68a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie status_t addInputProfile(const sp<IOProfile> &profile); 69a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie status_t addProfile(const sp<IOProfile> &profile); 7056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 71e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh status_t addOutputProfile(const String8& name, const audio_config_t *config, 72e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh audio_devices_t device, const String8& address); 73e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh status_t removeOutputProfile(const String8& name); 74e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh status_t addInputProfile(const String8& name, const audio_config_t *config, 75e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh audio_devices_t device, const String8& address); 76e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh status_t removeInputProfile(const String8& name); 7756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 7853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie audio_module_handle_t getHandle() const { return mHandle; } 7953615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 80cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie sp<AudioPort> findPortByTagName(const String8 &tagName) const 81cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie { 82cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie return mPorts.findByTagName(tagName); 83cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie } 84cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie 85a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie // TODO remove from here (split serialization) 8656ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi void dump(int fd); 8756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 88a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie const String8 mName; // base name of the audio HW module (primary, a2dp ...) 89a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie audio_module_handle_t mHandle; 90a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie OutputProfileCollection mOutputProfiles; // output profiles exposed by this module 91a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie InputProfileCollection mInputProfiles; // input profiles exposed by this module 92a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 93a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffieprivate: 94cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie void refreshSupportedDevices(); 95cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie 96a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie uint32_t mHalVersion; // audio HAL API version 97a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie DeviceVector mDeclaredDevices; // devices declared in audio_policy configuration file. 98cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie AudioRouteVector mRoutes; 99cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie AudioPortVector mPorts; 10056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi}; 10156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 102a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffieclass HwModuleCollection : public Vector<sp<HwModule> > 10353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie{ 10453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffiepublic: 10553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie sp<HwModule> getModuleFromName(const char *name) const; 10653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 107a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie sp<HwModule> getModuleForDevice(audio_devices_t device) const; 10853615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 109a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie sp<DeviceDescriptor> getDeviceDescriptor(const audio_devices_t device, 110a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie const char *device_address, 111634b71478742310960f3fdb4241e70a0735712c4Eric Laurent const char *device_name, 112634b71478742310960f3fdb4241e70a0735712c4Eric Laurent bool matchAdress = true) const; 11353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 11453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie status_t dump(int fd) const; 11553615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie}; 11653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 11756ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi}; // namespace android 118