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