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" 21a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie#include <hardware/audio.h> 22ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include <utils/RefBase.h> 23ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include <utils/String8.h> 24ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include <utils/Errors.h> 25ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include <utils/Vector.h> 26ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include <system/audio.h> 27ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie#include <cutils/config_utils.h> 28a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie#include <string> 29ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie 3056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivinamespace android { 3156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 32ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffieclass IOProfile; 33a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffieclass InputProfile; 34a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffieclass OutputProfile; 35a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 36a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffietypedef Vector<sp<IOProfile> > InputProfileCollection; 37a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffietypedef Vector<sp<IOProfile> > OutputProfileCollection; 38a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffietypedef Vector<sp<IOProfile> > IOProfileCollection; 39ad3183e2d4cecd02f6261270a7ea1c68be0efa0fFrançois Gaffie 4056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Triviclass HwModule : public RefBase 4156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi{ 4256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivipublic: 43a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie HwModule(const char *name, uint32_t halVersion = AUDIO_DEVICE_API_VERSION_MIN); 4456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi ~HwModule(); 4556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 46a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie const char *getName() const { return mName.string(); } 47a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 48a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 49a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie const DeviceVector &getDeclaredDevices() const { return mDeclaredDevices; } 50cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie void setDeclaredDevices(const DeviceVector &devices); 51a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 52a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie const InputProfileCollection &getInputProfiles() const { return mInputProfiles; } 53a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 54a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie const OutputProfileCollection &getOutputProfiles() const { return mOutputProfiles; } 55a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 56a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie void setProfiles(const IOProfileCollection &profiles); 57a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 58a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie void setHalVersion(uint32_t halVersion) { mHalVersion = halVersion; } 59a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie uint32_t getHalVersion() const { return mHalVersion; } 60a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 61cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie sp<DeviceDescriptor> getRouteSinkDevice(const sp<AudioRoute> &route) const; 62cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie DeviceVector getRouteSourceDevices(const sp<AudioRoute> &route) const; 63cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie void setRoutes(const AudioRouteVector &routes); 64cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie 65a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie status_t addOutputProfile(const sp<IOProfile> &profile); 66a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie status_t addInputProfile(const sp<IOProfile> &profile); 67a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie status_t addProfile(const sp<IOProfile> &profile); 6856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 6956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi status_t addOutputProfile(String8 name, const audio_config_t *config, 7056ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi audio_devices_t device, String8 address); 7156ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi status_t removeOutputProfile(String8 name); 7256ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi status_t addInputProfile(String8 name, const audio_config_t *config, 7356ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi audio_devices_t device, String8 address); 7456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi status_t removeInputProfile(String8 name); 7556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 7653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie audio_module_handle_t getHandle() const { return mHandle; } 7753615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 78cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie sp<AudioPort> findPortByTagName(const String8 &tagName) const 79cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie { 80cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie return mPorts.findByTagName(tagName); 81cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie } 82cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie 83a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie // TODO remove from here (split serialization) 8456ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi void dump(int fd); 8556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 86a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie const String8 mName; // base name of the audio HW module (primary, a2dp ...) 87a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie audio_module_handle_t mHandle; 88a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie OutputProfileCollection mOutputProfiles; // output profiles exposed by this module 89a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie InputProfileCollection mInputProfiles; // input profiles exposed by this module 90a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie 91a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffieprivate: 92cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie void refreshSupportedDevices(); 93cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie 94a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie uint32_t mHalVersion; // audio HAL API version 95a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie DeviceVector mDeclaredDevices; // devices declared in audio_policy configuration file. 96cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie AudioRouteVector mRoutes; 97cbb3044d6bfa9ab30c83b67874f40344e29805e1François Gaffie AudioPortVector mPorts; 9856ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi}; 9956ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi 100a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffieclass HwModuleCollection : public Vector<sp<HwModule> > 10153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie{ 10253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffiepublic: 10353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie sp<HwModule> getModuleFromName(const char *name) const; 10453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 105a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie sp<HwModule> getModuleForDevice(audio_devices_t device) const; 10653615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 107a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie sp<DeviceDescriptor> getDeviceDescriptor(const audio_devices_t device, 108a8ecc2c72ca26389bd6b0162181d60aaeaca8149François Gaffie const char *device_address, 109634b71478742310960f3fdb4241e70a0735712c4Eric Laurent const char *device_name, 110634b71478742310960f3fdb4241e70a0735712c4Eric Laurent bool matchAdress = true) const; 11153615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 11253615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie status_t dump(int fd) const; 11353615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie}; 11453615e29c99c5e9d2ca77aaefd7bf5c770513120François Gaffie 11556ec4ffcbae8aeac6c5245fc7b825d02e2e6cefdJean-Michel Trivi}; // namespace android 116