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